こんにちは!イーゴリです。
Amazon ECS で Amazon ECR のイメージがあるタスク定義を指定したら、ステータスが「RUNNING」ではなく、「STOPPED」になった場合(何かしらのECSのエラーが発生した場合)、どうやって解決すればいいかをこの記事でご紹介させて頂きます。
よく発生するパターン
- インターネットへのアクセスがない
ECSからECRへアクセスするにはインターネットアクセスが必要となりますので、ECSが
→パブリックサブネットにある場合、インターネットゲートウェイがVPCにアタッチされているか、ルートテーブルの設定が正しく設定されているかをご確認ください
→プライベートサブネットにある場合、NAT ゲートウェイがパブリックサブネットにあるか、ルートテーブルの設定が正しく設定されているかをご確認ください
- IAM ロールにイメージを取得するための適切なアクセス許可がない
対象のEC2インスタンスのIAMロールに「AmazonEC2ContainerServiceforEC2Role」のポリシーがアタッチされているかご確認ください。
※Fargateの場合、「AmazonECSTaskExecutionRolePolicy」のポリシーがアタッチされているかご確認ください。
- Apple Silicon M1 (Arm) でDockerイメージを作成して、x86のECSでDockerイメージを使用している(今回はこのパターン)
他のパターンについては下記の公式AWSページをご参考ください。
Cloudwatch Logsの有効化 (有効化してない場合)
ステータスが「STOPPED」になっただけだと理由が不明のため、ログ設定は有効にしてない場合、まずは有効にしましょう!
[タスク定義] > 対象タスク定義をクリック > [新しいリビジョンの作成]をクリックします。
[コンテナの定義] > 対象コンテナの定義をクリックします。
[ストレージとログ]の[ログ設定]でAuto-configure CloudWatch Logsにチェックを入れます。
「awslogs」であることを確認し、いつも通り、[更新]ボタンをクリックします。
[作成]ボタンをクリックします。
クラスターに作成されたタスク定義を追加します。
ステータスが「STOPPED」になったことを確認します。
エラーが発生したら、[CloudWatch] > [ロググループ] > 「ECS」を検索 > [/ecs/<対象タスク定義>] > [<ログランダム番号>] > エラー内容を見ましょう!
エラー内容:
standard_init_linux.go:228: exec user process caused: exec format error
Apple Silicon M1でDockerイメージを作成しようとしている場合
Apple Silicon M1でDockerイメージを作成したコンテナを実行するEC2のCPUアーキテクチャ(x86)が異なるために上記のエラーが発生しました。
下記の対策方法があります。
- amd64のCPUで実行できるようにdocker buildにオプションを指定する
- amd64のCPUがある機器でDockerイメージを作成する(例:x86のEC2)
私の場合、EC2でDockerをインストールしてDockerイメージを作成しましたので、タスク定義を実行する時に、ステータスが「PENDING」から「RUNNING」に無事に切り替わるようになりました。
以上、御一読ありがとうございました。
本田 イーゴリ (記事一覧)
カスタマーサクセス部
・2024 Japan AWS Top Engineers (Security)
・AWS SAP, DOP, SCS, DBS, SAA, DVA, CLF
・Azure AZ-900
・EC-Council CCSE
趣味:日本国内旅行(47都道府県制覇)・ドライブ・音楽