Create new Elastic Container Service (ECS) task definition revision

A bash script example showing how to create a new revision of an ECS task definition, with variables for image URI, and other values.

Nathan Peck
Nathan Peck
Senior Developer Advocate at AWS

About

This script demonstrates the use of a Bash here document to embed a task definition template in a deploy script. You can interpolate variable values from the bash script into the task definition template, and then pass the entire JSON structure to the aws ecs create-task-definition CLI command using the --cli-input-json flag.

Example deploy script

File: script.sh Language: sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
IMAGE_URL="httpd:2.4"
CPU=256
MEMORY=512

export TASK_DEFINITION=$(cat << EOF
{
   "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": "$IMAGE_URL",
         "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": "$CPU",
   "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
   "family": "fargate-task-definition",
   "memory": "$MEMORY",
   "networkMode": "awsvpc",
   "requiresCompatibilities": [
       "FARGATE"
    ]
}
EOF
)

aws ecs register-task-definition --cli-input-json "$TASK_DEFINITION"

Installation

Download the script and use chmod on the command line to make it executable:

chmod +x script.sh

You can then run the script on the command line with

./script.sh

Next steps

  • Customize the embedded task definition with your own application’s details
  • Add some docker commands to the top of the script to build and push a new version of your container image
  • Add the script to your Git repository and use a CI/CD solution to automatically run the deploy script whenever you merge code into your repository.