Inject configuration files in an Elastic Container Service (ECS) task definition
The following snippet shows how to do runtime file generation and injection in an ECS task definition.
It launches an NGINX reverse proxy server, directly from Amazon Elastic Container Registry Public. This default container does not do anything except show a simple "welcome to NGINX" message. However, we can use a command to generate the custom NGINX configuration at runtime, prior to launching the container. Because this command runs inside the container as it launches we can even use custom environment variables from the task definition.
TIP
You will find that the richer feature set of YAML makes the embedded config file in the CloudFormation YAML much easier to read than the single line string inside of the raw JSON task definition.
If you intend to create more advanced task definitions it is highly recommended to use AWS CloudFormation. If you do not wish to use CloudFormation then consider still writing your task definitions in YAML, and use yq
to convert the YAML to JSON for the ECS API.
- AWS CloudFormation
- Raw JSON
AWSTemplateFormatVersion: '2010-09-09'
Description: An example task definition which self generates and injects
a config file for the running application.
Resources:
InjectorTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
Family: nginx-ingress
Cpu: 256
Memory: 128
ContainerDefinitions:
- Name: nginx
Image: public.ecr.aws/nginx/nginx:mainline
EntryPoint:
- '/bin/sh'
- '-c'
Environment:
- Name: MY_URL_ENV_VARIABLE
Value: http://myupstreamhost.com
Command:
- >
echo "
events {
worker_connections 1024;
}
http
{
upstream ingress
{
server $MY_URL_ENV_VARIABLE;
}
server {
listen 8080;
location /
{
proxy_pass http://ingress;
proxy_set_header Host \$host;
proxy_pass_request_headers on;
}
}
}
" > /etc/nginx/nginx.conf &&
exec nginx -g 'daemon off;'
Deploy the CloudFormation template above by using the AWS CloudFormation web console. Alternatively you can deploy from the command line with:
aws cloudformation deploy \
--stack-name sample-task-definition \
--template-file task-definition.yml