Windows コンテナを ECS on EC2 の awsvpc モードで missing an attribute required by your task のエラーでタスク起動できないときの原因と対処方法

2022.01.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Windows コンテナを ECS on EC2 実行環境を利用し、タスク定義のネットワークモード awsvpc を指定しました。タスク起動(Windowsコンテナ起動)時に以下のエラーで起動できない状況を調査する機会がありました。同エラー発生時の切り分けの参考用にまとめます。

本エラーメッセージの原因は複数考えられます。本記事は解決に至った一例としてご参考にしてください。

ECSのサービスイベント

service iis-service was unable to place a task because no container instance met all of its requirements. The closest matching container-instance fc912d3032b545058b0502aa35d67f28 is missing an attribute required by your task. For more information, see the Troubleshooting section.

原因・対処方法まとめ

原因はネットワークモードawsvpcで必要な設定がホストのEC2インスタンスに未設定だった。現状はawsvpcでタスクを起動する場合、ホストEC2のuserdataを利用して設定を追加する必要がある。

対処方法はEC2インスタンスの起動を管理している Auto Scaing グループに紐づく起動設定のuserdataを修正する。

  • ECS エージェントの EnableTaskENI フラグ On にする 設定を追加

修正後のuserdata

<powershell>
Initialize-ECSAgent -Cluster awsvpc-cluster -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' -EnableTaskENI
</powershell>

検証環境

Windows の ECS on EC2 環境です。

2021年7月に WindowsコンテナのECSがawsvpcのネットワークモードがサポートされました。ECS on EC2 + awsvpcネットワークモードで起動するタスク(Windowsコンテナ)を実行したいです。

項目 バージョン
ECS AMI ID ami-0bc01aabecc951c86
ECS AMI Name Windows_Server-2022-English-Full-ECS_Optimized-2021.12.16
ECS Agent 1.57.1
Docker 20.10.7

状況

ECS on EC2、ECSのサービス、タスク定義の作成はマネージメントコンソールから行いました。 タスクを実行するとECSのサービスイベントに以下のメッセージが記録されます。タスクは起動すらせずタスクが STOPPED になることもないです。

メッセージから読み取れることは何かの属性が足りていない様です。

ECSのサービスイベント

service iis-service was unable to place a task because no container instance met all of its requirements. The closest matching container-instance fc912d3032b545058b0502aa35d67f28 is missing an attribute required by your task. For more information, see the Troubleshooting section.

切り分け

以下のリンクより足りない属性を確認することからはじめました。

コンテナインスタンスに必要な属性がない場合は、コンテナインスタンスに必須の属性がないのセクション (「サービスイベントメッセージ」内) をご参照ください。足りない属性を見つけるには、ecs-cli check-attributes コマンドを使用します。

ECS CLI の確認結果

Cloud Shell に ECS CLIをインストールし実行環境を用意しました。以下を参考にしました。

ecs-cli check-attributesコマンドで足りない属性を確認します。

  • --task-def はタスク定義名を指定
  • --container-instancesはクラスターのECSインスタンスから確認できますが、わかりにくいの以下のキャプチャを参考にしてください
  • --cluster はクラスター名を指定

実行結果から不足している属性はecs.capability.task-eniであることがわかりました。

$ ecs-cli check-attributes --task-def windows-simple-iis-awsvpc --container-instances 78b41bf44f314682bf09a8bb7957b4e6 --cluster awsvpc-cluster
Container Instance  Missing Attributes
awsvpc-cluster      ecs.capability.task-eni

ecs.capability.task-eni の確認結果

Amazon EC2 Linux は特定のバージョン以降はecs.capability.task-eni属性が自動登録されるとありますが、今回は Windows インスタンスなので自動登録されていない可能性ありそうです。

Amazon EC2 Linux instances must be registered with the ecs.capability.task-eni capability to be considered for placement of tasks with the awsvpc network mode. Instances running version 1.15.0-4 or later of ecs-init are registered with this attribute automatically.

以下のリンクでは「ecs.capability.task-eni属性を持つインスタンスが存在しない」と例としてあげられています。

For example, if your task uses the awsvpc network mode, but there are no instances in your specified subnets with the ecs.capability.task-eni attribute.

Winodws コンテナの ECS on ECS のブートストラップのドキュメントに答えがありました。Windows コンテナの ECS on EC2 と awsvpc の組み合わせでは ECS エージェントで EnableTaskENI フラグをOnにする必要がありました。

EnableTaskENI: This flag turns on task networking and is required when you use the awsvpc network mode.

原因

ホストのEC2のECSエージェントの EnableTaskENI フラグが On になっていない。 userdataまたは、cloud-initでECSエージェントに設定追加が必要でした。

対処

今回はマネージメントコンソールから Windows の ECS on EC2 を構築しています。ECS on EC2 の部分はマネージメントコンソールからの操作の裏で CloudFormation からデプロイされています。その中でホストのEC2を管理するオートスケーリンググループに紐づく起動設定が作成されています。

起動設定内に EC2 の userdata 設定の指定箇所があります。そこの userdata を修正して ECSエージェントに設定を追加します。

修正内容

既存の起動設定の修正はできないため起動設置のコピーして新規の起動設定を作成します。高度な詳細のなかに userdata の設定があります。

展開するとデフォルトの設定値は以下になっています。

デフォルト値

<powershell>
Initialize-ECSAgent -Cluster awsvpc-cluster -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]'
</powershell>

-EnableTaskENIを追加します。これでフラグを On にできます。

修正後

<powershell>
Initialize-ECSAgent -Cluster awsvpc-cluster -EnableTaskIAMRole -LoggingDrivers '["json-file","awslogs"]' -EnableTaskENI
</powershell>

既存の起動中のEC2インスタンス(ECSのホスト)には反映されません。新しいEC2インスタンスが起動したときから追加設定が反映されます。

手軽な設定反映方法

検証環境のため Auto Scaling グループの希望する容量を一度0に変更し、既存の起動中のEC2インスタンスを削除しました。その後、希望する容量1に変更して、新規のEC2インスタンスを起動させました。

タスク起動チェック

タスク定義には変更は加えず同じリビジョンのタスク定義を使用しています。ECSのサービスを更新から新しいデプロイの強制で1タスクを起動させました。

ALB のバックエンドで起動する IIS の Windows コンテナを起動しました。ALBのDNS名にアクセスするとIIS画面(テストページ)を確認できます。

ターゲットグループに登録されているもの確認できます。

タスク定義、ECSのサービスの設定ミスではなく、ECSのホストにあたるEC2インスタンスの設定不足が原因だったことを確認できました。

おわりに

その他、Windows コンテナの注意事事項は以下のドキュメントにまとまっています。