我需要将 CF 模板的一些文件(GraphQL 架构、Lambda 源等)存储到 S3 存储桶中,这些文件也(希望)在同一个模板中定义,因为这似乎是除了将内容直接放入模板之外的唯一方法。我也在尝试提前考虑 CI/CD,如果能签入这些文件并让 CI/CD 工具适当地移动它们,那就太好了。
有没有办法从模板将文件复制到 S3?大多数人如何使用 CI/CD 做到这一点?
答案1
恐怕无法上传到使用相同模板创建的存储桶。但是,如果存储桶是预先存在的,比如帐户范围的存储deployment
桶或其中一个cf-templates-...
存储桶,您就有一些选择。
使用上传辅助文件Ansible 剧本并在同一个剧本中创建/更新 CloudFormation 堆栈。这是 CI/CD 管道非常流行的方法。在您的 Ansible 剧本中,您将获得类似以下内容:
tasks: - name: "Upload files to s3://{{deployment_bucket}}/lambda/" s3_sync: bucket: "{{deployment_bucket}}" file_root: lambda/ prefix: lambda/ permission: private - name: "Create CloudFormation Stack" cloudformation: stack_name: "some-stack-name" state: present template: template.yml template_parameters: DeploymentS3Path: "s3://{{deployment_bucket}}/lambda/"
将
aws cloudformation package
文件压缩并上传到 S3,然后aws cloudformation deploy
创建并执行 CloudFormation 变更集。这也是一种非常流行的方法,可以很好地与 CI/CD 配合使用。然后,您可以在 CloudFormation 模板中引用本地文件,如下所示:
MyLambda: Type: AWS::Lambda::Function Properties: Code: lambda/
aws cloudformation package
运行时它将输出一个修改后的模板,其中代码路径已扩展:MyLambda: Properties: Code: S3Bucket: cf-templates-1a2b3c4d5e6f-ap-southeast-2 S3Key: e24e45d4f5f2ab3c5d437659fa2246a7
然后您就可以使用
aws cloudformation deploy
这个扩展模板。或者使用其他方法进行部署 - 模板已准备好使用。package
此/方法的优点deploy
在于它可以为您处理本地文件到 S3 的上传。
在不同的项目中,我们在各种 CI/CD 管道中使用这两种方法,并且效果都很好。
希望有帮助:)
答案2
答案3
一些 AWS 工具(例如 λ#)能够使用资产创建可重新部署的 CloudFormation 模板。请看以下示例:https://github.com/LambdaSharp/StaticWebsite-Sample