EC2インスタンスがECSインスタンスとして認識されないときに確認すること

こんにちは。beaglesoftの真鍋です。

ECSを利用しているときにスポットインスタンスなどのEC2インスタンスを追加でを利用することは多いと思います。そんなときにスポットインスタンスを購入してもECSに紐付かないということがありました。

-- 追記ここから 以下に当時の対応方法をまとめていたのですが、そもそも下記の原因を特定するためにはコンテナインスタンスのログを確認することが重要です。

コンテナインスタンスのログはコンテナインスタンスにsshでログインして/var/log/ecs/ecs-agent.log.xxxxを参照することで確認できます。

Amazon ECS ログファイルの場所 - Amazon Elastic Container Service

-- 追記ここまで

どうしてだろうかということでいろいろと確認したのですが、それぞれの事象で次の2つのことが原因だったのでメモします。

  1. 起動設定のユーザーデータにクラスタとの関連を定義していない。
  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管理ポリシーのAmazonEC2ContainerServiceforEC2RoleecsInstanceRoleに設定するほうが良いと思います。

{
    "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インスタンスに関する画面より確認できます。

EC2 Management Console (1).png (44.5 kB)

まとめ

これだけが原因でないことが多いのですが、ECS便利なのにいろいろと触り始めはハマることが多いのでメモとして残しておきたいと思います。

追記

そもそもECSインスタンスにはログが出力されているのでそちらを確認することを始めに行うべきなため追記しました。