使用 Docker 支持的 AWS Lambda 时,如何使用 CLI "deploy new image"?



我已经使用Terraform部署了lambda。它成功地指向ECR,并且图像以预期的ENTRYPOINT运行。然而,每次我向ECR推送新代码时,我都必须转到web控制台,单击";部署新映像";否则lambda将运行旧映像。

同样,我尝试使用:latest作为标记,但似乎没有帮助。我可以通过上传:2:3,然后手动将lambda指向它们来强制创建一个新图像。如果有一种方法可以使用:latest标签,那将是一种很好的便利。

我更乐意用bash或boto来做这件事,但从我对文档的阅读来看,没有明显的方法可以做到这一点。

这个类似的问题被关闭了,因为lambdas过去没有docker图像支持。

使用aws-cli更新lambda函数。

假设您已经在环境中设置了配置文件或适当的凭据,则可以调用aws lambda update-function-code并提供所需的映像uri。由于您已经定义了uri,因此可以查询函数中的值。

aws lambda update-function-code --function-name $MY_FUNC --image-uri $(aws lambda get-function --function-name $MY_FUNC | jq -r '.Code.ImageUri')

我正在使用jq来提取ImageUri,但我相信关于如何进行它,还有很多其他方法和意见。

如果你有一个整体看。从aws lambda get-function --function-name $MY_FUNC返回的代码对象,您可以检查sha256并查看它是否反映了您更新的函数图像。

当前文档:AWS CLI更新功能代码文档

明智的做法是将映像存储与部署过程分开。我建议使用semver对docker映像进行版本控制。https://semver.org/

然后,您可以将lambda docker映像的版本号存储在terraform中的一个变量中,并将其传递给您的lambda模块。

当然,这将是运行terraform apply进行部署的额外步骤,但这将锁定系统的状态,并使再现环境状态变得更容易。

我遇到了这个问题,这是因为我也在使用latest。我的Terraform代码作为GitHub操作工作流中的第二个作业运行,第一个作业构建、推送和标记新图像。因此,解决方案是使用needs上下文输出将标记从第一个作业传递到第二个作业,然后使用-var参数将标记传递到Terraform作业的Plan/Apply步骤:

部署lambda.yml(基于此。(

- name: Terraform Apply
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
run: terraform apply -auto-approve -input=false -var="ECR_IMAGE_TAG=${{ needs.deploy.outputs.image_tag }}"

您也可以在从命令行调用terraform apply时传入变量,如上所述。关键的变化是在我的Terraform代码中。(当然,我还必须声明变量。(

λ.tf

resource "aws_lambda_function" "default" {
function_name = var.project_name
role    = aws_iam_role.lambda.arn
timeout = "180"
package_type = "Image"
image_uri    =  "${data.aws_ecr_repository.repo.repository_url}:${var.ECR_IMAGE_TAG}"
}

现在,每次我推送时,lambda都会通过其标记(GitHub SHA(指向图像的最新版本。

(我知道你可能没有使用GHA,但解决方案在任何IaC/CI工作流程中都是类似的。(

相关内容

  • 没有找到相关文章

最新更新