こんにちは、cloudpack@dz_ こと大平かづみです。

Prologue – はじめに

前回 を経て、実際に Amazon EC2 Container Service (Amazon ECS) のセットアップを進めています。その過程で設定した IAMポリシー について、良い機会なので読んでみることにしました。

尚、Setting Up with Amazon ECS – Amazon EC2 Container Service を参考に進めています。

Amazon ECS のコンテナインスタンスのためのIAMロールのポリシー

上記ドキュメントの To create an IAM role for your container instances に、コンテナインスタンスのためのIAMポリシーが提示されています。これを紐解いてみます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecs:CreateCluster",
        "ecs:RegisterContainerInstance",
        "ecs:DeregisterContainerInstance",
        "ecs:DiscoverPollEndpoint",
        "ecs:Submit*",
        "ecs:Poll"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

まず、IAMポリシーの記法を知ろう

IAMポリシーについてちゃんと勉強をしたことがかなったので、 IAM Policy Elements Reference で調べてみました。奥が深そうだったので、今回は上記ポリシーに関連するところに絞って進めます。

エレメントについて

IAMポリシーの構造は以下のようになっています。(一部)

Version

ポリシーのバージョン。現バージョンは 2012-10-17

Statement

[必須] ポリシーのメインとなるエレメント。複数のステートメントを配列として持っており、個々のステートメントは、Effect, Action, Resource などのエレメントを持つ。

Effect

[必須] ステートメントの挙動を指定する。設定できる値は、 Allow または Deny のみ。

Action

ひとつ、または複数のアクションについて指定する。ステートメントは、この ActionNoAction のどちらかを含む必要がある。アクションは、サービス名:アクション名 の形式で記述する。各AWSサービス毎にアクションが定義されている。(アクションは、API のアクションに相当するようです。)
ワイルドーカードで記述可能。

Resource

対象のオブジェクトを指定する。ステートメントは、この ResourceNotResource を含む必要がある。Amazon Resource Names(ARN) で指定する。ワイルドカードで記述可能。

Amazon ECS に関するIAMポリシー

Amazon ECS に関する IAMポリシーについては、Amazon ECS IAM Policies に例が挙がっていました。

冒頭にあげたポリシーは、 Amazon ECS コンテナエージェントのIAMロール のポリシーにあたるようですね。

Amazon ECS のアクション

さて、Amazon ECS のAPI アクション一覧 には現在、20のアクションが定義されています。冒頭のポリシーに使われているアクションを調べてみました。

  • ecs:CreateCluster
  • ecs:RegisterContainerInstance (※)
  • ecs:DeregisterContainerInstance
  • ecs:DiscoverPollEndpoint (※)
  • ecs:Submit* (※)
  • ecs:Poll

尚、※をつけたものは、エージェントのみが利用できるアクションだそうです。

Note
This action is only used by the Amazon EC2 Container Service agent, and it is not intended for use outside of the agent.

"注釈
このアクションは Amazon EC2 Container Service エージェントだけが使用でき、エージェントの外からは使用できません。"

ecs:CreateCluster

API CreateCluster の説明はこちらです。

Creates a new Amazon ECS cluster. By default, your account will receive a default cluster when you launch your first container instance. However, you can create your own cluster with a unique name with the CreateCluster action.

"新しい Amazon ECS クラスターを作成します。デフォルトでは、最初のコンテナインスタンスを起動した段階で、デフォルトのクラスターが与えられます。また、 CreateCluster アクションで、ユニークな名前で自身のクラスターを作ることもできます。"

また、ポリシーのドキュメント には注釈が書かれており、この ecs:CreateCluster アクションは必要に応じて設定すれば良いのだそうです。

Note

The ecs:CreateCluster line in the above policy is optional, provided that the cluster you intend to register your container instance into already exists. If the cluster does not already exist, the agent must have permission to create it, or you can create the cluster with the create-cluster command prior to launching your container instance.

"ポリシーの上部にある ecs:CreateCluster の行はオプションで、すでに存在している中にコンテナインスタンスを登録する場合に設定します。もしクラスターが存在しないなら、エージェントはそれを作成するためのパーミッションを持たななければなりません。もしくは、 create-cluster コマンドを利用することで、コンテナインスタンスが起動する前にクラスターを作成できます。"

(訳に自信がありません(>_<)、クラスターがなければ作れるように与えるアクションの認識ですが、文頭がうまく訳せませんでした。)

ecs:RegisterContainerInstance

API RegisterContainerInstance の説明はこちらです。

Registers an Amazon EC2 instance into the specified cluster. This instance will become available to place containers on.

"Amazon EC2 インスタンスを指定したクラスターに登録します。このインスタンスはコンテナを配置できるようになります。"

ecs:DeregisterContainerInstance

API DeregisterContainerInstance の説明を訳します。

Deregisters an Amazon ECS container instance from the specified cluster. This instance will no longer be available to run tasks.

"Amazon ECS コンテナインスタンスを指定したクラスターから登録を解除します。このインスタンスはタスクの実行はできなくなります。"

ecs:DiscoverPollEndpoint

API DiscoverPollEndpoint の説明を訳します。

Returns an endpoint for the Amazon EC2 Container Service agent to poll for updates.

"アップデートをポーリングするために、Amazon EC2 Container Service エージェントのエンドポイントを返却します。"

ecs:Submit*

これは、 Submit で始まるアクションをまとめて指定しています。Submitではじまるアクションはこの2つです。

SubmitContainerStateChange

Sent to acknowledge that a container changed states.

"コンテナの状態が変わったことを acknowledge へ送信します。"

SubmitTaskStateChange

Sent to acknowledge that a task changed states.

"タスクの状態が変わったことを acknowledge へ送信します。"

ecs:Poll

このアクションは… 実は Amazon ECS のアクション一覧には存在しません…orz

サービス固有ではなく共有のアクションでもあるのかと、ドキュメントを漁りましたが見つからず、弊社の心強いインフラの先輩たちに恐る恐る伺ってみたところ… ぱっとは見当つかないとのこと(汗)

もしかしたらまだプレビュー版なので未知のアクションが隠されているのかもしれません。
もしご存知の方がいたら教えて頂けるととてもすっきりします!よろしくお願いします!

Epilogue – おわりに

あまり触れたことのなかったIAMポリシーについて知り、すっきりしました!

しかし、読むことはできそうですが、オリジナルのインフラ構成を作る際などに適したIAMポリシーを作成できるかと言ったら、もっと細かなところまで知らないと難しそうです。

今は、Amazon ECS で Docker を学ぶことが目的なので、IAMの詳しいことはまたいつか必要な時に学びます!
(Docker がまだまだ出てこなくてすみません(>_<))

元記事はこちらです。
Check! Amazon EC2 Container Service で Docker を学びたい! (IAMポリシー編)