AWSでECS(Elastic Container Service)環境を構築していると、不思議な現象に遭遇することがあります。
「設定は何も変えていないのに、1回目のクラスター作成はエラーで失敗し、2回目は何事もなかったかのように成功する」
実はこれ、AWSの仕様に基づいた「典型的な挙動」なのです。今回は、その裏側で起きている「暗黙のロール自動作成」の仕組みについて解説します。
犯人は「サービスリンクドロール」の遅延
結論から言うと、この現象の正体は AWSServiceRoleForECS という名前のロール(サービスリンクドロール)が作成される際の「タイムラグ」にあります。
サービスリンクドロール(SLR)とは?
AWSのサービス(今回はECS)が、ユーザーに代わって他のサービス(EC2やELBなど)を操作するために必要な専用のIAMロールです。このロールは通常、ユーザーが手動で作る必要はなく、「初めてクラスターを作成した瞬間」にAWSが裏側で自動的に生成してくれます。
なぜ「1回目」だけ失敗するのか?
問題は、この「自動生成」が行われるタイミングです。
- 作成指示: ユーザーがクラスター作成を実行。
- 自動生成開始: ECSが「あ、ロールがないな。今すぐ作ろう」と
CreateServiceLinkedRoleを呼び出す 。 - 競合の発生 (Race Condition): ロールが作成された直後、ECSがそのロールを使おうと(AssumeRole)試みます 。
- 反映待ち: しかし、IAMには 「最終一貫性(Eventual Consistency)」 という特性があります 。ロールが「作成完了」と返ってきても、実際にシステム全体で利用可能になるまで、コンマ数秒のラグが生じることがあるのです 。
結果として、1回目は「そんなロールは見当たらないよ」というエラー(Unable to assume role)で処理が中断されてしまいます 。
深掘り:勝手に作られるロールには「どんな権限」があるのか?
「知らないうちにロールが作られている」と聞くと不安になるかもしれませんが、ご安心ください。
この AWSServiceRoleForECS には、AWSが管理する AmazonECSServiceRolePolicy というポリシーがアタッチされています。これは、ECSが正常に動くために必要最低限の、以下の操作を許可するものです。
ロードバランサー(ELB)の操作: コンテナをターゲットグループに登録・切り離しをする。
EC2のステータス確認: インスタンスが正常に動いているか監視する。
ネットワーク(VPC)の制御: コンテナ用のネットワークインターフェース(ENI)を管理する。
また以下のAWS公式ドキュメントより、手動でロールを削除することは不要なようです。
AWSServiceRoleForECS ロールを手動で削除する必要はありません。AWS マネジメントコンソール、AWS CLI、AWS API の全リージョンのクラスターを削除すると、Amazon ECS がリソースをクリーンアップし、サービスリンクロールを削除します。
2回目で成功する「納得の理由」
1回目が失敗したとしても、裏側で動き出した 「ロール作成処理」自体はロールバックされず、そのまま完了します。
そのため、2回目に作成ボタンを押した時には:
- 既に
AWSServiceRoleForECSがアカウント内に存在する。 - 反映待ちの時間も既に経過している。
このため、2回目は既存のロールを即座に利用でき、スムーズに成功するというわけです 。これは、TerraformやCloudFormationといった自動化ツール(IaC)を使っている場合でも同様に発生する既知の挙動です。
現場で慌てないための回避策
この挙動はAWSの設計仕様であるため、大きな問題ではありませんが、自動化パイプラインを組んでいる場合にはエラーで止まってしまうため厄介です。以下の対策が有効です。
- 事前にロールを作っておく: クラスター作成前に、AWS CLI等で明示的にロールを作成しておきます 。
aws iam create-service-linked-role --aws-service-name ecs.amazonaws.com- リトライ処理を組み込む: スクリプトやCI/CDパイプライン側で、失敗時に少し待機してリトライする仕組みを実装します。
まとめ:何も怖くない「仕様通り」の挙動
「作った覚えのない AWSServiceRoleForECS というロールが増えている」
「1回失敗したのに、次は成功した」
これらは決してあなたのミスではなく、AWSが便利に(暗黙的に)環境を整えようとしてくれた結果です 。もし次にこのエラーに出会ったら、「あぁ、今裏側でスタッフ(ロール)が準備中なんだな」と3分ほどコーヒーを飲んで待ってみてください。
次回の実行時には、きっと何事もなかったかのようにクラスターが作成されているはずです。
参考
ロールを使用して Amazon ECS にクラスターの管理を許可する
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/using-service-linked-roles-for-clusters.html

コメント