Come posso accedere ad altri servizi AWS dalle mie attività Amazon ECS su Fargate?

5 minuti di lettura
0

Desidero accedere ad altri servizi AWS dalle mie attività Amazon Elastic Container Service (Amazon ECS) su AWS Fargate.

Breve descrizione

Quando si richiamano le API AWS, le applicazioni containerizzate devono firmare le richieste API AWS con le credenziali AWS. Per un'attività Amazon ECS, utilizza il ruolo attività AWS Identity and Access Management (IAM) per firmare le richieste API con le credenziali AWS. Quindi, associa un ruolo IAM a una definizione di attività Amazon ECS o a un'operazione API RunTask. Dopo aver eseguito questa operazione, i container possono utilizzare l'SDK AWS o l'Interfaccia della linea di comando AWS (AWS CLI) per effettuare richieste API ai servizi AWS autorizzati.

Nota: se ricevi errori durante l'esecuzione dei comandi dell'Interfaccia della linea di comando AWS (AWS CLI), assicurati di utilizzare la versione più recente di AWS CLI.
In questo articolo, la risoluzione di esempio è relativa a un'applicazione che viene eseguita su Fargate e che deve accedere ad Amazon Simple Storage Service (Amazon S3).

Risoluzione

Prerequisiti

  • Identifica il servizio AWS a cui devono accedere le tue attività Fargate. Quindi, crea un ruolo IAM e specifica la policy con le azioni richieste per effettuare le chiamate API all'interno dei container.
  • Crea una definizione di attività per i container della tua applicazione, quindi utilizza il parametro taskRoleArn IAM per specificare il ruolo IAM per le tue attività.

Crea una policy e un ruolo IAM per le tue attività

1.    Crea un bucket Amazon S3 per archiviare i tuoi dati. Il nome del bucket deve essere univoco e rispettare i requisiti previsti dai bucket Amazon S3 per i nomi dei bucket. Per ulteriori informazioni, consulta le Regole di denominazione dei bucket.

2.    Crea una policy e un ruolo IAM per le tue attività. In questo esempio, l'applicazione deve inserire oggetti in un bucket S3 e quindi elencarli:

{
  "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"]
  }]
}

Nota: sostituisci fargate-app-bucket con il nome del tuo bucket S3.

Crea una definizione di attività per la tua applicazione e specifica il ruolo IAM per le tue attività

Per assegnare il ruolo quando crei una definizione di attività, usa la sezione 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"
}

Nota: poiché l'immagine di base include l'installazione di aws-cli (public.ecr.aws/aws-cli/aws-cli:latest), questa applicazione può effettuare la chiamata API.

Salva le informazioni di configurazione in un file, quindi utilizza il comando register-task-definition per registrare la definizione dell'attività:

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

Crea ed esegui un'attività standalone

Per eseguire un'attività standalone, usa un tipo di avvio Fargate. In questo esempio, il container esegue i comandi ed esce.

Dopo che il container ha eseguito il comando, l'attività restituisce un ExitCode=0 se taskRoleArn dispone delle autorizzazioni necessarie per eseguire le chiamate API. Se taskRoleArn è mancante o dispone di autorizzazioni insufficienti, l'attività restituisce un codice none 0 exit code.

Crea un servizio

Nota: affinché il servizio raggiunga uno stato stabile, il processo dell'attività non può terminare al momento dell'ingresso. Nell'esempio precedente, il container viene chiuso dopo il completamento del comando. Ciò rende l'esempio inadatto per l'esecuzione come parte del servizio.

1.    Crea uno script bash che esegue un loop e stampa su un file la data di creazione e il nome host del file. Quindi, invia il file al bucket Amazon S3.

Nell'esempio seguente, lo script bash è denominato "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.    Per creare una nuova immagine che aggiunga lo script e lo esegua, crea un 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.    Per creare l'immagine localmente, esegui il comando seguente:

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

4.    Invia l'immagine ad Amazon Elastic Container Registry (Amazon ECR). Aggiungi l'immagine alla definizione dell'attività che usi per creare il servizio. Per ulteriori informazioni, consulta la pagina Invio di un'immagine.

{
  "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"
}

Nota: potresti ricevere errori di "Accesso negato" quando utilizzi i ruoli delle attività IAM per i tuoi container. Per ulteriori informazioni, consulta la pagina How can I configure IAM task roles in Amazon ECS to avoid "Access Denied" errors?

Informazioni correlate

Creazione di un servizio con la console

AWS UFFICIALE
AWS UFFICIALEAggiornata 8 mesi fa