Configuración del archivo Dockerrun.aws.json v2
Dockerrun.aws.json v2 es un archivo de configuración de Elastic Beanstalk que describe cómo implementar un conjunto de contenedores de Docker alojados en un clúster ECS en un entorno de Elastic Beanstalk. La plataforma Elastic Beanstalk crea una definición de tarea de ECS, que incluye una definición de contenedor de ECS. Estas definiciones se describen en el archivo de configuración Dockerrun.aws.json.
La definición de contenedor del archivo Dockerrun.aws.json describe los contenedores que se van a implementar en cada instancia de Amazon EC2 del clúster de ECS. En este caso, una instancia de Amazon EC2 también se denomina instancia de contenedor de host, porque aloja los contenedores de Docker. El archivo de configuración también describe los volúmenes de datos que se deben crear en la instancia de contenedor de host para el montaje de los contenedores de Docker. Para obtener más información y un diagrama de los componentes de un entorno de Docker administrado por ECS en Elastic Beanstalk, consulte la sección Plataforma Docker administrada por ECS anteriormente en este capítulo.
Se puede usar un archivo Dockerrun.aws.json tal como está o incluirlo en un solo archivo junto con el código fuente adicional. El código fuente archivado con un Dockerrun.aws.json se implementa en instancias de contenedor de Amazon EC2; y está accesible en el directorio /var/app/current/.
Temas
Dockerrun.aws.json v2
En el archivo Dockerrun.aws.json se incluyen las siguientes secciones:
- AmazonWebServiceEBDockerrunVersion
-
Especifica el número de versión como el valor
2para los entornos Docker administrados por ECS. - executionRoleArn
-
Especifica los roles de IAM de ejecución de tareas para distintos fines y servicios asociados a su cuenta. Para que su aplicación utilice variables de entorno de almacenadas como secretos de Elastic Beanstalk, tendrá que especificar el ARN de un rol de ejecución de tareas que conceda los permisos necesarios. Es posible que otros casos de uso comunes también requieran este parámetro. Para obtener más información, consulte Formato de ARN del rol de ejecución.
- volumes
-
Crea volúmenes a partir de carpetas de la instancia de contenedor de Amazon EC2 o a partir del paquete de código fuente (implementado en
/var/app/current). Monte estos volúmenes en rutas que estén dentro de los contenedores de Docker mediantemountPointsen la seccióncontainerDefinitions. - containerDefinitions
-
Una matriz de definiciones de contenedor.
- autenticación (opcional)
-
La ubicación en Amazon S3 de un archivo
.dockercfgque contiene los datos de autenticación de un repositorio privado.
Las secciones Definición de contenedor y Volúmenes de Dockerrun.aws.json utilizan el mismo formato que las secciones correspondientes de un archivo de definición de tareas de Amazon ECS. Para obtener más información sobre el formato de definición de tarea y una lista completa de los parámetros de definición de tareas, consulte Definiciones de tareas de Amazon ECS en la Guía para el desarrollador del servicio de contenedores de Amazon Elastic.
Formato del volumen
El parámetro volumen crea volúmenes a partir de carpetas de la instancia de contenedor de Amazon EC2 o a partir del paquete de código fuente (implementado en /var/app/current).
Los volúmenes se especifican en el siguiente formato:
"volumes": [
{
"name": "volumename",
"host": {
"sourcePath": "/path/on/host/instance"
}
}
],
Monte estos volúmenes en rutas que estén dentro de los contenedores de Docker mediante mountPoints en la definición de contenedor.
Elastic Beanstalk configura volúmenes adicionales para los logs, uno para cada contenedor. Estos los deben montar los contenedores de Docker para poder escribir logs en la instancia del host.
Para obtener más información, consulte el campo mountPoints de la sección Formato de definición de contenedor que aparece a continuación.
Formato de ARN del rol de ejecución
Para que su aplicación utilice variables de entorno de almacenadas como secretos de Elastic Beanstalk, tendrá que especificar un rol de IAM de ejecución de tareas. El rol debe conceder al contenedor de Amazon ECS permiso para realizar llamadas a la API de AWS en su nombre utilizando secretos de AWS Secrets Manager o parámetros del Almacén de parámetros de AWS Systems Manager para hacer referencia a información confidencial. Para obtener instrucciones sobre cómo crear un rol de IAM de ejecución de tareas con los permisos necesarios para su cuenta, consulte rol de IAM de ejecución de tareas de Amazon ECS en la Guía para desarrolladores de Amazon Elastic Container Service.
{
"AWSEBDockerrunVersion": 2,
"executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
Permisos adicionales necesarios para la plataforma Docker administrada por Amazon ECS
Concesión de iam:PassRole a ECS por parte del perfil de instancia de EC2
Para que su perfil de instancia de EC2 pueda conceder este rol al contenedor de ECS, debe incluir el permiso de iam:PassRole que se muestra en el siguiente ejemplo. iam:PassRole permite a las instancias de EC2 transferir el rol de ejecución de tareas al contenedor de ECS.
En este ejemplo, limitamos la instancia de EC2 para que transfiera solamente el rol al servicio ECS. Si bien esta condición no es obligatoria, la añadimos para seguir las prácticas recomendadas y reducir el alcance del permiso compartido. Esto lo logramos con el elemento Condition.
nota
Cualquier uso del rol de ejecución de tareas de IAM de ECS requiere el permiso de iam:PassRole. Hay otros casos de uso comunes que requieren el rol de servicio administrado de ejecución de tareas de ECS. Para obtener más información, consulte el Rol de IAM de ejecución de tareas de Amazon ECS en la Guía para desarrolladores de Amazon Elastic Container Service.
ejemplo política con permiso de iam:PassRole
Concesión de acceso a los secretos y parámetros al agente de contenedor de Amazon ECS
El rol de IAM de ejecución de tareas de Amazon ECS también necesita permisos para acceder a los secretos y almacenes de parámetros. Al igual que los requisitos del rol de perfil de instancia de EC2, el agente contenedor de ECS necesita permiso para obtener los recursos necesarios de Secrets Manager o Systems Manager. Para obtener más información, consulte los permisos de Secrets Manager o Systems Manager en la Guía para desarrolladores de Amazon Elastic Container Service.
Concesión de acceso a secretos y parámetros a las instancias de EC2 de Elastic Beanstalk
Para admitir los secretos configurados como variables de entorno, también necesitará agregar permisos a su perfil de instancia de EC2. Para obtener más información, consulte Cómo obtener secretos y parámetros de las variables de entorno de Elastic Beanstalk y Permisos IAM necesarios para Secrets Manager.
Los siguientes ejemplos combinan el ejemplo de iam:PassRole anterior con los ejemplos proporcionados en el documento Permisos IAM necesarios para Secrets Manager al que se hace referencia. Añaden los permisos que las instancias de EC2 requieren para acceder a los almacenes de AWS Secrets Manager y AWS Systems Manager para recuperar los datos de los secretos y parámetros a fin de inicializar las variables de entorno de Elastic Beanstalk que se configuraron para los secretos.
ejemplo Política de Secrets Manager combinada con permisos de iam:PassRole
ejemplo Política de Systems Manager combinada con permisos de iam:PassRole
Formato de definición de contenedor
Los siguientes ejemplos muestran un subconjunto de parámetros que se utilizan habitualmente en la sección Definiciones de contenedor. Hay disponibles otros parámetros opcionales.
La plataforma Beanstalk crea una definición de tarea de ECS, que incluye una definición de contenedor de ECS. Beanstalk admite un subconjunto de parámetros para la definición del contenedor de ECS. Para obtener más información, consulte Definiciones de contenedor en la Guía para desarrolladores de Amazon Elastic Container Service.
Un archivo Dockerrun.aws.json contiene una matriz de uno o varios objetos de definición de contenedor con los siguientes campos:
- name
-
El nombre del contenedor. Consulte Standard Container Definition Parameters (Parámetros de definición de contenedores estándar) para obtener información sobre la longitud máxima y los caracteres permitidos.
- image
-
El nombre de una imagen de Docker en un repositorio Docker insertado desde el que va a crear un contenedor Docker. Tenga en cuenta estas convenciones:
-
Las imágenes de los repositorios oficiales de Docker Hub utilizan un solo nombre (por ejemplo,
ubuntuomongo). -
Las imágenes de otros repositorios de Docker Hub se identifican con un nombre de organización (por ejemplo,
amazon/amazon-ecs-agent. -
Las imágenes de otros repositorios online se cualifican más con un nombre de dominio (por ejemplo,
quay.io/assemblyline/ubuntu).
-
- environment
-
Una matriz de variables de entorno que se va a pasar al contenedor.
Por ejemplo, la siguiente entrada define una variable de entorno con el nombre
Containery el valorPHP:"environment": [ { "name": "Container", "value": "PHP" } ], - essential
-
Es True si la tarea se debe detener si el contenedor produce un error. Los contenedores Nonessential puedan terminar o bloquearse sin que ello afecte al resto de los contenedores de la instancia.
- memory
-
Cantidad de memoria de la instancia de contenedor que se va a reservar para el contenedor. Especifique un entero distinto de cero para uno o ambos parámetros
memoryomemoryReservationen las definiciones de contenedor. - memoryReservation
-
El límite flexible (en MiB) de memoria que reservar para el contenedor. Especifique un entero distinto de cero para uno o ambos parámetros
memoryomemoryReservationen las definiciones de contenedor. - mountPoints
-
Volúmenes de la instancia de contenedor de Amazon EC2; que se van a montar y la ubicación en el sistema de archivos del contenedor de Docker en la que se van a montar. Cuando se montan volúmenes que incluyen contenido de aplicaciones, el contenedor puede leer los datos que se cargan en el paquete de código fuente. Cuando se montan volúmenes de logs para escribir datos de log, Elastic Beanstalk puede recopilar datos de log de estos volúmenes.
Elastic Beanstalk crea volúmenes de logs en la instancia de contenedor, uno para cada contenedor de Docker, en
/var/log/containers/. Estos volúmenes se denominancontainernameawseb-logs-y deben montarse en la ubicación dentro de la estructura de archivos del contenedor donde se escriben los logs.containernamePor ejemplo, el siguiente punto de montaje asigna la ubicación de los registros de nginx en el contenedor al volumen generado por Elastic Beanstalk para el contenedor
nginx-proxy.{ "sourceVolume": "awseb-logs-nginx-proxy", "containerPath": "/var/log/nginx" } - portMappings
-
Asigna puertos de red del contenedor a puertos del host.
- links
-
Lista de contenedores que se van a vincular. Los contenedores vinculados pueden detectarse entre sí y comunicarse de forma segura.
- volumesFrom
-
Esta opción le permite montar todos los volúmenes desde un contenedor diferente. Por ejemplo, para montar volúmenes desde un contenedor con el nombre
web:"volumesFrom": [ { "sourceContainer": "web" } ],
Formato de autenticación: uso de imágenes de un repositorio privado
La sección authentication contiene los datos de autenticación de un repositorio privado. Esta entrada es opcional.
Añada la información sobre el bucket de Amazon S3; que contiene el archivo de autenticación en el parámetro authentication del archivo Dockerrun.aws.json. Asegúrese de que el parámetro authentication contiene un bucket de Amazon S3 y una clave válidos. El bucket de Amazon S3; debe estar alojado en la misma región que el entorno que lo está utilizando. Elastic Beanstalk no descargará archivos de los buckets de Amazon S3 alojados en otras regiones.
Usa el siguiente formato:
"authentication": {
"bucket": "amzn-s3-demo-bucket",
"key": "mydockercfg"
},
Para obtener información sobre cómo generar y cargar el archivo de autenticación, consulte Autenticación con repositorios de imágenes.
Ejemplo Dockerrun.aws.json v2
El siguiente fragmento es un ejemplo que ilustra la sintaxis del archivo Dockerrun.aws.json para una instancia con dos contenedores.
{
"AWSEBDockerrunVersion": 2,
"volumes": [
{
"name": "php-app",
"host": {
"sourcePath": "/var/app/current/php-app"
}
},
{
"name": "nginx-proxy-conf",
"host": {
"sourcePath": "/var/app/current/proxy/conf.d"
}
}
],
"containerDefinitions": [
{
"name": "php-app",
"image": "php:fpm",
"environment": [
{
"name": "Container",
"value": "PHP"
}
],
"essential": true,
"memory": 128,
"mountPoints": [
{
"sourceVolume": "php-app",
"containerPath": "/var/www/html",
"readOnly": true
}
]
},
{
"name": "nginx-proxy",
"image": "nginx",
"essential": true,
"memory": 128,
"portMappings": [
{
"hostPort": 80,
"containerPort": 80
}
],
"links": [
"php-app"
],
"mountPoints": [
{
"sourceVolume": "php-app",
"containerPath": "/var/www/html",
"readOnly": true
},
{
"sourceVolume": "nginx-proxy-conf",
"containerPath": "/etc/nginx/conf.d",
"readOnly": true
},
{
"sourceVolume": "awseb-logs-nginx-proxy",
"containerPath": "/var/log/nginx"
}
]
}
]
}