是否可以通过 CloudFormation 模板填充 S3 存储桶?

是否可以通过 CloudFormation 模板填充 S3 存储桶?

我需要将 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

另一种方法是使用cfpack工具。它允许您定义需要上传到 S3 存储桶的工件。查看工件部分了解更多详细信息,它解释了如何处理 Graphql 模式和解析器。

除此之外,cfpack 还允许您将大型 CloudFormation 模板拆分为较小的文件。当您拥有巨大的 CloudFormation 模板时,此功能特别有用。所以,试试吧。

答案3

一些 AWS 工具(例如 λ#)能够使用资产创建可重新部署的 CloudFormation 模板。请看以下示例:https://github.com/LambdaSharp/StaticWebsite-Sample

相关内容