Zip 包不是由 Terraform 上传到 S3。
Lambda 由 Terraform aws_lambda_function 资源配置。当我在 S3 上更改 Zip 包并运行时terraform apply
命令,Terraform 说没有任何改变。
有source_code_hash
aws_lambda_function 资源中的字段可以设置为包内容的哈希值。但无论我提供的这个哈希值是什么,它都不会在 Terraform 状态下更新。
如果 S3 中的 Zip 包更新,如何告诉 Terraform 更新 Lambda?
经过大量实验来验证 Terraform 如何处理哈希,我发现了以下内容:
-
source_code_hash
在配置 Lambda 时,aws_lambda_function 资源存储在 Terraform 状态中。
-
source_code_hash
仅当您在 aws_lambda_function 资源中为其提供新值并且该新值对应于 S3 中实际 Zip 包的哈希值时才会更新。
所以 Terraform 仅在此时检查 S3 上包的实际哈希码,当我们运行时它不会检查它terraform apply
.
因此,为了使其发挥作用,我们有以下选择:
- 从 S3 下载 Zip 包,计算其哈希值并将其传递给
source_code_hash
aws_lambda_function 资源的字段或
- 使用 aws_s3_bucket_object 资源通过 Terraform 将 Zip 包上传到 S3。放
source_hash
该资源中的字段以将其保存为 Terraform 状态。 aws_lambda_function 资源可以使用该值进行更新。
不幸的是,这种行为没有记录在案,我花了很多时间来发现它。此外,它可以随时更改,因为它没有记录并且没有人知道:-(
那么我是如何解决这个问题的呢?
我生成 Lambda Zip 文件的 base64 编码的 SHA256 哈希值,并将其存储为实际 Zip 文件的元数据。然后我在 Terraform 中读取此元数据并将其传递给source_code_hash
.
Details:
- 使用生成哈希
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]
命令。
- 将哈希值传递给
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
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)