Creación de recursos de Amazon ECS con AWS CloudFormation - Amazon Elastic Container Service

Creación de recursos de Amazon ECS con AWS CloudFormation

Amazon ECS está integrado con AWS CloudFormation, un servicio que puede utilizar para modelar y configurar recursos AWS con plantillas que defina. De este modo, puede dedicar menos tiempo a crear y administrar sus recursos e infraestructura. Al usar AWS CloudFormation, puede crear una plantilla que describa todos los recursos AWS que desee, como clústeres específicos de Amazon ECS. A continuación, AWS CloudFormation se encarga de aprovisionar y configurar esos recursos para usted.

Cuando usa AWS CloudFormation, puede volver a usar la plantilla para configurar los recursos de Amazon ECS de forma coherente y repetida. Solo tiene que describir los recursos una vez y luego aprovisionar de nuevo los mismos recursos a lo largo de varios Cuentas de AWS y Regiones de AWS.

Plantillas AWS CloudFormation

Para aprovisionar y configurar los recursos de Amazon ECS y sus servicios relacionados, asegúrese de estar familiarizado con las plantillas AWS CloudFormation. Las plantillas AWS CloudFormation son archivos de texto en formato JSON o YAML que describen los recursos que desea aprovisionar en sus pilas AWS CloudFormation. Si no está familiarizado con los formatos JSON o YAML, puede usar AWS CloudFormation Designer para comenzar a usar las plantillas de AWS CloudFormation. Para obtener más información, consulte ¿Qué es Designer de AWS CloudFormation? en la Guía del usuario de AWS CloudFormation.

Amazon ECS admite la creación de clústeres, definiciones de tareas, servicios y conjuntos de tareas en AWS CloudFormation. Los siguientes ejemplos demuestran cómo crear recursos con estas plantillas mediante la AWS CLI. También puede crear estos recursos con la consola AWS CloudFormation. Para obtener más información sobre cómo crear recursos con la consola AWS CloudFormation, consulte la Guía del usuario de AWS CloudFormation.

Plantillas de ejemplo

Creación de recursos de Amazon ECS con pilas separadas

Los siguientes ejemplos muestran cómo crear recursos de Amazon ECS con pilas separadas para cada recurso.

Definiciones de tareas

Puede usar la siguiente plantilla para crear una tarea de Fargate Linux.

JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "ECSTaskDefinition": { "Type": "AWS::ECS::TaskDefinition", "Properties": { "ContainerDefinitions": [ { "Command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ], "EntryPoint": [ "sh", "-c" ], "Essential": true, "Image": "httpd:2.4", "LogConfiguration": { "LogDriver": "awslogs", "Options": { "awslogs-group": "/ecs/fargate-task-definition", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "ecs" } }, "Name": "sample-fargate-app", "PortMappings": [ { "ContainerPort": 80, "HostPort": 80, "Protocol": "tcp" } ] } ], "Cpu": 256, "ExecutionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole", "Family": "task-definition-cfn", "Memory": 512, "NetworkMode": "awsvpc", "RequiresCompatibilities": [ "FARGATE" ], "RuntimePlatform": { "OperatingSystemFamily": "LINUX" } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Resources: ECSTaskDefinition: Type: 'AWS::ECS::TaskDefinition' Properties: ContainerDefinitions: - Command: - >- /bin/sh -c "echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground" EntryPoint: - sh - '-c' Essential: true Image: 'httpd:2.4' LogConfiguration: LogDriver: awslogs Options: awslogs-group: /ecs/fargate-task-definition awslogs-region: us-east-1 awslogs-stream-prefix: ecs Name: sample-fargate-app PortMappings: - ContainerPort: 80 HostPort: 80 Protocol: tcp Cpu: 256 ExecutionRoleArn: 'arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole' Family: task-definition-cfn Memory: 512 NetworkMode: awsvpc RequiresCompatibilities: - FARGATE RuntimePlatform: OperatingSystemFamily: LINUX

Clústeres

Puede usar la siguiente plantilla para crear un clúster vacío.

JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "ECSCluster": { "Type": "AWS::ECS::Cluster", "Properties": { "ClusterName": "MyEmptyCluster" } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Resources: ECSCluster: Type: 'AWS::ECS::Cluster' Properties: ClusterName: MyEmptyCluster

Creación de varios recursos de Amazon ECS en una pila

Puede usar la siguiente plantilla de ejemplo para crear varios recursos de Amazon ECS en una pila. La plantilla crea un clúster de Amazon ECS denominado CFNCluster. El clúster contiene una definición de tarea de Linux Fargate que configura un servidor web. La plantilla también crea un servicio denominado cfn-service que lanza y mantiene la tarea definida por la definición de tareas. Antes de usar esta plantilla, asegúrese de que todos los ID de subred y de grupo de seguridad en la NetworkConfiguration del servicio pertenezcan a la misma VPC y que el grupo de seguridad tenga las reglas necesarias. Para obtener más información sobre las reglas del grupo de seguridad, consulte Reglas del grupo de seguridad en la guía del usuario de Amazon VPC.

JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "ECSCluster": { "Type": "AWS::ECS::Cluster", "Properties": { "ClusterName": "CFNCluster" } }, "ECSTaskDefinition": { "Type": "AWS::ECS::TaskDefinition", "Properties": { "ContainerDefinitions": [ { "Command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ], "EntryPoint": [ "sh", "-c" ], "Essential": true, "Image": "httpd:2.4", "LogConfiguration": { "LogDriver": "awslogs", "Options": { "awslogs-group": "/ecs/fargate-task-definition", "awslogs-region": "us-east-1", "awslogs-stream-prefix": "ecs" } }, "Name": "sample-fargate-app", "PortMappings": [ { "ContainerPort": 80, "HostPort": 80, "Protocol": "tcp" } ] } ], "Cpu": 256, "ExecutionRoleArn": "arn:aws:iam::aws_account_id::role/ecsTaskExecutionRole", "Family": "task-definition-cfn", "Memory": 512, "NetworkMode": "awsvpc", "RequiresCompatibilities": [ "FARGATE" ], "RuntimePlatform": { "OperatingSystemFamily": "LINUX" } } }, "ECSService": { "Type": "AWS::ECS::Service", "Properties": { "ServiceName": "cfn-service", "Cluster": { "Ref": "ECSCluster" }, "DesiredCount": 1, "LaunchType": "FARGATE", "NetworkConfiguration": { "AwsvpcConfiguration": { "AssignPublicIp": "ENABLED", "SecurityGroups": [ "sg-abcdef01234567890" ], "Subnets": [ "subnet-abcdef01234567890" ] } }, "TaskDefinition": { "Ref": "ECSTaskDefinition" } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Resources: ECSCluster: Type: 'AWS::ECS::Cluster' Properties: ClusterName: CFNCluster ECSTaskDefinition: Type: 'AWS::ECS::TaskDefinition' Properties: ContainerDefinitions: - Command: - >- /bin/sh -c "echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground" EntryPoint: - sh - '-c' Essential: true Image: 'httpd:2.4' LogConfiguration: LogDriver: awslogs Options: awslogs-group: /ecs/fargate-task-definition awslogs-region: us-east-1 awslogs-stream-prefix: ecs Name: sample-fargate-app PortMappings: - ContainerPort: 80 HostPort: 80 Protocol: tcp Cpu: 256 ExecutionRoleArn: 'arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole' Family: task-definition-cfn Memory: 512 NetworkMode: awsvpc RequiresCompatibilities: - FARGATE RuntimePlatform: OperatingSystemFamily: LINUX ECSService: Type: 'AWS::ECS::Service' Properties: ServiceName: cfn-service Cluster: !Ref ECSCluster DesiredCount: 1 LaunchType: FARGATE NetworkConfiguration: AwsvpcConfiguration: AssignPublicIp: ENABLED SecurityGroups: - sg-abcdef01234567890 Subnets: - subnet-abcdef01234567890 TaskDefinition: !Ref ECSTaskDefinition

Uso de AWS CLI para crear recursos a partir de plantillas

El siguiente comando crea una pila llamada ecs-stack mediante un archivo del cuerpo de plantilla denominado ecs-template-body.json. Asegúrese de que el archivo del cuerpo de plantilla esté en formato JSON o YAML. La ubicación del archivo se especifica en el parámetro --template-body. En este caso, el archivo del cuerpo de plantilla está ubicado en el directorio actual.

aws cloudformation create-stack \ --stack-name ecs-stack \ --template-body file://ecs-template-body.json

Para asegurarse de que los recursos se creen correctamente, revise la consola de Amazon ECS o use los siguientes comandos:

  • El siguiente comando muestra todas las definiciones de tareas.

    aws ecs list-task-definitions
  • El siguiente comando muestra todos los clústeres.

    aws ecs list-clusters
  • El siguiente comando muestra todos los servicios definidos en el clúster CFNCluster. Reemplace CFNCluster con el nombre del clúster en el que desea crear el servicio.

    aws ecs list-services \ --cluster CFNCluster

Obtener más información sobre AWS CloudFormation

Para conocer más información acerca de AWS CloudFormation, consulte los siguientes recursos: