AWS Lambda 不会等待代码上传到 Terraform 脚本中的 S3 存储桶

Posted

技术标签:

【中文标题】AWS Lambda 不会等待代码上传到 Terraform 脚本中的 S3 存储桶【英文标题】:AWS Lambda doesn't wait for code to be uploaded to S3 bucket in Terraform script 【发布时间】:2020-06-04 17:58:11 【问题描述】:

我有以下 AWS Terraform 配置:

# S3 bucket for Lambda code upload
resource "aws_s3_bucket" "ada-upload" 
    bucket = "ada-upload"
    acl    = "private"


# uploading zipped lambda code to S3
resource "aws_s3_bucket_object" "lambda_code_upload" 
  bucket = aws_s3_bucket.ada-upload.bucket
  key    = "dist.zip"
  source = "dist.zip" 
  etag = filemd5("dist.zip")


# creating lambda function
resource "aws_lambda_function" "ada-lambda-function" 
  function_name = "ada-lambda-function"
  s3_bucket   = aws_s3_bucket.ada-upload.bucket
  s3_key      = "dist.zip" 
  memory_size = 1024
  timeout     = 900
  runtime          = "provided"
  source_code_hash = base64sha256("dist.zip")

基本上,它会创建一个 S3 存储桶,在那里上传代码,然后从该代码创建一个 Lambda。代码是自包含的 .NET 3.1 应用程序,它自带运行时,所以 Zip 相当大,上传需要一些时间。 Lambda 将等待 S3 存储桶创建,但不会等待代码完成上传。所以当我最初运行脚本时,我会得到S3 key "dist.zip" doesn't exist 错误。当我重新运行脚本时 - 因为 zip 已经存在 - 函数创建成功。

有没有办法确保 Lambda 仅在代码完成上传后才开始创建?

【问题讨论】:

使用s3_key = aws_s3_bucket_object.lambda_code_upload.key @ydaetskcoR 事后看来这应该很明显,该死! ;-) 谢谢,您能否将其添加为答案,以便我接受? 【参考方案1】:

免责声明:@ydaetskcoR 的答案是正确的,您应该接受它。但是,另一种方法是修改 lambda 函数,如下所示:

resource "aws_lambda_function" "ada-lambda-function" 
  function_name = "ada-lambda-function"
  s3_bucket   = aws_s3_bucket.ada-upload.bucket
  s3_key      = "dist.zip" 
  memory_size = 1024
  timeout     = 900
  runtime          = "provided"
  source_code_hash = base64sha256("dist.zip")

 depends_on = [
    aws_s3_bucket_object.lambda_code_upload,
  ]

这将强制 terraform 在启动 lambda 之前先等待对象上传到存储桶中。

【讨论】:

Terraform 的一个核心功能是计算相关资源的依赖关系图。当您使用 S3 对象资源的属性时,Terraform 知道 S3 对象需要存在才能使用该属性。在这种情况下没有理由使用depends_on。根据terraform.io/docs/configuration/resources.html,使用depends_on应该只是万不得已

以上是关于AWS Lambda 不会等待代码上传到 Terraform 脚本中的 S3 存储桶的主要内容,如果未能解决你的问题,请参考以下文章

AWS lambda 函数 python/pyspark

Node.js中的代码AWS Lambda Package不会调用putRecord()来将数据添加到AWS Kinesis Firehose Stream中

AWS Lambda:任务超时

使用nodejs中的AWS Lambda函数上传音频文件

AWS - 想要将多个文件上传到 S3,并且只有在所有文件都上传后才会触发 lambda 函数

如何正确创建可以使用 Eclipse 上传到 AWS lambda 的 zip 文件?