Amazon-Web-Services

如何使用 CloudFormation 腳本將文件上傳到 S3 儲存桶?

  • April 27, 2022

如何將文件上傳到我的 AWS S3 儲存桶 CloudFormation 模板?

AWSTemplateFormatVersion: '2010-09-09'
Resources:
 S3Bucket:
   Type: AWS::S3::Bucket
   Properties:
     AccessControl: PublicRead
     BucketName: s3bucketuser
     VersioningConfiguration:
       Status: Enabled

您無法通過 CloudFormation 上傳文件,因為 CFN 無權訪問您的本地文件系統,所以不支持該功能。

我通常做的事情:

  • 從Ansible呼叫cloudformation任務
  • CFN 創建儲存桶並在Outputs導出中儲存儲存桶名稱
  • 一旦 CFN 完成, Ansible 就會上傳s3_sync在下一個任務中使用的文件。

AWS 提供了一個範例,可能會有所幫助,具體取決於您的案例:https ://github.com/awslabs/aws-cloudformation-templates/tree/a11722d/aws/services/CloudFormation/MacrosExamples/S3Objects 。

  1. 使用 macro.template創建一個單獨的CloudFormation堆棧。這將創建轉換宏“S3Objects”,然後該區域中的任何其他堆棧都可以使用該宏。README.md解釋瞭如何在添加到CloudFormation之前“打包”宏模板(它需要為 Lambda 函式包含一個單獨的源文件)。
  2. 文件example.template提供了範例用法。請注意引用的頂級TransformS3Objects部分,它允許使用Type: AWS::S3::Object.

在提供的範例中,該Body屬性允許直接在 YAML 或 JSON 模板中輸入文本。為了擴展這一點,可以使用Fn::Sub創建一個文件,其中包含來自其他資源的參數或屬性:

---
AWSTemplateFormatVersion: '2010-09-09'

Transform: S3Objects

Parameters:
 ANameField:
   Type: String

Resources:
 S3Bucket:
   Type: AWS::S3::Bucket
   Properties:
     AccessControl: PublicRead
     BucketName: s3bucketuser
     VersioningConfiguration:
       Status: Enabled

 S3Object:
   Type: AWS::S3::Object
   Properties:
     Target:
       Bucket: !Ref S3Bucket
       Key: README.md
       ContentType: text/markdown
     Body: !Sub |
       # My text file

       This is my text file for ${ANameField}.
       The region is ${AWS::Region} and my account ID is ${AWS::AccountId}.
       This file is in the ${S3Bucket} bucket. The bucket ARN is ${S3Bucket.Arn},
       and its website endpoint is ${S3Bucket.WebsiteURL}

引用自:https://serverfault.com/questions/957686