Implantar no Amazon Elastic Container Service

Você pode fazer implantação no Amazon Elastic Container Service (ECS) como parte de fluxos de trabalho para implantação contínua (CD).

GitHub Actions está disponível com GitHub Free, GitHub Pro, GitHub Free para organizações, GitHub Team, GitHub Enterprise Cloud e GitHub AE. GitHub Actions não está disponível para repositórios privados pertencentes a contas usando os planos de legado por repositório.

Observação: Executores hospedados em GitHub não são atualmente compatíveis com GitHub Enterprise Server. Você pode ver mais informações sobre suporte futuro planejado no Itinerário público do GitHub.

Introdução

Este guia explica como usar GitHub Actions para construir um aplicativo containerizado, fazer push no Amazon Elastic Container Registry (ECR) e fazer a implantação no Amazon Elastic Container Service (ECS).

Em cada nova versão no seu repositório de GitHub, os fluxos de trabalho de GitHub Actions criam e fazem push de uma nova imagem de contêiner para o Amazon ECR e, em seguida, implementa uma nova definição de tarefa para o Amazon ECS.

Pré-requisitos

Antes de criar seu fluxo de trabalho de GitHub Actions, primeiro você precisa concluir as etapas a seguir para o Amazon ECR e ECS:

  1. Crie um repositório Amazon ECR para armazenar suas imagens.

    Usando, por exemplo, CLI AWS:

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

    Certifique-se de usar o mesmo nome de repositório do Amazon ECR (representado aqui por MY_ECR_REPOSITORY) para a variável ECR_REPOSITORY no fluxo de trabalho abaixo.

    Certifique-se de usar o mesmo valor de região do AWS para a variável AWS_REGION (representada aqui pela variável MY_AWS_REGION) no fluxo de trabalho abaixo.

  2. Crie uma definição de tarefa e serviço do Amazon ECS.

    Para obter informações, siga o Assistente de introdução no console do Amazon ECS, ou o Guia de introdução na documentação do Amazon ECS.

    Certifique-se de anotar os nomes que você definiu para o serviço do Amazon ECS e do cluster e use-os para as variáveis ECS_SERVICE e ECS_CLUSTER no fluxo de trabalho abaixo.

  3. Armazene sua definição de tarefa do Amazon ECS como um arquivo JSON no seu repositório de GitHub.

    O formato do arquivo deve ser o mesmo que a saída gerada por:

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

    Ensure that you set the ECS_TASK_DEFINITION variable in the workflow below as the path to the JSON file.

    Certifique-se de definir a variável CONTAINER_NAME no fluxo de trabalho abaixo como o nome do contêiner na seção containerDefinitions da definição da tarefa.

  4. Crie segredos de GitHub Actions denominados AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY para armazenar os valores para sua chave de acesso ao Amazon IAM.

    Para obter mais informações sobre a criação de segredos para GitHub Actions, consulte "segredos criptografados."

    Veja a documentação para cada ação usada abaixo para as políticas recomendadas de IAM para o usuário de IAM, bem como os métodos para lidar com as credenciais de acesso.

Criar o fluxo de trabalho

Depois que tiver preenchido os pré-requisitos, você poderá prosseguir com a criação do fluxo de trabalho.

O fluxo de trabalho a seguir demonstra como construir uma imagem de contêiner e enviá-lo para o Amazon ECR. Em seguida, ele atualiza a definição da tarefa com o novo ID de imagem e implanta a definição da tarefa no Amazon ECS.

Certifique-se de fornecer seus próprios valores para todas as variáveis na chave env do fluxo de trabalho.

YAML
name: Deploy to Amazon ECS

on:
  release:
    types: [ created ]

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

defaults:
  run:
    shell: bash

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

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

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        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@v1

      - 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 "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"

      - name: Fill in the new image ID in the Amazon ECS task definition
        id: task-def
        uses: aws-actions/amazon-ecs-render-task-definition@v1
        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@v1
        with:
          task-definition: ${{ steps.task-def.outputs.task-definition }}
          service: ${{ env.ECS_SERVICE }}
          cluster: ${{ env.ECS_CLUSTER }}
          wait-for-service-stability: true

Recursos adicionais

Para mais informações sobre os serviços utilizados nestes exemplos, veja a seguinte documentação:

Esse documento ajudou você?Política de Privacidade

Ajude-nos a tornar esses documentos ótimos!

Todos os documentos do GitHub são de código aberto. Você percebeu que algo que está errado ou não está claro? Envie um pull request.

Faça uma contribuição

Ou, aprenda como contribuir.