如何解决用于基于lambda的服务的CloudFormation模板S3Key不存在
我正在尝试为AWS lambda服务创建CloudFormation模板,并且在保存我的lambda代码的s3存储桶与调用该存储桶的lambda函数之间遇到了“鸡还是蛋”场景。
目的是将我们的lambda代码构建到jar中,该jar将托管在S3存储桶中,而我们的lambda函数将引用该存储桶。但是,当我运行模板(使用CLI aws cloudformation create-stack --template-body "file://template.yaml"
)时,在创建lambda函数时遇到以下错误:
CREATE_FAILED Error occurred while GetObject. S3 Error Code: NoSuchKey. S3 Error Message: The specified key does not exist. (Service: AWSLambdaInternal; Status Code: 400; Error Code: InvalidParameterValueException; Request ID: ...; Proxy: null)
我相信这是因为cloudformation在同一笔交易中同时构建了存储桶和lambda,而且我不能在中间停下来将内容推送到全新的存储桶中。
我不是唯一一个遇到此问题的人,所以我想知道是否存在解决该问题的常用方法?如果可能的话,我想将所有配置保存在一个模板文件中,但是我想出的唯一解决方案是将堆栈创建分成多个步骤。 (例如,首先构建存储桶,将代码部署到存储桶,然后创建其余的堆栈。)是否有更好的方法?
template.yaml(相关位)
...
myS3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "${AWS::StackName}"
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: AES256
AccessControl: Private
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
VersioningConfiguration:
Status: Enabled
myLambdaFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: !Sub "${AWS::StackName}-dec"
Handler: "lambda.Handler"
Role: !GetAtt myLambdaExecutionRole.Arn
Code:
S3Bucket: !Ref myS3Bucket
S3Key: "emy-lambda-fn.jar"
Runtime: "java8"
Timeout: 90
MemorySize: 384
Environment:
Variables:
stackName: !Sub "${AWS::StackName}"
...
解决方法
我要提出的要求将堆栈创建分为多个步骤。 [...]有更好的方法吗?
将模板分为两部分是完成您要尝试的操作的最逻辑,最简单方式。
有些替代方案允许您将所有内容保存在一个模板中,但是它们更难以实现,管理和简单使用。一种替代方法是开发custom resources。资源将采用 lambda函数的形式,在创建存储区后将对其进行调用。 Lambda将等待并检查存储桶中emy-lambda-fn.jar
是否存在,并且在上载密钥时(最多15分钟以内),函数返回,并且堆栈创建继续。这意味着您的myLambdaFunction
仅在返回自定义资源后才能创建,并确保emy-lambda-fn.jar
存在。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。