Estoy ejecutando un solo contenedor Docker en Elastic Beanstalk usando su Configuración de Docker de contenedor único e intento enviar la salida estándar de la aplicación a CloudWatch usando el controlador de registro awslogs .
EB busca un archivo Dockerrun.aws.json para la configuración del contenedor, pero por lo que puedo ver, no tiene la opción de usar awslogs como controlador de registro del contenedor (o agregar otras marcas al comando docker run para ese asunto).
Intenté piratear el comando de docker run usando la respuesta proporcionada aquí , agregando un archivo .ebextensions/01-commands.config con contenido:
commands: add_awslogs: command: 'sudo sed -i "s/docker run -d/docker run --log-driver=awslogs --log-opt awslogs-region=eu-west-2 --log-opt awslogs-group=dockerContainerLogs -d/" /opt/elasticbeanstalk/hooks/appdeploy/enact/00run.sh'Esto funciona, en el sentido de que modifica el script de ejecución y los registros aparecen en CloudWatch.
Pero la aplicación EB muere. El contenedor está arriba, pero no responde a las solicitudes.
Encuentro el siguiente error en los registros del contenedor:
El comando "logs" solo es compatible con los controladores de registro "json-file" y "journald" (obtenido: awslogs)
Encuentro respuestas a preguntas similares relacionadas con ECS (no EB) que sugieren agregar ECS_AVAILABLE_LOGGING_DRIVERS con awslogs. Pero no encuentro este ajuste de configuración en EB.
¿Alguna idea?
Estoy publicando aquí la respuesta que recibí del soporte de AWS:
Dado que el entorno de un solo contenedor de Elastic Beanstalk guardará el stdout y el stderr en /var/log/eb-docker/containers/eb-current-app/ de forma predeterminada, y dado que la nueva pila de soluciones le permite la opción de transmitir registros a cloudwatch, automatizando la configuración del agente de AWSLogs en las instancias, lo que recomiendo hacer es agregar una extensión eb para agregar los archivos de registro stdout y stderr a la configuración de cloudwatch y usar el agente ya configurado para transmitir esos archivos a los registros de cloudwatch. en lugar de tocar los ganchos previos, que AWS no admite, ya que los ganchos pueden cambiar de una versión de pila de solución a otra.
Con respecto al error que está viendo, el comando "logs" solo es compatible con los controladores de registro "json-file" y "journald" (obtenido: awslogs)", este error se debe a cómo funciona Docker, cuando está configurado para enviar registros a otro controlador al lado json-file o journald no podrá mostrar registros localmente ya que no tiene una copia local de ellos.
### BEGIN .ebextensions/logs.config option_settings: - namespace: aws:elasticbeanstalk:cloudwatch:logs option_name: StreamLogs value: true - namespace: aws:elasticbeanstalk:cloudwatch:logs option_name: DeleteOnTerminate value: false - namespace: aws:elasticbeanstalk:cloudwatch:logs option_name: RetentionInDays value: 7 files: "/etc/awslogs/config/stdout.conf": mode: "000755" owner: root group: root content: | [docker-stdout] log_group_name=/aws/elasticbeanstalk/environment_name/docker-stdout log_stream_name={instance_id} file=/var/log/eb-docker/containers/eb-current-app/*-stdouterr.log commands: "00_restart_awslogs": command: service awslogs restart ### END .ebextensions/logs.configPude ampliar la respuesta anterior para un entorno de beanstalk elástico de varios contenedores, así como inyectar el nombre del entorno. Tuve que otorgar el permiso correcto en el rol de ec2 para poder crear el grupo de registros. Puedes ver si está funcionando mirando en:
/var/log/awslogs.logesto va en .ebextensions/logs.config
option_settings: - namespace: aws:elasticbeanstalk:cloudwatch:logs option_name: StreamLogs value: true - namespace: aws:elasticbeanstalk:cloudwatch:logs option_name: DeleteOnTerminate value: false - namespace: aws:elasticbeanstalk:cloudwatch:logs option_name: RetentionInDays value: 14 files: "/etc/awslogs/config/stdout.conf": mode: "000755" owner: root group: root content: | [/var/log/containers/docker-stdout] log_group_name=/aws/elasticbeanstalk/`{ "Ref" : "AWSEBEnvironmentName" }`/docker-stdout.log log_stream_name={instance_id} file=/var/log/containers/*-stdouterr.log commands: "00_restart_awslogs": command: service awslogs restart