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

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

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

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

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

   Например, воспользуйтесь [AWS CLI](https://aws.amazon.com/cli/):

   ```bash copy
   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, кластер и службу.

   Дополнительные сведения см [. в руководстве по началу работы с консолью](https://us-east-2.console.aws.amazon.com/ecs/home?region=us-east-2#/firstRun) Amazon ECS или [руководстве](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/getting-started-fargate.html) по началу работы в документации Amazon ECS.

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

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

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

   ```bash copy

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

   ```

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

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

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

   Дополнительные сведения о создании секретов GitHub Actionsсм. в разделе [Использование секретов в GitHub Actions](/ru/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets#creating-secrets-for-a-repository).

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

5. При необходимости настройте среду развертывания. Среды используются для описания общего целевого объекта развертывания, такого как `production`, `staging` или `development`. Когда GitHub Actions рабочий процесс внедряется в окружение, среда отображается на главной странице репозитория. Вы можете использовать среды, чтобы требовать утверждения для продолжения задания, ограничить, какие ветви могут активировать рабочий процесс, воротные развертывания с помощью настраиваемых правил защиты развертывания или ограничить доступ к секретам. Дополнительные сведения о создании сред см. в разделе [Управление средами для развертывания](/ru/actions/how-tos/deploy/configure-and-manage-deployments/manage-environments).

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

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

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

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

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

```yaml copy
# Этот рабочий процесс использует действия, которые не сертифицированы 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@v6

      - 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`](https://github.com/actions/starter-workflows/blob/main/deployments/aws.yml) . в репозитории GitHub Actions`starter-workflows` .

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

* [Рекомендации по безопасности в IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) в документации Amazon AWS.
* Официальное действие AWS Configure AWS [Credentials( Настройка учетных](https://github.com/aws-actions/configure-aws-credentials) данных AWS).
* Официальное действие AWS [Amazon ECR "Login"](https://github.com/aws-actions/amazon-ecr-login) (Вход в Amazon ECR).
* Официальное действие AWS [Amazon ECS "Render Task Definition"](https://github.com/aws-actions/amazon-ecs-render-task-definition) (Определение задачи отрисовки в Amazon ECS).
* Официальное действие AWS [Amazon ECS "Deploy Task Definition"](https://github.com/aws-actions/amazon-ecs-deploy-task-definition) (Определение задачи развертывания в Amazon ECS).