Terraform:图像未更新的AWS Lambda



我们有一个新的地形脚本,它将docker映像推送到AWS Lambda。该脚本运行良好,并正确地将新图像连接到Lambda。我可以通过检查Lambda的AWS控制台中显示的Image URL来确认这一点,它是新推送+连接的映像。但是,在测试lambda时,它显然在运行前面的代码。看起来Lambda已经更新了,但是正在运行的内存实例没有得到消息。
问题:是否有一种方法可以强制内存中的lambda循环到新图像?

以下是Lambda的TF代码:
resource "aws_lambda_function" "my_lambda" {
function_name = "MyLambda_${var.environment}"
role          = data.aws_iam_role.iam_for_lambda.arn
image_uri     = "${data.aws_ecr_repository.my_image.repository_url}:latest"
memory_size   = 512
timeout       = 300
architectures = ["x86_64"]
package_type  = "Image"
environment {variables = {stage = var.environment, commit_hash=var.commit_hash}}
}

经过更多的搜索,我发现一些讨论(在这里)提到了Lambda创建块(文档在这里)的terraform中的source_code_hash选项。它主要用于从S3桶中推送代码的zip文件的SHA散列,但在我们的示例中,我们使用的是容器/映像,因此没有真正的文件可以从中获取散列。然而,事实证明它只是Lambda检查更改的字符串。所以我们添加了以下内容:

resource "aws_lambda_function" "my_lambda" {
function_name = "MyLambda_${var.environment}"
role          = data.aws_iam_role.iam_for_lambda.arn
image_uri     = "${data.aws_ecr_repository.my_image.repository_url}:latest"
memory_size   = 512
timeout       = 300
architectures = ["x86_64"]
package_type  = "Image"
environment {variables = {stage = var.environment, commit_hash=var.commit_hash}}
source_code_hash = var.commit_hash  << New line
}

我们使用bitbucket管道将git哈希值注入到tertransformapply操作中。此修复允许Lambda正确更新正在运行的版本。

一个简单的尝试是使用如下代码:

image_uri     = "${repository_url}:${var.pipeline_id}"

gitlab环境中,您可以使用预定义的变量,如pipeline_id作为唯一id,并且它不会在gitlab环境中的任何项目中每次重复,然后将此值传递给您的tf模块。latest标签总是危险的. 如果您正在使用CI/CD,那么应该有一个预定义变量列表,这将派上用场。

这样就不需要为lambda函数使用source_code_hash。另外,将ECR repo设置为immutable。这里不需要,但这是最佳实践。

或者,如果您不想依赖于bitbucket,您可以为ECR图像添加一个数据源:

data "aws_ecr_image" "repo_image" {
repository_name = "repo-name"
image_tag = "tag"
}

然后使用它的id作为源代码散列,像这样:

source_code_hash = trimprefix(data.aws_ecr_image.repo_image.id, "sha256:")

相关内容

  • 没有找到相关文章

最新更新