Назад | Перейти на главную страницу

Как загрузить файл в корзину S3 с помощью скрипта CloudFormation?

Как загрузить файл в шаблон CloudFormation ведра AWS S3?

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

AWS предоставляет образец Макрос это может помочь, в зависимости от вашего варианта использования: https://github.com/awslabs/aws-cloudformation-templates/tree/a11722d/aws/services/CloudFormation/MacrosExamples/S3Objects.

  1. Создайте отдельный стек CloudFormation с макрос. шаблон. Это создает макрос преобразования «S3Objects», который затем будет доступен для любого другого стека в регионе. В README.md объясняет, как «упаковать» шаблон макроса перед добавлением в CloudFormation (необходимо будет включить отдельный исходный файл для функции Lambda).
  2. Файл example.template предоставляет пример использования. Обратите внимание на верхний уровень Преобразовать раздел, который относится к S3Objects, что позволяет использовать 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 Bucket
        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}

Вы не можете загружать файлы через CloudFormation, это не поддерживается, потому что CFN не имеет доступа к вашей локальной файловой системе.

Что я обычно делаю:

  • Вызов cloudformation задача от Ansible
  • CFN создает ведро и в Outputs экспортирует имя сегмента
  • Ansible загружает файлы с помощью s3_sync в следующей задаче, как только она будет выполнена.

Надеюсь, это поможет :)