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

Можно ли заполнить корзину S3 с помощью шаблона CloudFormation?

Мне нужно сохранить некоторые файлы для моего шаблона CF (схема GraphQL, источник Lambda и т. Д.) В ведре S3, которое также (надеюсь) будет определено в том же шаблоне, поскольку это, по-видимому, единственный способ помимо непосредственного удаления содержимого в шаблон, чтобы сделать это. Я также пытаюсь заранее подумать о CI / CD, и было бы неплохо, чтобы эти файлы были зарегистрированы, а инструмент CI / CD перемещал их соответствующим образом.

Есть ли способ скопировать файлы на S3 из шаблона? Как большинство людей делают это с CI / CD?

Боюсь, что невозможно загрузить в корзину, созданную на основе того же шаблона. Однако, если сегмент уже существует, скажем, для всего аккаунта deployment ведро или один из cf-templates-... ведра, у вас есть несколько вариантов.

  • Загрузите вспомогательные файлы, используя Ansible playbook и в той же книге создания / обновления стека 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, и оба отлично работают.

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

Некоторые инструменты AWS, такие как λ #, могут создавать повторно развертываемые шаблоны CloudFormation с активами. Взгляните на этот пример: https://github.com/LambdaSharp/StaticWebsite-Sample

Другая альтернатива - использовать cfpack инструмент. Он позволяет вам определять, какие артефакты необходимо загрузить в корзину S3. Взгляните на Артефакты раздел для получения более подробной информации, в нем объясняется, как работать со схемой и преобразователями Graphql.

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