当 S3 上的 ZIP 包更改时如何更新 aws_lambda_function Terraform 资源?

nic*_*tev 8 amazon-s3 aws-lambda terraform

Zip 包不是由 Terraform 上传到 S3。
Lambda 由 Terraform aws_lambda_function 资源配置。当我更改 S3 上的 Zip 包并运行terraform apply命令时,Terraform 表示没有任何更改。
aws_lambda_function 资源中有一个source_code_hash字段可以设置为包内容的哈希值。但无论我提供的这个哈希值是什么,它都不会在 Terraform 状态下更新。

如果 S3 中的 Zip 包更新,如何告诉 Terraform 更新 Lambda?

nic*_*tev 9

经过大量实验来验证 Terraform 如何处理哈希,我发现了以下内容:

  1. source_code_hash在配置 Lambda 时,aws_lambda_function 资源存储在 Terraform 状态中。
  2. source_code_hash仅当您在 aws_lambda_function 资源中为其提供新值并且该新值对应于 S3 中实际 Zip 包的哈希值时才会更新。
    所以 Terraform 仅在此时检查 S3 上包的实际哈希码,当我们运行时它不会检查它terraform apply

因此,为了使其发挥作用,我们有以下选择:

  1. 从 S3 下载 Zip 包,计算其哈希值并将其传递到source_code_hashaws_lambda_function 资源的字段或
  2. 使用 aws_s3_bucket_object 资源通过 Terraform 将 Zip 包上传到 S3。设置source_hash该资源中的字段以将其保存为 Terraform 状态。aws_lambda_function 资源可以使用该值进行更新。

不幸的是,这种行为没有记录在案,我花了很多时间来发现它。此外,它可以随时更改,因为它没有记录并且没有人知道:-(

那么我是如何解决这个问题的呢?
我生成 Lambda Zip 文件的 base64 编码的 SHA256 哈希值,并将其存储为实际 Zip 文件的元数据。然后我在 Terraform 中读取此元数据并将其传递给source_code_hash.

细节:

  1. 使用openssl dgst -binary -sha256 lambda_package.zip | openssl base64命令生成哈希。
  2. 在使用命令上传包期间将哈希存储为元数据aws s3 cp lambda_package.zip s3://my-best-bucket/lambda_package.zip --metadata hash=[HASH_VALUE]
  3. 将哈希值传递给source_code_hashTerraform
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
  ...
}
Run Code Online (Sandbox Code Playgroud)