こんにちは。beaglesoftの真鍋です。
ECSを利用しているときにスポットインスタンスなどのEC2インスタンスを追加でを利用することは多いと思います。そんなときにスポットインスタンスを購入してもECSに紐付かないということがありました。
-- 追記ここから
以下に当時の対応方法をまとめていたのですが、そもそも下記の原因を特定するためにはコンテナインスタンスのログを確認することが重要です。
コンテナインスタンスのログはコンテナインスタンスにsshでログインして/var/log/ecs/ecs-agent.log.xxxx
を参照することで確認できます。
Amazon ECS ログファイルの場所 - Amazon Elastic Container Service
-- 追記ここまで
どうしてだろうかということでいろいろと確認したのですが、それぞれの事象で次の2つのことが原因だったのでメモします。
- 起動設定のユーザーデータにクラスタとの関連を定義していない。
- ロールを設定していない。
起動設定のユーザーデータにクラスタとの関連を定義していない
作成したEC2インスタンスをECSインスタンス
として関連付けるためには、EC2インスタンスのユーザーデータに以下の設定を行う必要があります。
#!/bin/bash
echo ECS_CLUSTER={クラスタ名} >> /etc/ecs/ecs.config
この設定を行わないと作成したEC2インスタンスがECSインスタンスとして関連づきません。
ロールを設定していない
EC2インスタンスがECSインスタンスとして設定されるにはいくつかの権限が必要になります。これらの権限はポリシーとして定義した上で、ecsInstanceRole
として設定します。このことについてはAmazon ECS コンテナインスタンスの IAM ロール - Amazon EC2 Container Serviceに詳細があります。
設定するポリシーは以下の通りとなります。これはAmazonEC2ContainerServiceforEC2Role
の内容と同じなので、AWS管理ポリシーのAmazonEC2ContainerServiceforEC2Role
をecsInstanceRole
に設定するほうが良いと思います。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:CreateCluster",
"ecs:DeregisterContainerInstance",
"ecs:DiscoverPollEndpoint",
"ecs:Poll",
"ecs:RegisterContainerInstance",
"ecs:StartTelemetrySession",
"ecs:UpdateContainerInstancesState",
"ecs:Submit*",
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
このecsInstanceRole
をEC2インスタンスのIAMロール
として設定する必要があります。この設定はコンソールのEC2インスタンスに関する画面より確認できます。
まとめ
これだけが原因でないことが多いのですが、ECS便利なのにいろいろと触り始めはハマることが多いのでメモとして残しておきたいと思います。
追記
そもそもECSインスタンスにはログが出力されているのでそちらを確認することを始めに行うべきなため追記しました。