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インスタンスを作成してから始めようと思いました!!
調査をさらに数時間行った後、これを理解しました。 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インスタンス]タブを更新できます。
現在、Amazon AWS Webインターフェイスは、正しいAMIと正しい名前でインスタンスを自動的に作成できるため、正しいクラスターに登録されます。
すべてのインスタンスは正しい設定でAmazonによって作成されましたが、私のインスタンスは登録されません。 Amazon AWSフォーラム で手がかりを見つけました。クラスターにインターネットアクセスが必要であり、プライベートVPCにインターネットゲートウェイがない場合、クラスターは接続できません。
修正
VPCダッシュボードで、新しいインターネットゲートウェイを作成し、クラスターで使用されるVPCに接続する必要があります。接続したら、VPCのルートテーブルを更新(または作成)し、最後の行として追加する必要があります
0.0.0.0/0 igw-24b16740
Igw-24b16740は、新しく作成したインターネットゲートウェイの名前です。
その他の推奨チェック
特定の地域に指定された推奨AMIを選択すると、問題が解決しました。
AMIを確認するには、 Amazon ECSコンテナインスタンスの起動 を確認します。
デフォルトでは、すべてのec2インスタンスがデフォルトのクラスターに追加されます。そのため、クラスターの名前も重要です。
Amazon ECSコンテナインスタンスの起動 のポイント10を参照してください。
詳細については、 このスレッド をご覧ください。
Fargateを使用しているときにこの問題に遭遇しました。 explicitlylaunchType="FARGATE"
を呼び出すときにrun_task
を定義したときに修正しました。
本当の問題は、許可の欠如です。 AmazonEC2ContainerServiceforEC2Roleアクセス許可でIAMロールを作成して割り当てる限り、問題はなくなります。
私がそうであったように他の誰かがこの問題でブロックされた場合に備えて...私はここですべてを試しましたが、私のために働きませんでした。
ここで言われたことに加えて、コメントされているように、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インスタンスを利用できるようになりました。
AWSのドキュメントには、この部分はオプションであると書かれていますが、私の場合は、この「オプション」構成なしでは機能しませんでした。
私が遭遇した別の考えられる原因は、ECSクラスターAMIを「Amazon Linux AMI」ではなく「Amazon Linux 2」AMIに更新したことで、EC2 user_data起動スクリプトが機能しませんでした。