Amazon ECS reference architecture
This is an Amazon EC2 Container Service reference architecture with cloudformation templates that helps you provision a complete Amazon ECS environment with many advanced optional features.
ecs-cfn-refarch
will not generate the following resources for you. Make sure you have created them.
create a custom.mk
file and customize your parameters in this file
# git clone the project
$ git clone https://github.com/pahud/ecs-cfn-refarch.git
$ cd ecs-cfn-refarch
$ cp custom.mk.sample custom.mk
$ vim custom.mk
Create the cluster
# create the cluster
$ make create-ecs-cluster
click the link to the cloudformation console. The whole stack should be created in 5–7minutes.
When the cloudformation is completed. Check the stach output:
# check the stack output
$ make describe-ecs-cluster
Response
[
{
"OutputKey": "GreetingURL",
"OutputValue": "http://ecsdemo-MAIN-1M6ASY034M08X-alb-2131750000.ap-northeast-1.elb.amazonaws.com/greeting.html"
},
{
"OutputKey": "URL",
"OutputValue": "http://ecsdemo-MAIN-1M6ASY034M08X-alb-2131750000.ap-northeast-1.elb.amazonaws.com"
}
]
click the URL
and you'll see the phpinfo page, wihch is served by ECS Tasks behind ALB.
If you cURL the GreetingURL
, you'll get a static page containing credentials stored in SSM Parameter Store(i.e.ECSYourName
and ECSYourPassword
). The credentials were retrieved by ECS Execution Role from SSM Parameter on task bootstrapping and is injected into the environment variables.(details)
$ curl http://ecsdemo-MAIN-1M6ASY034M08X-alb-2131750000.ap-northeast-1.elb.amazonaws.com/greeting.html
<!DOCTYPE html>
<html>
<head>
<title>EC2 Parameter Store demo</title>
</head>
<body>
<p>
<h1>Hi DefaultName!</h1>
<p>
<h2>Your password is DefaultPassword!</h2>
By default, instances will have instance-purchase-option
attributes either ondemand
or spot
(implementation detail).
For example, list all the instances with instance-purchase-option=spot
:
$ aws ecs list-attributes --target-type container-instance --region ap-northeast-1 --cluster ecsdemo-MAIN-IKGTIS1HXS9J-ecs-cluster --attribute-name instance-purchase-option --attribute-value spot
{
"attributes": [
{
"targetId": "arn:aws:ecs:ap-northeast-1:903779448426:container-instance/22119ce6-bcfc-488d-ba8a-d005f2f6237f",
"name": "instance-purchase-option",
"value": "spot"
},
{
"targetId": "arn:aws:ecs:ap-northeast-1:903779448426:container-instance/0dbf6399-e51d-4fe7-a6b8-c86019d101bc",
"name": "instance-purchase-option",
"value": "spot"
},
{
"targetId": "arn:aws:ecs:ap-northeast-1:903779448426:container-instance/097bec0a-11c2-4c5a-8231-b82f387574ce",
"name": "instance-purchase-option",
"value": "spot"
}
]
}
Optionally, you may define your task placement constraints to explicitly deploy
ECS tasks on ondemand
or spot
.
"placementConstraints": [
{
"expression": "attribute:instance-purchase-option == spot",
"type": "memberOf"
}
]
This will give you better control over the taks placement based on the constraints expression.
# delete the stacks
$ make delete-ecs-cluster