You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
If you would like to persist data from your ECS containers, i.e. hosting databases like MySQL or MongoDB with Docker, you need to ensure that you can mount the data directory of the database in the container to volume that's not going to dissappear when your container or worse yet, the EC2 instance that hosts your containers, is restarted or scaled up or down for any reason.
Don't know how to create your own AWS ECS Cluster? Go here!
New Cluster
Follow the directions in the referenced guide to start setting up your cluster.
When configuring the EC2 Container Instance, choose Advanced Details
Paste the following script in to the User data field:
#!/bin/bash# Install nfs-utils
cloud-init-per once yum_update yum update -y
cloud-init-per once install_nfs_utils yum install -y nfs-utils
# Create /efs folder
cloud-init-per once mkdir_efs mkdir /efs
# Mount /efs
cloud-init-per once mount_efs echo -e 'fs-abcd1234.efs.us-east-1.amazonaws.com:/ /efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0'>> /etc/fstab
mount -a
# Set any ECS agent configuration optionsecho"ECS_CLUSTER=default">> /etc/ecs/ecs.config
If you are not using the default cluster, be sure to replace the ECS_CLUSTER=default line
If you are not using the default cluster, be sure to replace the ECS_CLUSTER=default line
This is a multi-step configuration -- easy mistakes are likely. Be patient! The pay-off will be worth it. Rudimentary knowledge and awareness of the AWS landscape is not necessarily required, but will make it easier to set things up.
Some of the instructions make references to package.json for npm script for AWS ECS users. You may safely ignore these steps.
Creating Amazon ECS Infrastructure
Create Cluster
Go to Amazon ECS
Clusters -> Create Cluster
Name: prod-ecs-cluster
On-Demand Instance
2 m4.large instances across two AZs for highly available config
Create new prod-vpc
Create new prod-security-group
Allow port 80 and 443 for HTTP and HTTPS inbound
9.Allow port range 32768-61000 so that ECS can dynamically scale instances and run healh checks
10.Container instance IAM role: ecsIntanceRole
11.Create
Verify Security Group Config
This is a big deal.
Go EC2 -> Network & Security -> Security Groups
Verify there ports are open:
Type
Protocol
Port Range
Source
HTTP (80)
TCP (6)
80
0.0.0.0/0
HTTP (80)
TCP (6)
80
::/0
Custom TCP Rule
TCP (6)
32768-61000
0.0.0.0/0
HTTPS (443)
TCP (6)
443
0.0.0.0/0
HTTPS (443)
TCP (6)
443
::/0
Create Container Repository
Go to Amazon ECS
Repositories -> Create Repository
Enter your app-name
Copy repository URI, add to package.json
“imageRepo”: “000000000000.dkr.ecr.us-east-1.amazonaws.com/app-name"
Create
Create Task Definition
Go to Amazon ECS
Task Definitions -> Create new Task Definition
Name: app-name-task, role: none, network: bridge
Add container, name: app-name from before, image: URI from before, but append ":latest"
Choose or create SSL cert (star is recommended: add *.yourdomain.com and yourdomain.com separately on the cert)
Select default ELB security policy
Next
Create prod-cluster specific security group only allowing port 80 and 443 inbound
Next
New target group, name: app-name
Health-checks: Keep default "/" if serving a website on HTTP, but if deploying an API and/or redirecting all HTTP calls to HTTPS, ensure your app defines a custom route that is not redirected to HTTPS. On HTTP server GET "/healthCheck" return simple 200 message saying "I'm healthy" -- verify that this does not redirect to HTTPS, otherwise lot's of pain and suffering will occur. Health checks on AWS will fail.
Next:Review, then Create
Create Service
Go to Amazon ECS
Clusters -> Select "prod-ecs-cluster"
Task Definition: app-name-task from before
Service name: app-name
No of tasks: 2, min healthy: 100, max healthy: 200 for highly available blue/green deployment setup
Configure ELB
6.1. Application Load Balancer
6.2. ecsServiceRole
6.3. Select app-name-prod-elb from before
6.4. Select app-name:0:3000 container from before
6.5. Add to ELB
6.6. Target Group Name: app-name from before
6.7. Save
Create Service
View Service
Verify information
Build image with npm run image:build
Publish and release image with npm run aws:publish
On the Service Events tabs keep an eye on health check errors
Go to the ELB DNS address and see if your app works.
If you used Route 53 to connect your domain with your ELB or through your own DNS provider, then go to the URL and see if things work.
I Would Like to Persist Data
If you'd like to persist data in your containers via Docker volume mounting, then configure EFS. See this guide.
Troubleshooting
ELB DNS works, but URL doesn't? Your DNS configuration is wrong.
ELB DNS doesn't work. Then check the health of your ECS Service, see step 3 below.
Go to ECS -> Your Cluster -> click on Your Service and switch to the events tab:
If you don't see service your-app has reached a steady state. then your container is having trouble starting or AWS is failing to perform a health check.
To see what's wrong with your container, go to the Cloudwatch Logs you setup earlier and you'll be able to see the console logs of your application.
Service is healthy, logs look fine. Things still don't work? Then re-check security group port rules and target group port rules and any AWS IAM security role you may have setup or may be overriding some default behavior that hasn't been covered.