Amazon Elastic Container Service (Amazon ECS) のタスクが失敗する原因となる「exec format」エラーを解決したいです。
簡単な説明
このエラーは、コンテナイメージに対して実行されたタスクが Amazon Elastic Compute Cloud (Amazon EC2) インスタンスの別のアーキテクチャ用にビルドされた場合に発生します。たとえば、ARM ベースのインスタンスでコンテナイメージを構築し、そのタスクを x86 インスタンスで実行しようとした場合が該当します。
注: タスクの停止理由は「タスク内の必須コンテナが終了しました」であり、終了コードは 1 です。
解決策
この問題を解決するには、Amazon ECS タスクのアーキテクチャを変更するか、正しいアーキテクチャに合わせてイメージを再構築します。
ECS タスクのアーキテクチャを変更する
タスクのアーキテクチャは、タスク定義の cpuArchitecture パラメータによって決まります。有効な値は x86_64 と ARM64 で、デフォルト値は x86_64 です。
タスクの起動に使用するアーキテクチャを変更するには、cpuArchitecture パラメータを目的の値に設定して、タスク定義の新しいリビジョンを作成します。タスクがサービスの一部である場合は、改訂したアーキテクチャを使用してサービスを更新し、デプロイを実行して新しいタスクを起動します。
Fargate 起動タイプの場合、AWS はタスクを実行するための適切なアーキテクチャでインフラストラクチャを自動的にプロビジョニングします。起動タイプに EC2 インスタンスまたは外部インスタンスを使用する場合は、構成のキャパシティを管理する必要があります。詳細については、「キャパシティ管理」を参照してください。
正しいアーキテクチャに合わせてイメージを再構築する
タスク定義で指定されているのと同じアーキテクチャを使用して、コンテナイメージを再構築します。
注: ほとんどのコンテナイメージビルドツールは、ホストマシンのアーキテクチャをデフォルトとします。
Docker または Finch を使用する
ビルドコマンドに --platform パラメータを追加して、ターゲットアーキテクチャを設定します。たとえば、Docker では、build --platform linux/arm64 [...] で ARM64 用のイメージをビルドします。Finch では、build --plaform linux/amd64 [...] で x86/64 アーキテクチャ用のイメージをビルドします。
ビルドコマンドの例を次に示します。
docker build -t my-image --platform linux/arm64
コマンドラインクライアント Finch の詳細については、「Finch について: コンテナ開発用のオープンソースクライアント」を参照してください。
Docker イメージのビルド方法の詳細については、Docker のウェブサイトで「マルチプラットフォームイメージのビルド」を参照してください。
AWS CDK
AWS Cloud Development Kit (AWS CDK) の ecs.ContainerImage.fromAsset イメージを使用して、ソースディレクトリの Docker ファイルからイメージをビルドしてアップロードします。詳細については、「イメージ」を参照してください:
CodeBuild
AWS CodeBuild と Docker イメージを組み合わせてアーキテクチャを設定することもできます。詳細については、「環境のコンピューティングモードとタイプをビルドする」を参照してください。