¿Cómo puedo acceder a otros servicios de AWS desde mis tareas de Amazon ECS en Fargate?

6 minutos de lectura
0

Quiero acceder a otros servicios de AWS desde mis tareas de Amazon Elastic Container Service (Amazon ECS) en AWS Fargate.

Breve descripción

Cuando llama a las API de AWS, las aplicaciones en contenedores deben firmar las solicitudes de API de AWS con las credenciales de AWS. En el caso de una tarea de Amazon ECS, utilice el rol de tarea de AWS Identity and Access Management (IAM) para firmar las solicitudes de API con credenciales de AWS. A continuación, asocie un rol de IAM a una definición de tarea de Amazon ECS o a una operación de la API RunTask. Una vez hecho esto, los contenedores podrán usar el SDK de AWS o la Interfaz de la línea de comandos de AWS (AWS CLI) para realizar solicitudes de API a los servicios autorizados de AWS.

Nota: Si se muestran errores al ejecutar comandos de la AWS CLI, asegúrese de utilizar la versión más reciente de la AWS CLI.
En este artículo, la solución de ejemplo corresponde a una aplicación que se ejecuta en Fargate y que debe acceder a Amazon Simple Storage Service (Amazon S3).

Solución

Requisitos previos

  • Identifique el servicio de AWS al que deben acceder sus tareas de Fargate. A continuación, cree un rol de IAM y especifique la política con las acciones necesarias para realizar las llamadas a la API dentro de los contenedores.
  • Cree una definición de tarea para los contenedores de aplicaciones y, a continuación, utilice el parámetro taskRoleArn de IAM para especificar el rol de IAM para sus tareas.

Creación de una política y un rol de IAM para las tareas

1.    Cree un bucket de Amazon S3 para almacenar sus datos. El nombre del bucket debe ser único y cumplir los requisitos de nombres de bucket de Amazon S3. Para obtener más información, consulte Reglas de nomenclatura de buckets.

2.    Cree una política y un rol de IAM para las tareas. En este ejemplo, la aplicación debe colocar objetos en un bucket de S3 y, a continuación, generar un listado de los mismos:

{
  "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: Sustituya fargate-app-bucket por el nombre de su bucket de S3.

Creación de una definición de tarea para la aplicación y especificación del rol de IAM para las tareas

Para asignar el rol en el momento de crear una definición de tarea, utilice la sección 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: Como la imagen base incluye la instalación de la AWS CLI (public.ecr.aws/aws-cli/aws-cli:latest), esta aplicación puede realizar la llamada a la API.

Guarde la información de configuración en un archivo y, a continuación, utilice el comando register-task-definition para registrar la definición de la tarea:

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

Creación y ejecución de una tarea independiente

Para ejecutar una tarea independiente, utilice un tipo de lanzamiento de Fargate. En este ejemplo, el contenedor ejecuta comandos y sale.

Una vez que el contenedor haya ejecutado el comando, la tarea devolverá ExitCode=0 si taskRoleArn tiene los permisos necesarios para ejecutar las llamadas a la API. Si falta taskRoleArn o no tiene permisos suficientes, la tarea devolverá un código de salida distinto de 0.

Creación de un servicio

Nota: Para que el servicio alcance un estado estable, el proceso de la tarea no puede salir en el momento de la entrada. En el ejemplo anterior, el contenedor sale una vez completado el comando. Por este motivo, el ejemplo no es adecuado para ejecutarlo como parte del servicio.

1.    Cree un script bash que ejecute un bucle e imprima la fecha de creación y el nombre del host del archivo en un archivo. A continuación, inserte el archivo en el bucket de Amazon S3.

En el ejemplo siguiente, el script bash se llama «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 compilar una nueva imagen que añada el script y lo ejecute, cree un archivo de 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 crear la imagen localmente, ejecute el siguiente comando:

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

4.    Inserte la imagen en Amazon Elastic Container Registry (Amazon ECR). Agregue la imagen a la definición de la tarea utilizada para crear el servicio. Para obtener más información, 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"
}

Nota: Es posible que se muestren errores «Acceso denegado» si utiliza roles de tarea de IAM para los contenedores. Para obtener más información, consulte How can I configure IAM task roles in Amazon ECS to avoid «Access Denied» errors?

Información relacionada

Creating a service using the console

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 10 meses