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 存储桶的主要内容,如果未能解决你的问题,请参考以下文章
Node.js中的代码AWS Lambda Package不会调用putRecord()来将数据添加到AWS Kinesis Firehose Stream中