前回までのあらすじ
今回は前回作ったDockerイメージをAmazon ECSにデプロイしてみます。
Amazon ECSの概念的なところはこちらにまとめてみたので参考にしてください。
Task Definitionを登録する
Task DefinitionはDockerコンテナの起動の仕方を定義するものです。(Docker Composeのcompose.ymlファイルとだいたい同じです。)
Create new Task Definition
Configure via JSON
ECSのコンソールからも登録できますが、実体はJSON形式の定義ファイルです。ここでは説明を簡略化するためにJSONを登録する手順にします。
{
"family": "newgyu-docker",
"containerDefinitions": [
{
"name": "hello",
"image": "newgyu/docker-sample:1.0.0", ←ここを自分のイメージ名にする
"memory": "256",
"essential": true,
"portMappings": [
{
"hostPort": "80",
"containerPort": "80",
"protocol": "tcp"
}
],
"environment": null,
"mountPoints": null,
"volumesFrom": null,
"extraHosts": null,
"logConfiguration": null,
"ulimits": null,
"dockerLabels": null
}
],
"volumes": []
}
右からニュッとでてきた入力欄にJSONを貼り付けます。
項目 | |
---|---|
family | Task Definitionの名前 |
containerDefinitions | n個のコンテナ定義を配列で定義 |
containerDefinitions.name | コンテナの名前 |
containerDefinitions.image | Dockerイメージ名1 |
containerDefinitions.memory | コンテナに割り当てるメモリ量 |
containerDefinitions.portMappings |
docker run するときの-p オプションと同でホストにバインドするポートの定義をn個の配列で指定 |
containerDefinitions.portMappings.hostPort | ホストのポート番号 |
containerDefinitions.portMappings.containerPort | コンテナのポート番号 |
イメージ名は[REGISTRYHOST/][USERNAME/]NAME[:TAG]
の書式でREGISTRYHOST
は省略可能(デフォルトはhub.docker.com
)です。
細かい書き方についてはとりあえず公式ドキュメントを見てねという形でお茶を濁しておきます。
Clusterを作成する
Create Cluster
ここではとりあえずfor-docker-sample
という名前で作成します。
ClusterとEC2インスタンスの紐付け
方法は非常に柔軟ですが、ここではAutoScalingグループを使った手順としますが、AutoScalingの作成は本筋ではないので手を抜いてポイントだけの解説にします。
起動設定の作成
項目 | 設定内容 |
---|---|
AMI | amzn-ami-2015.09.b-amazon-ecs-optimized - ami-3077525e |
インスタンスタイプ | t2.micro(お金があればお好きなのを) |
IAMロール | ecsInstanceRole |
ユーザーデータ | 紐付けたいクラスター名の設定をする2 |
ここが最も重要なポイントでユーザーデータに下記の設定をします。
#!/bin/bash
echo ECS_CLUSTER=for-docker-sample >> /etc/ecs/ecs.config
^^^^^^^^^^^^^^^^
ここに紐付けたいクラスター名を指定する
セキュリティグループの設定はよしなにやってください。
Auto Scaling グループの作成
上記の起動設定を元に作成します。
ELBに紐付けたほうがよいでしょう。
ELBとAutoScalingGroupを紐付ける必要はありません。後述のServiceとELBを紐付けすることでECSがELBへのアタッチ/デタッチの面倒を見てくれます。
(すげー雑)
ClusterにECSインスタンスが紐づく
しばらくするとAuto ScalingグループがEC2インスタンスを起動し、ClusterのECS Instances
というタブに現れます。
仕組み的にはAmazon ECS Container Agent
が上記ユーザーデータで指定されたClusterに参加するように動作する感じです。
Serviceを作成する
Create Service
項目 | なんとなく説明 |
---|---|
Task Definition | Serviceの元となるTask DefinitionでTask Definitionは事前に作成されている必要があります |
Cluster | Serviceを動作させるクラスタを指定します |
Service name | Serviceの識別子で適当にわかりやすい名前をつけてください |
Number of tasks | このService上でTaskをいくつ動かすかを定義します。あとから変更可能です。 |
Load Balancer | 前述の通り負荷分散するためのELBの名前と使うポート番号を指定します。3 |
ELBのリスナー設定のインスタンスポート
とTaskDefinitionのcontainerDefinitions.portMappings.hostPort
をひもづける感じになります。
Serviceが起動する
というところで今回は、前回作ったDockerイメージをAmazon ECSで動かしてみました。