Share Your AWS re:Post Experience - Quick 3 Question Survey
Help us improve AWS re:Post! We're interested in understanding how you use re:Post and its impact on your AWS journey. Please take a moment to complete our brief 3-question survey.
Como posso acessar outros serviços da AWS a partir de minhas tarefas do Amazon ECS no Fargate?
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

Conteúdo relevante
- feita há um mêslg...
- Resposta aceitafeita há um mêslg...
- feita há um mêslg...
- feita há 2 meseslg...
- feita há um dialg...
- AWS OFICIALAtualizada há 8 meses
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há um mês
- AWS OFICIALAtualizada há 4 anos