我已经使用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工作流程中都是类似的。(