繁体   English   中英

AWS lambda ResourceConflictException 部署

[英]AWS lambda ResourceConflictException on deployment

我们有几个 lambda 函数,我已经使用gradle-aws-plugin-reboot插件自动部署代码。

它适用于除一个lambda 函数之外的所有函数。 在那个特定的那个上,我收到了这个错误:

com.amazonaws.services.lambda.model.ResourceConflictException: The operation cannot be performed at this time. An update is in progress for resource: arn:aws:lambda:*redacted*:the-lambda-that-fails (Service: AWSLambda; Status Code: 409; Error Code: ResourceConflictException; Request ID: 8fef505a-587c-4e77-a257-182d6eecadd0; Proxy: null)

不过,该错误还有一个额外的警告:它只发生在 Jenkins 上。 从我的本地机器运行部署任务是可行的。 我可以通过快速连续地发送垃圾邮件部署在本地重现该问题,在这种情况下,每秒都会失败。 考虑到错误消息,这是可以理解的。

不过,有趣的是,虽然它因相同的错误而失败,但它不会像 jenkins 那样在同一点失败。 当我在本地执行此操作时,它在部署环境时失败,在 jenkins 上它在部署代码时总是失败。 不过,我不确定插件先执行哪一个。 此外,它并不总是在詹金斯身上失败。 很少有这种 lambda 部署成功的情况。 不过,没有任何其他失败的例子。

我知道新的lambda 状态功能,它可能会产生此错误。 但是,由于所有其他 lambda 都可以工作,它们在 build.gradle 和 jenkinsfile 中都使用相同的代码,所以这似乎不太可能成为我的问题。

下面是 gradle 中的部署任务:

   register<jp.classmethod.aws.reboot.gradle.lambda.AWSLambdaMigrateFunctionTask>("deploy") {

        // Create the environment variables from the gradle property configuration.
        // users and passwords should be stored in the system properties file, not the projects!
        val (environmentProperties, function) = if (branch == "master") {
            val webcamServicePutterProd: String by project
            val webcamServicePutterProdPwd: String by project
            mapLambdaProperties("deployProd_", webcamServicePutterProd, webcamServicePutterProdPwd) to
                    "lambda-function-name-prod"
        } else {
            val webcamServicePutterDev: String by project
            val webcamServicePutterDevPwd: String by project
            mapLambdaProperties("deployDev_", webcamServicePutterDev, webcamServicePutterDevPwd) to
                    "lambda-function-name-dev"
        }

        val jarFile = File("build/libs").walk().first { it.name.endsWith("-all.jar") }
        functionName = function
        zipFile = jarFile
        handler = "webcam.yellow.sqs.lambda.WebcamWorker::handleRequest"
        publish = true
        environment = environmentProperties
    }

如前所述,除了属性之外,这在所有 lambda 中几乎是相同的。 不过,属性也不是真正的问题,因为它们在我的本地环境和詹金斯上是相同的。

jenkinsfile 中的部署执行非常不引人注目。 它首先将 jar 上传到 S3 进行存档,然后执行部署 lambda 的 gradle 任务。 可以肯定的是,我尝试不使用 S3 上传以防万一可能有一些模糊的连接,但这也无济于事。

        stage('Deploy artifact') {
            when {
                equals expected: 'true', actual: deployArtifact
            }
            steps {
            // archive build on S3
                withAWS() {
                    s3Upload(
                            workingDir: 'build/libs/',
                            includePathPattern: '*-all.jar',
                            bucket: 'yellow-artifacts',
                            path: "webcam-worker-lambda/${artifactFolder}/"
                    )
                }

                // deploy build to lambda
                sh './gradlew deploy'
            }
        }

我花了几个小时检查不同 lambda 的所有配置,比较它们,寻找可能是问题根源的差异,但我现在几乎不知道问题可能在哪里。 有人有预感吗?

我想到了。 你最好不要把任何东西含在嘴里,因为这太搞笑了!

基本上没有选择,我锁定了此部署与有效部署之间的最后一个明显区别:正在部署的 jar 的文件大小。 失败的是迄今为止最小的。 所以我把它膨胀了大约 60% 以使其与其他所有东西相媲美......并且修复了它!

这听起来很荒谬。 这是我对正在发生的事情的假设:如果上传时间太短,lambda 不知何故需要更长的时间来更改其 state。 我不确定为什么会这样,您希望 state 在事情完成后会发生变化,如果事情完成得更快,则不会花费更长的时间,对吧? 也许 state 的保留时间最短? 我不会知道的。 不过,有一件事可以支持这个假设:从我的本地计算机进行部署总是有效的。 从 aws vpc 内部上传的时间自然会超过 jenkins 需要的时间。 所以这个假设,尽管听起来很荒谬,但却符合我手头的所有事实。

也许对 lambda 内部机制有更好理解的人可以对此添加评论,解释这是如何发生的......

在我的情况下,我在 Lambda 的描述中添加aws:states:opt-out后解决了,如下所述: https://aws.amazon.com/de/blogs/compute/coming-soon-expansion-of -aws-lambda-states-to-all-functions/

ResourceConflictException表示资源已经存在,或者正在进行另一个操作

如果之前的配置更新尚未完成,您将无法调用 Lambda 函数或再次修改它。 如果您确实采取了创建或修改函数之类的操作,并且在此之后不久,而该函数由于先前的操作仍处于 Pending 状态,您可能会遇到此错误。 是关于它的简短描述。

来自GetFunctionConfiguration的响应中的LastUpdateStatusLastUpdateStatusReasonLastUpdateStatusReasonCode字段指示更新何时完成以及函数正在使用新配置处理事件。 有关更多信息,请参阅Lambda 函数状态

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM