【问题标题】: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 如何处理哈希,我发现了以下内容:

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

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

    1. 从 S3 下载 Zip 包,计算其哈希并将其传递给 aws_lambda_function 资源的source_code_hash 字段或
    2. Terraform 使用 aws_s3_bucket_object 资源将 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. 在 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
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 2019-07-13
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2017-11-11
      • 2022-10-19
      相关资源
      最近更新 更多