AWS - Basic ECS Setup
Updated at 2015-09-30 23:05
You need Docker to build the image for deployment.
# install https://www.docker.com/toolbox
# remember to choose your terminal app (iTerm Always) during installation
# run Docker Quickstart Terminal in your Applications
# wait for the VM to start up, this can take a while
# copy the IP e.g. 192.168.99.100
# open /etc/hosts and add Docker Virtual Machine IP there:
192.168.99.100 dockerhost
Start a new Go project.
mkdir gromash
cd gromash
touch main.go
touch Dockefile
Create Dockerfile
.
FROM golang
ADD . /go/src/gromash
RUN go install gromash
ENTRYPOINT /go/bin/gromash
EXPOSE 8080
Create main.go
.
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
http.HandleFunc("/", indexHandler)
addr := ":8080"
fmt.Printf("Starting server at %s\n", time.Now())
err := http.ListenAndServe(addr, nil)
if err != nil {
panic(err)
}
}
func indexHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Time is %s", time.Now())
}
Test that the Go app works.
go run main.go
# localhost:8080, works? ok, stop it
Build the Docker image and test that it still works.
docker build -t ruksi/gromash .
docker run -d --publish 6060:8080 --name gromash-ps ruksi/gromash
# dockerhost:6060, works? cool.
docker exec -t -i gromash-ps /bin/bash # to get inside the container
docker rm -f gromash-ps
Upload Docker image to Docker Hub.
# create Docker Hub account (repository for Docker images)
docker login
docker info
docker push ruksi/gromash
# soon you will see your new image in Docker Hub
# setup ECS container instance cluster here...
Login to AWS
IAM:
Dashboard:
Create Account Alias...
https://company.signin.aws.amazon.com/console
Create Group
Name: Administrators
Policies: AdministratorAccess
Create User
Name: yourname
Group: Add to Administrators
Manage Passwords -> Create Password
Logout
Login again at https://company.signin.aws.amazon.com/console
EC2:
Key Pairs
Create Key Pair
Note: keypairs are region specific, choose deployment region.
Name: id_yourname_company_uswest1
Move keypair to ~/.ssh
`chmod 400 id_yourname_company_uswest1.pem`
VPC Dashboard:
Start VPC Wizard
Choose VPC with a Single Public Subnet
VPC name: Container_VPC
Create VPC
Security Groups:
Create Security Group
Name tag: Container_SG_uswest1
Description: SG for ECS
Inbound Rules:
HTTP TCP 80 0.0.0.0/0
HTTPS TCP 443 0.0.0.0/0
SSH TCP 22 */32 # * = http://checkip.amazonaws.com
Go to ECS console and start custom task wizard.
- Or go straight to Cluster Management.
- TODO: try the straight option, the wizard is crap.
Create Custom Task:
Add Container Definition:
Container Name: gromash
Image: ruksi/gromash
Memory: 500
CPU Units: 10
Essential: Yes
Port Mappings: 80 (Host) <-> 8080 (Container), TCP
Add Volume:
Name: gromash-volume
Source Path: (empty)
Next Step
Schedule Tasks:
Create a Service
Desired number of Tasks: 1
Service Name: gromash-service
Elastic Load Balancing: no
Next Step
Configure Cluster:
Number of Instances: 1
Instance Type: t2.micro
Key Pair Name: id_yourname_company_uswest1
Security Ingress CIDR: */32 # * = http://checkip.amazonaws.com
IAM Role Information:
Create IAM Roles
ecsInstanceRole
Review
Launch
Wait for the cluster to start up, takes a couple of minutes...
aws --version
# if not installed
curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
aws --version
aws configure
WS Access Key ID [None]: ***
AWS Secret Access Key [None]: ***
Default region name [None]: us-west-1
Default output format [None]:
Create gromash-task-def.json
.
{
"family": "gromash-family",
"volumes": [
{
"name": "gromash-volume",
"host": {}
}
],
"containerDefinitions": [
{
"environment": [],
"name": "gromash-app",
"image": "ruksi/gromash",
"cpu": 10,
"memory": 500,
"portMappings": [
{
"containerPort": 8080,
"hostPort": 80
}
],
"mountPoints": [
{
"sourceVolume": "gromash-volume",
"containerPath": "/go/src/gromash"
}
],
"command": [
"go build"
],
"entryPoint": [
"/go/bin/gromash"
],
"essential": true
}
]
}
aws ecs register-task-definition --cli-input-json file://gromash-task-def.json
Create service based on the task definition.
ECS:
default:
Services:
Create
Task Definition: gromash-family:1
Cluster: default
Service Name: gromash-1
Number of Tasks: 1
Elastic Load Balancing: no
Go to EC2 console, copy the instance DNS: http://xxxxxxxxxxxx.us-west-1.compute.amazonaws.com/
Navigate to that with your browser. Now you have a Go server cluster with a single server, congratulations!
Notes:
- You cannot add more tasks to this service because there isn't enough ports, CPU or memory.
- If you want to remove the resources created in this note:
- go to CloudFormation console and press Delete Stack
- go to the ECS, clusters, gromash-1, reduce number of tasks to 0
- delete the ECS service
gromash-1
- delete the ECS cluster
default
- go to VPC, delete the
Container_VPC