我们有一个新的地形脚本,它将docker映像推送到AWS Lambda。该脚本运行良好,并正确地将新图像连接到Lambda。我可以通过检查Lambda的AWS控制台中显示的Image URL来确认这一点,它是新推送+连接的映像。但是,在测试lambda时,它显然在运行前面的代码。看起来Lambda已经更新了,但是正在运行的内存实例没有得到消息。
问题:是否有一种方法可以强制内存中的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}}
}
经过更多的搜索,我发现一些讨论(在这里)提到了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:")