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
Para conocer más información acerca de AWS CloudFormation, consulte los siguientes recursos: