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

2024-04-30

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

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


经过大量实验来验证 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.

Details:

  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_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(使用前将#替换为@)

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

  • 迭代亚马逊S3上文件夹中的对象

    我们有一个应用程序 用户可以创建自己的网页并托管它们 我们使用 S3 来存储静态页面 在这里 由于我们每个用户有 100 个存储桶的限制 我们决定为每个用户使用文件夹桶内的用户 现在 如果用户想在他的域上托管他的网站 我们会向他询问域名 当
  • 通过 API Gateway 使用表单数据将图像发布到 Lambda 函数会导致文件无效

    I ve a 用 Go 编写的 Lambda 函数 https github com mhausenblas imgn blob master functions app uploadimg main go应该允许图像文件上传 通过 HTM
  • Amazon S3 无法通过 Cloudfront 上传文件

    我想通过 Cloudfront 使用签名 URL 将文件上传到 S3 Cloudfront 行为中允许 HTTP PUT 桶策略 Sid 2 Effect Allow Principal AWS arn aws iam cloudfront
  • Spring Cloud AWS 与 Transfermanager:无法完成传输:连接池关闭

    我在用Spring Boot 1 5 1 RELEASE with 春季云AWS 1 1 3 RELEASE将文件上传到 AWS S3 存储桶 我想用转账管理器 http docs aws amazon com AWSJavaSDK lat
  • CORS 与 Amazon S3 和 Cloudfront

    我有一个托管在 Heroku 上的 Rails 应用程序 它使用 CloudFront 以及托管在 S3 上的资产 它完美地显示了资产 尽管需要一些努力 我的 Cloudfront 设置 Forward Headers Whitelist
  • Amazon S3 适合提供视频吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在开发一个网站 其主要功能是播放视频 通常是一个接一个地播放视频 将 MP4 和 WebM 文件存储在 Amazon S3 上 然后使用 HTML
  • 更新AWS S3过期时间

    我想知道如何延长密钥的有效期 我指的不是访问对象的签名 URL 而是密钥本身 我将 AWS 设置为存储桶中的所有对象应在 90 天后过期的规则 在大多数情况下 这就是我希望发生的事情 有时我需要将单个密钥的使用寿命最多再延长 90 天 事实
  • AWS CLI S3API 查找路径中的最新文件夹

    我有一个非常大的桶 数十万个对象 我有一条路径 假设 s3 myBucket path1 path2 path2 获取也是文件夹的上传内容 因此 示例可能如下所示 s3 myBucket path1 path2 v6 1 0 s3 myBu
  • 将文件从 CodeCommit 部署到 S3

    我想将推送到 CodeCommit 存储库中的某些文件部署到 S3 存储桶中 我正在尝试使用存储库上的 Lambda 触发器来执行此操作 但是 我无法获取提交中更改的文件列表 也无法使用 AWS CodeCommit API 从 CodeC
  • S3 存储桶可以生成自己的对象键名称吗?

    我正在将 Amazon API Gateway 配置为 S3 存储桶的代理 理想情况下 我希望客户端能够将文件发布到存储桶 让 S3 为其分配一个文件名 然后在响应中返回该名称 我不想让客户端能够指定文件名 这可能吗 设置代理的文档根本没有
  • AWS Lambda python API 调用方法不返回 JSON - 不可序列化?

    我有一个 Lambda 函数 它是对 API 的基本 Python GET 调用 它在本地运行良好 但是当我上传到 Lambda 以及请求库 时 它不会从 API 调用返回 JSON 响应 我只是希望它将整个 JSON 对象返回给调用者 我
  • 如何通过id获取最近共享的AWS RDS快照?

    我在 AWS RDS 上有 2 个数据库 其中一个用于stage和一个用于production跨 2 个帐户 我正在尝试将数据复制到production to stage每 x 天 我的计划是复制最近的自动备份快照production并分享
  • 使用 AWS API Gateway 和 Lambda 从 multipart/form-data 获取非文件正文

    我正在尝试从multipart form data POST通过 API 网关连接到我的 AWS Lambda Web 服务 超文本传输 协议POST具有内容类型 multipart form data 和 URL 编码的正文 文件数据也在
  • Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket

    我在 Amazon S3 上使用 getObject 和 putObject 请求 并在创建访问存储桶的策略时发现 如果我不允许 listBucket 则会收到 访问被拒绝 错误 这样做的问题是 listBucket 意味着用户可以列出存储
  • 亚马逊 AWS CloudFront 声称不存在这样的存储桶

    我正在尝试设置 CloudFront 来提供图像 但当前无法访问它并返回错误 指定的存储桶不存在
  • 使用 Lambda 函数运行 AWS Athena 的查询

    我在 AWS Athena 上创建了一个表 可以在其中运行任何查询而不会出现任何错误 select from mytestdb test 该表有三列 customer Id product Id price 我尝试创建一个 lambda 函
  • 将 Python 3 与 AWS lambda 结合使用

    可以在 lambda 中使用使用 Python3 构建的应用程序 而不仅仅是 python2 7 可能会考虑周围的选择 https gun io blog announcing zappa serverless python aws lam
  • 如何使用对象标记上传到 AWS S3

    有没有办法使用标签将文件上传到AWS S3 不将标签添加到S3中的现有文件 对象 我需要让该文件与我的 Tags 一起出现在 S3 中 即在单个 API 调用中 我需要这个 因为我使用 Lambda 函数 使用这些 S3 对象标签 由 S3
  • 带有 AWS S3 文件的 Icecast 服务器

    我目前正在运行 Icecast 服务器 用于在 EC2 实例上传输音频 目前我所有的 mp3 文件都存储在 EC2 实例上 我想将它们移动到 AWS S3 进行存储 到目前为止 我已经能够找到能够更新播放列表 https mediareal
  • AWS S3 上传的图像已损坏

    我正在 AWS ec2 ubuntu 机器上工作 我的代码在 cakephp 中 当我尝试将任何图像上传到 AWS S3 时 它都会损坏 虽然它在核心 php 代码中运行良好 这是我的控制器代码 if this gt User gt sav

随机推荐