【対策方法】Amazon ECS で Amazon ECR のイメージを使えない場合

記事タイトルとURLをコピーする

こんにちは!イーゴリです。

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ページをご参考ください。

aws.amazon.com

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」に無事に切り替わるようになりました。

以上、御一読ありがとうございました。

イーゴリ (記事一覧)

クラウドインテグレーション部・技術4課・エンジニア

特にTerraform(自動化)、ネットワーク系、VDI、Windows Serverに興味があります

日本国内旅行・ドライブが好きです