Skip to main content

Развертывание в Amazon Elastic Container Service

Вы можете выполнить развертывание в Amazon Elastic Container Service (ECS) в рамках рабочих процессов непрерывного развертывания (CD).

Введение

В этом руководстве объясняется, как использовать GitHub Actions для создания контейнерного приложения, его отправки в Amazon Elastic Container Registry (ECR) и развертывания в Amazon Elastic Container Service (ECS) при наличии отправки в ветвь main.

При каждой новой отправке main в репозиторийGitHub рабочий процесс GitHub Actions создает образ контейнера и отправляет его Amazon ECR, а затем развертывает в Amazon ECS новое определение задачи.

Note

Если рабочим процессам GitHub Actions требуется доступ к ресурсам от поставщика облачных служб, поддерживающего OpenID Connect (OIDC), можно настроить рабочие процессы для проверки подлинности непосредственно в поставщике облачных служб. Это позволит прекратить хранение таких учетных данных в виде долгоживущих секретов и обеспечить другие преимущества безопасности. Дополнительные сведения см. в разделе "Сведения об усилении защиты с помощью OpenID Connect" и Настройка OpenID Connect в Amazon Web Services.

Необходимые компоненты

Перед созданием рабочего процесса GitHub Actions сначала нужно выполнить следующие действия по настройке Amazon ECR и ECS:

  1. Создайте репозиторий Amazon ECR для хранения образов.

    Например, воспользуйтесь AWS CLI:

    Bash
    aws ecr create-repository \
        --repository-name MY_ECR_REPOSITORY \
        --region MY_AWS_REGION
    
    

    Убедитесь, что вы используете то же имя репозитория Amazon ECR (представлено здесь MY_ECR_REPOSITORY) для переменной ECR_REPOSITORY в приведенном ниже рабочем процессе.

    Убедитесь, что вы используете то же значение региона AWS для переменной AWS_REGION (представленной MY_AWS_REGIONздесь) в рабочем процессе ниже.

  2. Создайте определение задачи Amazon ECS, кластер и службу.

    Дополнительные сведения см . в руководстве по началу работы с консолью Amazon ECS или руководстве по началу работы в документации Amazon ECS.

    Убедитесь, что вы заметите имена, заданные для службы и кластера Amazon ECS, и используйте их для ECS_SERVICE переменных ECS_CLUSTER в приведенном ниже рабочем процессе.

  3. Сохраните определение задачи Amazon ECS в виде JSON-файла в репозитории GitHub.

    Формат файла должен совпадать с выходными данными, созданными:

    Bash
    
    aws ecs register-task-definition --generate-cli-skeleton
    
    

    Убедитесь, что переменная в рабочем процессе ниже задана ECS_TASK_DEFINITION в качестве пути к JSON-файлу.

    Убедитесь, что переменная в рабочем процессе ниже задана CONTAINER_NAME в качестве имени контейнера в containerDefinitions разделе определения задачи.

  4. Создайте секреты AWS_ACCESS_KEY_ID GitHub Actions и AWS_SECRET_ACCESS_KEY сохраните значения для ключа доступа Amazon IAM.

    Дополнительные сведения о создании секретов для GitHub Actionsсм. в разделе Использование секретов в GitHub Actions.

    Ознакомьтесь с документацией по каждому действию, используемому ниже, для рекомендуемых политик IAM для пользователя IAM и методов обработки учетных данных ключа доступа.

  5. При необходимости настройте среду развертывания. Среды используются для описания общего целевого объекта развертывания, такого как production, staging или development. Когда рабочий процесс GitHub Actions выполняет развертывание в среде, эта среда отображается на главной странице репозитория. Вы можете использовать среды, чтобы требовать утверждения для продолжения задания, ограничить, какие ветви могут активировать рабочий процесс, шлюзовые развертывания с настраиваемыми правилами защиты развертывания, или ограничить доступ к секретам. Дополнительные сведения о создании сред см. в разделе "Управление средами для развертывания".

Создание рабочего процесса

Выполнив предварительные требования, можно приступить к созданию рабочего процесса.

В следующем примере рабочего процесса показано, как создать образ контейнера и отправить его в Amazon ECR. Затем он обновляет определение задачи с новым идентификатором образа и развертывает определение задачи в Amazon ECS.

Убедитесь, что вы предоставляете собственные значения для всех переменных в env ключе рабочего процесса.

Если вы настроили среду развертывания, измените значение environment на имя среды. Если вы не настроили среду , или если рабочий процесс находится в частном репозитории, и вы не используете GitHub Enterprise Cloud, удалите ключ environment.

YAML
# Этот рабочий процесс использует действия, которые не сертифицированы GitHub.
# Они предоставляются сторонним поставщиком, и на них распространяются
# отдельные условия обслуживания, политика конфиденциальности и поддержка
# документации.

# GitHub рекомендует закрепить действия в фиксации SHA.
# Чтобы получить более новую версию, потребуется обновить SHA.
# Вы также можете ссылаться на тег или ветвь, однако действие может измениться без предупреждения.

name: Deploy to Amazon ECS

on:
  push:
    branches:
      - main

env:
  AWS_REGION: MY_AWS_REGION                   # set this to your preferred AWS region, e.g. us-west-1
  ECR_REPOSITORY: MY_ECR_REPOSITORY           # set this to your Amazon ECR repository name
  ECS_SERVICE: MY_ECS_SERVICE                 # set this to your Amazon ECS service name
  ECS_CLUSTER: MY_ECS_CLUSTER                 # set this to your Amazon ECS cluster name
  ECS_TASK_DEFINITION: MY_ECS_TASK_DEFINITION # set this to the path to your Amazon ECS task definition
                                               # file, e.g. .aws/task-definition.json
  CONTAINER_NAME: MY_CONTAINER_NAME           # set this to the name of the container in the
                                               # containerDefinitions section of your task definition

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@0e613a0980cbf65ed5b322eb7a1e075d28913a83
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        uses: aws-actions/amazon-ecr-login@62f4f872db3836360b72999f4b87f1ff13310f3a

      - name: Build, tag, and push image to Amazon ECR
        id: build-image
        env:
          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
          IMAGE_TAG: ${{ github.sha }}
        run: |
          # Build a docker container and
          # push it to ECR so that it can
          # be deployed to ECS.
          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
          echo "image=$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG" >> $GITHUB_OUTPUT

      - name: Fill in the new image ID in the Amazon ECS task definition
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@c804dfbdd57f713b6c079302a4c01db7017a36fc
        with:
          task-definition: ${{ env.ECS_TASK_DEFINITION }}
          container-name: ${{ env.CONTAINER_NAME }}
          image: ${{ steps.build-image.outputs.image }}

      - name: Deploy Amazon ECS task definition
        uses: aws-actions/amazon-ecs-deploy-task-definition@df9643053eda01f169e64a0e60233aacca83799a
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

Дополнительные ресурсы

Исходный шаблон рабочего процесса смaws.yml. в репозитории GitHub Actions . starter-workflows

Дополнительные сведения о службах, используемых в этих примерах, см. в следующей документации: