Como posso acessar outros serviços da AWS a partir de minhas tarefas do Amazon ECS no Fargate?

5 minuto de leitura
0

Quero acessar outros serviços da AWS a partir das minhas tarefas do Amazon Elastic Container Service (Amazon ECS) no AWS Fargate.

Breve descrição

Quando você chama as APIs da AWS, os aplicativos em contêineres devem assinar solicitações de API da AWS com as credenciais da AWS. Para uma tarefa do Amazon ECS, use o perfil de tarefa do AWS Identity and Access Management (IAM) para assinar solicitações de API com credenciais da AWS. Em seguida, associe um perfil do IAM a uma definição de tarefa do Amazon ECS ou a uma operação da API RunTask. Depois de fazer isso, seus contêineres podem usar o AWS SDK ou a AWS Command Line Interface (AWS CLI) para fazer solicitações de API para serviços autorizados da AWS.

Observação: se você receber erros ao executar comandos da AWS CLI, certifique-se de usar a versão mais recente da AWS CLI.
Neste artigo, o exemplo de resolução é para um aplicativo executado no Fargate e que deve acessar o Amazon Simple Storage Service (Amazon S3).

Resolução

Pré-requisitos

  • Identifique o serviço da AWS que suas tarefas do Fargate devem acessar. Em seguida, crie um perfil do IAM e especifique a política com as ações necessárias para fazer as chamadas de API dentro dos contêineres.
  • Crie uma definição de tarefa para seus contêineres de aplicativos e, em seguida, use o parâmetro taskRoleArn IAM para especificar o perfil do IAM para suas tarefas.

Crie um perfil e política do IAM para suas tarefas

1.Crie um bucket do Amazon S3 para armazenar seus dados. O nome do bucket deve ser exclusivo e seguir os requisitos do bucket do Amazon S3 para nomes de bucket. Para obter mais informações, consulte Regras de nomeação de bucket.

2.Crie um perfil e uma política do IAM para suas tarefas. Neste exemplo, é necessário que o aplicativo coloque objetos em um bucket do S3 e, em seguida, liste esses objetos:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "S3PutGEList",
    "Effect": "Allow",
    "Action": ["s3:PutObject", "s3:GetObject", "s3:ListBucketMultipartUploads", "s3:ListBucketVersions", "s3:ListBucket", "s3:ListMultipartUploadParts"],
    "Resource": ["arn:aws:s3:::*/*", "arn:aws:s3:::kc-test-fargate-app-bucket"]
  }]
}

Observação: substitua fargate-app-bucket pelo nome do seu bucket do S3.

Crie uma definição de tarefa para seu aplicativo e especifique o perfil do IAM para suas tarefas

Para atribuir o perfil ao criar uma definição de tarefa, use a seção taskRoleArn:

{
  "containerDefinitions": [{
    "name": "sample-s3-access",
    "image": "public.ecr.aws/aws-cli/aws-cli:latest",
    "memory": 1024,
    "cpu": 512,
    "command": ["s3api", "put-object", "--bucket", "fargate-app-bucket", "--key", "/usr/local/bin/aws"],
    "essential": true
  }],
  "memory": "1024",
  "cpu": "512",
  "requiresCompatibilities": ["FARGATE"],
  "networkMode": "awsvpc",
  "runtimePlatform": {
    "operatingSystemFamily": "LINUX"
  },
  "family": "s3_access-WITH-ROLE",
  "taskRoleArn": "arn:aws:iam::aws_account_id:role/s3-access-role"
}

Observação: como a imagem base inclui a instalação do aws-cli (public.ecr.aws/aws-cli/aws-cli:latest), esse aplicativo pode fazer a chamada da API.

Salve as informações de configuração em um arquivo e use o comando register-task-definition para registrar a definição da tarefa:

aws ecs register-task-definition --cli-input-json file://task-def1.json --region eu-west-1

Criar e executar uma tarefa independente

Para executar uma tarefa independente, use um tipo de lançamento do Fargate. Neste exemplo, o contêiner é executado em comandos e saídas.

Depois que o contêiner executar o comando, a tarefa retornará um ExitCode=0 se taskRoleArn tiver as permissões necessárias para executar as chamadas de API. Se taskRoleArn estiver ausente ou tiver permissões insuficientes, a tarefa retornará um código de saída none 0.

Criar um serviço

Observação: para que o serviço alcance um estado estável, seu processo de tarefa não pode fechar após a entrada. No exemplo anterior, o contêiner fecha após a conclusão do comando. Isso torna o exemplo inadequado para execução como parte do serviço.

1.Crie um script bash que execute um loop e imprima a data de criação e o nome do host do arquivo em um arquivo. Em seguida, envie o arquivo para o bucket do Amazon S3.

No exemplo abaixo, o script bash é chamado de “run-s3-script.sh”.

#!/bin/bash

while true; do
TODAY=$(date)
echo "-----------------------------------------------------"
echo "Date: $TODAY Host:$HOST"
echo "File was added and active on these Dates: $TODAY" from Host:$HOSTNAME>> checkfile.txt
echo "--------------------Add to S3------------------------"
aws s3 cp checkfile.txt s3://kc-test-fargate-app-bucket
status_code=$?
echo "------------Get upload StatusCode=$status_code ([ $status_code -eq 0 ] means failed)---------------"
#echo "------------Get upload StatusCode=$status_code and exit if upload failed.---------------"
#[ $status_code -eq 0 ] || exit 1
echo "------------Also list the files in the S3 bucket---------------"
aws s3 ls s3://kc-test-fargate-app-bucket
status_code=$?
echo "------------Get the status_code=$status_code after listing objects in bucket---------------"
#[ $status_code -eq 0 ] || exit 1 #uncomment this is you want the task to stop upon failed attempt
echo "============================================================================="
sleep 5

#check the user or role that made the call
aws sts get-caller-identity
echo "*****End of loop, restarting"
sleep 10

done

2.Para criar uma nova imagem que adicione o script e o execute, crie um Dockerfile:

FROM public.ecr.aws/amazonlinux/amazonlinux:latest
Run yum -y install unzip
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN /aws/install
RUN rm -rf aws*
COPY run-s3-test.sh /
CMD ./run-s3-test.sh

3.Para criar a imagem localmente, execute o seguinte comando:

$ docker build -t test-awscli:amz-build-scripts

4.Envie a imagem para o Amazon Elastic Container Registry (Amazon ECR). Adicione a imagem à definição da tarefa que você usa para criar o serviço. Para obter mais informações, consulte Pushing an image.

{
  "containerDefinitions": [{
    "name": "add-files-to-s3",
    "image": "aws_account_id.dkr.ecr.eu-central-1.amazonaws.com/test-s3-ecs:amzlin-build-scripts",
    "memory": 1024,
    "cpu": 512,
    "healthCheck": {
      "retries": 3,
      "command": ["CMD-SHELL", "aws s3 ls s3://kc-test-fargate-app-bucket || exit 1"],
      "timeout": 5,
      "interval": 10,
      "startPeriod": 5
    },
    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-group": "/ecs/test-s3-script",
        "awslogs-region": "eu-central-1",
        "awslogs-create-group": "true",
        "awslogs-stream-prefix": "ecs"
      }
    },
    "essential": true
  }],
  "memory": "1024",
  "cpu": "512",
  "requiresCompatibilities": ["FARGATE"],
  "networkMode": "awsvpc",
  "runtimePlatform": {
    "operatingSystemFamily": "LINUX"
  },
  "family": "test-s3-script",
  "taskRoleArn": "arn:aws:iam::aws_account_id:role/s3-access-role",
  "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole"
}

Observação: você pode receber erros de “Acesso negado” ao usar perfis de tarefas do IAM para seus contêineres. Para obter mais informações, consulte How can I configure IAM task roles in Amazon ECS to avoid "Access Denied" errors?

Informações relacionadas

Creating a service using the console

AWS OFICIAL
AWS OFICIALAtualizada há 9 meses