Amazon EC2 Container ServiceをGUIから試してAWS側で用意したサンプルWebアプリを動かしたときのメモ。
サンプルを利用することで2つのコンテナ(Docker)で構成された静的なWebアプリにアクセスできました。
参考
Get Startted
最初の画面では Get Started を選択します
Step1 Welcome to Amazon ECS
今回は独自の設定をするわけでなく、AWSの用意したサンプルを使うのでAmazon ECS sampleを選択します
Step2 Create Task Definition from sample
次の画面では利用するコンテナ(docker)とボリュームを指定します。サンプルではsample-appというhttpdのコンテナとWebアプリのhtmlを保存するコンテナのbusyboxを使っています。
仕組みなどについては下記が参考になりました。
Data Volume と Data Volume Container
本サンプルでではどのようなhtmlを配置しているかについては上記画面のJSONタブを表示することで確認できます。
ちなみに以下のように設定されています。
{
"family": "console-sample-app-static",
"containerDefinitions": [
{
"name": "simple-app",
"image": "httpd:2.4",
"cpu": "10",
"memory": "300",
"environment": [],
"portMappings": [
{
"hostPort": "80",
"containerPort": "80"
}
],
"volumesFrom": [],
"links": [],
"mountPoints": [
{
"sourceVolume": "my-vol",
"containerPath": "/usr/local/apache2/htdocs"
}
],
"essential": true
},
{
"name": "busybox",
"image": "busybox",
"cpu": "10",
"memory": "200",
"entryPoint": [
"sh",
"-c"
],
"environment": [],
"command": [
"/bin/sh -c \"while true; do 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>' > top; /bin/date > date ; echo '</div></body></html>' > bottom; cat top date bottom > /usr/local/apache2/htdocs/index.html ; sleep 1; done\""
],
"portMappings": [],
"volumesFrom": [
{
"sourceContainer": "simple-app"
}
],
"links": [],
"mountPoints": [],
"essential": false
}
],
"volumes": [
{
"name": "my-vol",
"host": {}
}
]
}
Step3 Schedule Tasks
本画面ではタスクを以下のいずれかに設定します。
- Run Tasks Once
- Create a service
バッチ処理のような1回のみ処理を行う場合にはRun Tasks Onceを設定しますが、今回のhttpdのような永続的に実行されるものの場合、Create a serviceの方を選びます。
Desired number of TasksとService Nameはデフォルトのままとします。
ElasticLoadBalanceについてはsimple-app:80を選択し、それ以外の設定はデフォルトとします。
ちなみに最初に上記値でNoELBを選択し、そのまま進めてみたのですが、クラスタの作成時に以下のようなエラーが表示されてしまいました。。。
Created Service sample-webapp failed
A role was passed, but no load balancers were present.
また、実際にインスタンスにSSHログインして確認しましたが、httpdとbusyboxのdockerが起動していませんでした。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e57e72e78e8f amazon/amazon-ecs-agent:latest "/agent" 11 minutes ago Up 11 minutes 127.0.0.1:51678->51678/tcp ecs-agent
Step4 Configure Cluster
コンテナ(docker)を実行するEC2の設定を行います。
はじめに起動するインスタンス数やインスタンスタイプ、KeyPairを選択します。
特に問題なければKeyPairのみ利用するものに変更します。
次にアクセス元のIPアドレスを記載します。ここで指定したIPアドレスからのみ起動するhttpdにアクセスできます。特に制限をしない場合、デフォルトの0.0.0.0/0のままとします。
対象のEC2からECSの操作をするためにIAMロールを設定します。初めてECSを操作する場合、Create IAM Rolesボタンを押下することでECSを操作するためのIAMロールを作成できます。
Launch
全体の構成を確認し、問題なければLaunchします。EC2の起動や設定などをCloudFormationを使っているようで、詳細を確認したい場合、リンクをクリックしてCloudFormationの画面で実施内容など確認できます。以下はECS上での進捗状況の確認画面となります。
起動が完了すると起動したEC2やELBの情報など様々な情報が確認できます。
起動直後はsample-webappのStatsuがPENDINGとなっていますが、少し時間が経つとRUNNINGに変わります。
また、上記よりELBの画面を確認し、インスタンスがELBにアタッチされているのを確認します。アタッチ済みであればELBで設定されているURLにアクセスしてみます。
問題なければ以下のような画面が表示されます。
対象のインスタンスにSSHログインしてみる
上記のGUIによる設定をした場合、コンテナ(docker)を動かすEC2にKeyPariの設定はされていますが、SecurityGroupの設定で22の許可がされていないため、対象のEC2にはログインできません。ECSを使えばSSHしなくても大丈夫ということだと思うのですが、何かあって調査できるようにするためにSSHログインできるようにしてみます。(運用する場合はSSHログインできない状態のままとするのが正しいと思います)
ECSの画面からdockerを動かすために起動されたEC2が確認できるのでそのEC2に設定されたSecurityGroupの22ポートを開放すればOKです。
$ssh ec2-user@52.69.31.141 -i hogefugaKey.pem
__| __| __|
_| ( \__ \ Amazon ECS-Optimized Amazon Linux AMI 2015.03.d
____|\___|____/
For documentation visit, http://aws.amazon.com/documentation/ecs
2 package(s) needed for security, out of 2 available
Run "sudo yum update" to apply all updates.
docker ps
コマンドをタイプすることでGUIで指定した2つのdockerとECSと通信を行うecs-agentというdockerが動作しているのが確認できます。
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e292fd54f47 busybox:latest "\"sh -c '/bin/sh -c 8 hours ago Up 8 hours ecs-console-sample-app-static-5-busybox-86f3a5c7add9d5fd4d00
9c7dd2d8490b httpd:2.4 "httpd-foreground" 8 hours ago Up 8 hours 0.0.0.0:80->80/tcp ecs-console-sample-app-static-5-simple-app-9aefdfbc92fcbce23600
b6cd81e19b7d amazon/amazon-ecs-agent:latest "/agent" 8 hours ago Up 8 hours 127.0.0.1:51678->51678/tcp ecs-agent
お掃除
一通り確認が終わったので削除します。
ECSの画面からクラスタを削除しようとすると以下のエラーが表示され、削除ができません。。。。
Unable to delete cluster
The Cluster cannot be deleted while Container Instances are active.
削除するときの注意画面で「CloudFormation使ってStackの更新か削除をしてね」とあったので、CloudFormationの画面からECS作成時のStackを選択し、delete stackします。stack名は EC2ContainerService-default-xxxxxという形になっているかと思いますのでそのstackをdelete stackして削除します。
CloudFromationで削除したのはあくまでStackと関連したリソースのみ(ELB,EC2,SecurityGroup etc...)でECSのクラスタ、サービスは残っているのでECSの画面から削除します。
まずは sample-webapp サービスを削除します。
がGUIから削除しようとすると以下のエラーが。。
The service cannot be stopped while the primary deployment is scaled above 0.
検索すると以下の記事を発見。
Delete a cluster : impossible ! (Via UI or CLI)
上記記事に従ってコマンドを実施します。
$aws ecs update-service --service sample-webapp --desired-count 0
上記実施後、GUIからサービスを削除することが出来ました。。。
また、サービス削除後であればGUIからクラスタの削除も可能となります。