好吧,在寻找其他非常不相关的东西时偶然发现了答案。
答案正是@jarmod 所建议的,我的答案仅仅是指向 AWS 实施相同的现有 cloudformation 示例的指针。
引用下面的链接,以免在这里只放一个链接,
使用此模式,只需一个存储桶预先包含 Lambda zip 文件,无需额外工作即可支持新启动的区域。由于其灵活性,这是大多数用例的首选方法。但是,它确实需要模板中的大多数额外资源:一个内联 Lambda 函数,其中包含用于复制 zip 的代码、一个关联的身份和访问管理 (IAM) 角色、一个 Amazon S3 存储桶和自定义资源。
以下 sn-p 在 AWS CloudFormation 堆栈区域 (LambdaZipsBucket) 中创建一个新的 Amazon S3 存储桶,然后将 zip 文件 (CopyZips.Properties.Objects) 从源存储桶 (CopyZips.Properties.SourceBucket) 复制到新存储桶中.
Resources:
LambdaZipsBucket:
Type: AWS::S3::Bucket
CopyZips:
Type: Custom::CopyZips
Properties:
ServiceToken: !GetAtt 'CopyZipsFunction.Arn'
DestBucket: !Ref 'LambdaZipsBucket'
SourceBucket: !Ref 'QSS3BucketName'
Prefix: !Ref 'QSS3KeyPrefix'
Objects:
- functions/packages/MyFunction/lambda.zip
请注意,Objects 采用路径列表,因此如果您的模板中有多个 Lambda 函数,则所有 zip 都可以添加到单个 CopyZips 资源中。
现在声明我们的 Lambda 函数并将其指向新创建的存储桶。
在创建函数时,我们将 MyFunction.Properties.Code.S3Bucket 指向 LambdaZipsBucket。
MyFunction:
DependsOn: CopyZips
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: !Ref 'LambdaZipsBucket'
S3Key: !Sub '${QSS3KeyPrefix}functions/packages/MyFunction/lambda.zip'
...
注意 DependsOn 键指向我们的 CopyZips 自定义资源。默认情况下,AWS CloudFormation 将尝试并行启动不相互依赖的资源,因此需要确保在创建 Lambda 函数之前已经复制了 zip。
要在您自己的模板中实现这一点,您还需要部署 CopyZips Lambda 代码和相关的 IAM 角色。 AWS Quick Start examples repository 中提供了完整的示例实现。
https://aws.amazon.com/blogs/infrastructure-and-automation/deploying-aws-lambda-functions-using-aws-cloudformation-the-portable-way/