Azure DevOps Pipelines e Release - Build And Push to ECR With Deploy to ECS Fargate PT-2
Tags: devops, azure, aws, docker
Published: 2024-01-19 01:01:04

## Deploy no AWS ECS usando Azure DevOps

Com a nossa imagem Docker já armazenada no AWS ECR, estamos prontos para avançar para a etapa de Deploy.

## Pré-requisitos:
- Um Cluster ECS configurado
- Definição de Tarefa (Task Definition)
- Serviço de Tarefa (Service Task)

Para este processo de Deploy, optarei pelo modo clássico do Azure DevOps, pois acredito que isso facilita a visualização no dia a dia.

Na aba lateral esquerda, selecione a opção "Releases" e clique em "New" e "New release pipeline".

![Release Step](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g5923bdrvk3k2yr7hoqo.png)

Para todas as etapas, utilizei apenas o Recurso Bash da Pipeline, permitindo sua utilização em outros serviços de pipeline, como GitHub Actions, GitLab, entre outros.

![Release Bash](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c7omi83k7r1k8v40uunj.png)

Os 6 passos são bem simples, foram separados para detalhar cada um deles. Obs: Nos passos seguintes, onde estiver `$(NOME_VARIAVEL)`, você irá armazenar em variáveis.

1. **Auth:** Autenticação com a AWS para realizar os processos seguintes.

```
aws configure set aws_access_key_id $(AWS_ACCESS_KEY_ID)
aws configure set aws_secret_access_key $(AWS_SECRET_ACCESS_KEY)
aws configure set region $(AWS_REGION)
```
2.**ECS Describe:** Faz o download do JSON da Task Definition para criar uma nova versão.

```
aws ecs describe-task-definition --task-definition $(TASK_DEFINITION_NAME) --query taskDefinition | jq 'del(.taskDefinitionArn, .revision, .status, .requiresAttributes, .compatibilities, .registeredAt, .registeredBy)' > temp-task-definition.json

```
3.**Replace Version:** Altera a versão da imagem do container para a versão recém-criada na [Parte 1](https://dev.to/lucasbehrooz/azure-devops-pipelines-e-release-build-and-push-to-ecr-with-deploy-to-ecs-fargate-175f).
```
jq '.containerDefinitions[0].image = "$(AWS_ECR):$(Build.BuildNumber)"' temp-task-definition.json > task-definition.json 
```

Esse comando gera como output o número da versão da Task Definition, que será armazenado para ser usado no próximo passo.
4.**Register Task Definition:** Após atualizar a versão, registra a nova versão da Task Definition.

```
task_version=$(aws ecs register-task-definition --cli-input-json file://task-definition.json | jq --raw-output '.taskDefinition.revision')

echo "##vso[task.setvariable variable=task_version;]$task_version"
```
5.**Update Service Cluster:** Este passo realiza a efetiva publicação da nossa nova versão.

```
aws ecs update-service \
    --cluster $CLUSTER_NAME \
    --service $SERVICE_NAME \
    --task-definition $TASK_DEFINITION_NAME:$(task_version)
```

6.**Wait Service Stability:** Aguarda a validação do serviço para finalizar a publicação.

```
aws ecs wait services-stable \
    --cluster $CLUSTER_NAME \
    --service $SERVICE_NAME \
```
Por fim, mas não menos importante, todas as variáveis utilizadas estão armazenadas na aba "Variable".

![Variáveis](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z38osohq1pcot2uo3jli.png)