【问题标题】:How to update aws_lambda_function Terraform resource when ZIP package is changed on S3?在 S3 上更改 ZIP 包时如何更新 aws_lambda_function Terraform 资源?
【发布时间】:2021-11-23 08:37:58
【问题描述】:
Zip 包不是通过 Terraform 上传到 S3。
Lambda 由 Terraform aws_lambda_function 资源提供。当我在 S3 上更改 Zip 包并运行 terraform apply 命令时,Terraform 说没有任何改变。
aws_lambda_function 资源中有 source_code_hash 字段,可以设置为包内容的哈希值。但无论我为这个散列提供什么值,它都不会在 Terraform 状态下更新。
如果在 S3 中更新 Zip 包,如何告诉 Terraform 更新 Lambda?
【问题讨论】:
标签:
amazon-s3
aws-lambda
terraform
【解决方案1】:
经过大量实验验证 Terraform 如何处理哈希,我发现了以下内容:
-
在配置 Lambda 时,aws_lambda_function 资源的
source_code_hash 以 Terraform 状态存储。
-
source_code_hash 仅当您在 aws_lambda_function 资源中为其提供新值并且此新值对应于 S3 中实际 Zip 包的哈希时才会更新。
因此,Terraform 目前只在 S3 上检查包的实际哈希码,当我们运行 terraform apply 时它不会检查它。
因此,为了让它发挥作用,我们有以下选择:
- 从 S3 下载 Zip 包,计算其哈希并将其传递给 aws_lambda_function 资源的
source_code_hash 字段或
- Terraform 使用 aws_s3_bucket_object 资源将 Zip 包上传到 S3。在该资源中设置
source_hash 字段以将其保存为 Terraform 状态。 aws_lambda_function 资源可以使用此值进行更新。
不幸的是,这种行为没有记录在案,我花了很多时间来发现它。此外,它可以随时更改,因为它没有记录,也没有人知道:-(
那么我是如何解决这个问题的呢?
我生成 Lambda Zip 文件的 base64 编码的 SHA256 哈希,并将其存储为实际 Zip 文件的元数据。然后我在 Terraform 中读取此元数据并将其传递给 source_code_hash。
详情:
- 使用
openssl dgst -binary -sha256 lambda_package.zip | openssl base64 命令生成哈希。
- 在上传包期间使用
aws s3 cp lambda_package.zip s3://my-best-bucket/lambda_package.zip --metadata hash=[HASH_VALUE] 命令将哈希存储为元数据。
- 在 Terraform 中将哈希传递给
source_code_hash
data "aws_s3_bucket_object" "package" {
bucket = "my-best-bucket"
key = "lambda_package.zip"
}
resource "aws_lambda_function" "main" {
...
source_code_hash = data.aws_s3_bucket_object.package.metadata.Hash
...
}