web-dev-qa-db-ja.com

タスク実行時のAWS ECSエラー:クラスターでコンテナーインスタンスが見つかりませんでした

dockerを使用してAWSコンテナーイメージをECSにデプロイしようとしていますが、EC2インスタンスは作成されていません。次のエラーを受け取った理由の説明を探して、インターネットを探しました。

「RunTask操作を呼び出すときに、クライアントエラー(InvalidParameterException)が発生しました:クラスターでコンテナーインスタンスが見つかりませんでした。」

ここに私の手順があります:

1. UbuntuからAmazon ECSリポジトリにdockerイメージをプッシュしました。

2. ECSタスク定義を登録しました:

aws ecs register-task-definition --cli-input-json file://path/to/my-task.json 

3.タスクを実行しました:

aws ecs run-task --task-definition my-task

しかし、それは失敗します。

ここに私のタスク:

{
  "family": "my-task",
  "containerDefinitions": [
    {
        "environment": [],
        "name": "my-container",
        "image": "my-namespace/my-image",
        "cpu": 10,
        "memory": 500,
        "portMappings": [
            {
                "containerPort": 8080,
                "hostPort": 80
            }
        ],
        "entryPoint": [
            "Java",
            "-jar",
            "my-jar.jar"
        ],
        "essential": true
    }
  ]
}

また、管理コンソールを使用してクラスターとサービスを構成しようとしましたが、同じエラーが発生します。 ec2インスタンスを持つようにクラスターを構成するにはどうすればよいですか?また、どのような種類のコンテナーインスタンスを使用する必要がありますか? このプロセス全体で、EC2インスタンスを作成してから始めようと思いました!!

83
cosbor11

調査をさらに数時間行った後、これを理解しました。 Amazonでは、リッスンしている場合、クラスターを作成するとき、またはクラスターにインスタンスを追加するときに、管理コンソールのどこかに次のように記述する必要があります。

「ECSインスタンスをクラスターに追加する前に、まずEC2管理コンソールに移動し、ecs-optimizedポリシーがアタッチされたIAMロールでAmazonEC2ContainerServiceforEC2Roleインスタンスを作成する必要があります」

これがリマロールです:

1. EC2ダッシュボード に移動し、Launch Instanceボタンをクリックします。

2. Community AMIsの下で、ecs-optimizedを検索し、プロジェクトのニーズに最適なものを選択します。いずれも機能します。次へをクリックします。

3.インスタンスの詳細の設定に到達したら、create new IAM role linkをクリックし、ecsInstanceRoleという新しいロールを作成します。

4. AmazonEC2ContainerServiceforEC2Roleポリシーをそのロールに添付します。

5.次に、ECSインスタンスの構成を完了します。
注:Webサーバーを作成する場合、ポート80へのアクセスを許可するためにsecurityGroupを作成する必要があります。

数分後、インスタンスが初期化され実行されると、インスタンスを追加しようとしている[ECSインスタンス]タブを更新できます。

124
cosbor11

現在、Amazon AWS Webインターフェイスは、正しいAMIと正しい名前でインスタンスを自動的に作成できるため、正しいクラスターに登録されます。

すべてのインスタンスは正しい設定でAmazonによって作成されましたが、私のインスタンスは登録されません。 Amazon AWSフォーラム で手がかりを見つけました。クラスターにインターネットアクセスが必要であり、プライベートVPCにインターネットゲートウェイがない場合、クラスターは接続できません。

修正

VPCダッシュボードで、新しいインターネットゲートウェイを作成し、クラスターで使用されるVPCに接続する必要があります。接続したら、VPCのルートテーブルを更新(または作成)し、最後の行として追加する必要があります

0.0.0.0/0 igw-24b16740  

Igw-24b16740は、新しく作成したインターネットゲートウェイの名前です。

34
P_W999

その他の推奨チェック

  1. 特定の地域に指定された推奨AMIを選択すると、問題が解決しました。

    AMIを確認するには、 Amazon ECSコンテナインスタンスの起動 を確認します。

  2. デフォルトでは、すべてのec2インスタンスがデフォルトのクラスターに追加されます。そのため、クラスターの名前も重要です。

Amazon ECSコンテナインスタンスの起動 のポイント10を参照してください。

詳細については、 このスレッド をご覧ください。

11
sanath_p

Fargateを使用しているときにこの問題に遭遇しました。 explicitlylaunchType="FARGATE"を呼び出すときにrun_taskを定義したときに修正しました。

6
Milan Cermak

クラスターの作成後にこの問題に遭遇した場合

EC2インスタンスリストでECSインスタンスに移動し、インスタンスに割り当てたIAMロールを確認します。インスタンスはECS Instanceで始まるインスタンス名で簡単に識別できます

enter image description here

その後、IAMロールをクリックすると、IAMコンソールに移動します。アクセス許可ポリシーリストからAmazonEC2ContainerServiceforEC2Roleポリシーを選択し、ロールを保存します。

インスタンスは、保存するとすぐにクラスターで使用可能になります。

2
sandaru.ny

本当の問題は、許可の欠如です。 AmazonEC2ContainerServiceforEC2Roleアクセス許可でIAMロールを作成して割り当てる限り、問題はなくなります。

1
Ben

私がそうであったように他の誰かがこの問題でブロックされた場合に備えて...私はここですべてを試しましたが、私のために働きませんでした。

ここで言われたことに加えて、コメントされているように、EC2インスタンスの役割に関する here ですが、私の場合、EC2インスタンスを単純な情報で構成した場合にのみ機能しました。ユーザーデータを使用して、次のような初期スクリプトを作成します。

#!/bin/bash
cat <<'EOF' >> /etc/ecs/ecs.config
ECS_CLUSTER=quarkus-ec2
EOF

このecs構成ファイルで作成された関連するECSクラスター名を通知して、問題を解決しました。この構成がないと、EC2インスタンスのECSエージェントログにECSに接続できないエラーが表示されていたため、ECSインスタンスがEC2クラスターに表示されました。

これを実行した後、EC2クラスターでEC2インスタンスを利用できるようになりました。 enter image description here

AWSのドキュメントには、この部分はオプションであると書かれていますが、私の場合は、この「オプション」構成なしでは機能しませんでした。

1
Ualter Jr.

私が遭遇した別の考えられる原因は、ECSクラスターAMIを「Amazon Linux AMI」ではなく「Amazon Linux 2」AMIに更新したことで、EC2 user_data起動スクリプトが機能しませんでした。

0
skeller88