ECSのロールが分かりにくいという話
はじめに
ECSを構築しようとした際に、あれ?ロールが二つある。なんで?となったので調べてみました。
ECSには「タスク実行ロール」と「タスクロール」が存在します。
そうです、名前が似ていて何をやっているのか分からないのでややこしいのです。
そこで、できるだけ噛み砕きながら未来の自分が理解できるように説明していきたいと思います。
今回はECSの起動タイプをEC2として考えています。
まずはタスクを理解する
今回はロールの話しですが、それに関わるECSのタスクを先に理解します。
タスクは、簡単にいうとコンテナの集合です。
集合といっても、数の集合ではなく、種類の集合です。
Webサーバーやアプリケーションサーバー、データベースサーバーのように、数種類のコンテナの集合という感じです。
数を増やす場合は、ECSのサービスという機能を使いますが、主題から逸れるので今回は触れません。
タスクについてなんとなく理解できたでしょうか?
ECSコンテナエージェント
次にECSコンテナエージェントです。
これも大事なので先に押さえておきましょう。
ECSコンテナエージェントはECSのホスト(EC2)にインストールされているコンポーネントです。
ECSコンテナエージェントはタスクの状態を監視しています。
このECSコンテナエージェントによってコンテナを起動したり、停止したりしています。
他にもECRからのイメージ取得や、CloudWatch Logsへのログ出力も行っています。
正確には、実際にコンテナの起動停止やログ出力自体はDockerエージェントやawslogsドライバーが行っています。
タスク実行ロール
では本題のロールを見ていきます。
まずはタスク実行ロールです。
このロールはECSエージェントが実行するAPIに対しての権限管理です。
つまり、ECSコンテナエージェントを通して行うことはタスク実行ロールが必要になります。
といっても、ECSコンテナエージェントが何をしているのかが分かりにくいです。
なので、一般的なユースケースを見てみます。
タスク実行ロールを設定するのは以下のような場合です。
- ECRのプライベートレジストリからイメージをPullする
- CloudWatch Logsにログを送信する
- Parameter Store, Seacrets Managerからシークレットを取得する
このように、タスク実行ロールは限られた操作の権限管理に使用します。
公式ドキュメントでも代表的なタスク実行ロールの使用例が記載されているので、参考にしてみてください。
タスクロール
タスクロールはコンテナが他のリソースを操作するのに必要なロールです。
こちらは、EC2が他のリソースを操作するのに権限が必要、というのと同じです。
例えば、S3からファイルを取得する、RDSからデータを取得する。
このような場合にロールが必要になります。
基本的にECSで権限管理を行うのは、このタスクロールが一番多いと思います。
このタスクロール、タスク実行ロールはどちらも1つのタスク定義でそれぞれ1つのロールです。
そのため、コンテナ毎に権限管理をしたい場合は、コンテナ毎にタスク定義を作成する必要があります。
ホストのIAMロール
最後に、ホストであるEC2にも必要なIAMポリシーがあります。
ECSのホストには「AmazonEC2ContainerServiceforEC2Role」というポリシーが必須です。
このポリシーをIAMロールに割り当てることで、ECSコンテナエージェントを実行することができます。
まとめ
ECSコンテナエージェントは見えないところで動いているので、理解するのが大変でした。
どのロールで制限しているのかを知ることで、アクセス関連のトラブルが発生した際も切り分けができるようになるのではないかと思います。
参考資料
Discussion