Check! Amazon EC2 Container Service で Docker を学びたい！ (IAMポリシー編)

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

Prologue - はじめに
=================================================
[前回][my-amazon-ecs-docker-vol1] を経て、実際に 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ポリシーが提示されています。これを紐解いてみます。

```json
{
  "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ポリシーの構造は以下のようになっています。(一部)
<dl>
<dt>Version</dt>
<dd>ポリシーのバージョン。現バージョンは <code>2012-10-17</code>。</dd>
<dt>Statement</dt>
<dd>[必須] ポリシーのメインとなるエレメント。複数のステートメントを配列として持っており、個々のステートメントは、<code>Effect</code>, <code>Action</code>, <code>Resource</code> などのエレメントを持つ。</dd>
<dt>Effect</dt>
<dd>[必須] ステートメントの挙動を指定する。設定できる値は、 <code>Allow</code> または <code>Deny</code> のみ。</dd>
<dt>Action</dt>
<dd>ひとつ、または複数のアクションについて指定する。ステートメントは、この <code>Action</code> か <code>NoAction</code> のどちらかを含む必要がある。アクションは、<code>サービス名:アクション名</code> の形式で記述する。各AWSサービス毎にアクションが定義されている。(アクションは、API のアクションに相当するようです。)<br>ワイルドーカードで記述可能。</dd>
<dt>Resource</dt>
<dd>対象のオブジェクトを指定する。ステートメントは、この <code>Resource</code> か <code>NotResource</code> を含む必要がある。[Amazon Resource Names(ARN)][] で指定する。ワイルドカードで記述可能。</dd>
</dl>

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

- [Amazon ECS コンテナエージェントのIAMロール][Amazon ECS Container Agent IAM Role]
- [Amazon ECS IAMユーザーのポリシー][Amazon ECS IAM User Policies]
- [タスクの実行 (RunTasks)][Run Tasks]
- [タスクの開始 (StartTasks)][Start Tasks]
- [コンテナインスタンス][Container Instances]
- [タスク定義][Task Definitions]
- [タスク][Tasks]

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

Amazon ECS のアクション
==================================================

さて、[Amazon ECS のAPI アクション一覧][Amazon ECS Actions] には現在、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. 

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


ecs:CreateCluster
---------------------------------

API [CreateCluster][Amazon ECS 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.

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

また、[ポリシーのドキュメント][Amazon ECS Container Agent IAM Role] には注釈が書かれており、この `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.

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

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


ecs:RegisterContainerInstance
--------------------------------

API [RegisterContainerInstance][Amazon ECS RegisterContainerInstance] の説明はこちらです。

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

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

ecs:DeregisterContainerInstance
------------------------------------------

API [DeregisterContainerInstance][Amazon ECS DeregisterContainerInstance] の説明を訳します。

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

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


ecs:DiscoverPollEndpoint
-----------------------------------------

API [DiscoverPollEndpoint][Amazon ECS DiscoverPollEndpoint] の説明を訳します。

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

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

ecs:Submit*
------------------------------------------------

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

- [SubmitContainerStateChange][Amazon ECS SubmitContainerStateChange]
- [SubmitTaskStateChange][Amazon ECS SubmitTaskStateChange]


### SubmitContainerStateChange 

> Sent to acknowledge that a container changed states.

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

### SubmitTaskStateChange 

> Sent to acknowledge that a task changed states.

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


ecs:Poll
------------------------------------------------

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

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

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



Epilogue - おわりに
================================================
あまり触れたことのなかったIAMポリシーについて知り、すっきりしました！

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

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

近況
===================================================

Phalcon関連
---------------------------------------

- [爆速フレームワーク!! Phalcon PHP Framework](
http://qiita.com/dz_/items/55ae18f7fe3a873bace1 "爆速フレームワーク!! Phalcon PHP Framework")
- [Meet Volt ! Phalcon 謹製テンプレートエンジン Volt - from 第71回 PHP勉強会](http://qiita.com/dz_/items/974a90b32ba6a6e38182 "Meet Volt ! Phalcon 謹製テンプレートエンジン Volt - from 第71回 PHP勉強会")
- [Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール！](http://qiita.com/dz_/items/e70d61487224b854b971 "Meet Phalcon! - Phalcon PHPフレームワークを Nginx on Amazon EC2 にインストール！") ← :new: :sparkles: 

Amazon ECS関連
---------------------------------------

- [Check! Amazon EC2 Container Service で Docker を学びたい！(準備編)][my-amazon-ecs-docker-vol1]
- Check! Amazon EC2 Container Service で Docker を学びたい！ (IAMポリシー編) ← 本記事


技術ブログ寄稿
-----------------------------------------

[cloudpack技術ブログ][cloudpack-blog]でも、AWS Lambda や 運用ツール Serf に関して記事を書いています。ご興味あれば読んでいただけると嬉しいです！

- <a href="http://blog.cloudpack.jp/author/oohira/" title="大平 かづみ の記事一覧 | cloudpack技術情報サイト"　target="_blank" rel="nofollow">大平 かづみ の記事一覧</a>


[cloudpack]:https://cloudpack.jp/ "cloudpack（クラウドパック） 400社を超える導入実績! EC2などAWSクラウドの導入設計、構築、運用保守サービス"
[cloudpack-blog]:http://blog.cloudpack.jp/ "cloudpack技術情報サイト"
[大平かづみ]:http://blog.cloudpack.jp/author/oohira/ "大平かづみの記事一覧"

[my-amazon-ecs-docker-vol1]:http://qiita.com/dz_/items/625f55bc5de371d15caa "Check! Amazon EC2 Container Service で Docker を学びたい！(準備編)"
[my-amazon-ecs-docker-vol2]:http://qiita.com/dz_/ "Check! Amazon EC2 Container Service で Docker を学びたい！(IAMポリシー編)"

[Setting Up with Amazon ECS - Amazon EC2 Container Service]:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/get-set-up-for-amazon-ecs.html "Setting Up with Amazon ECS - Amazon EC2 Container Service"
[IAM Policy Elements Reference]:http://docs.aws.amazon.com/IAM/latest/UserGuide/AccessPolicyLanguage_ElementDescriptions.html "IAM Policy Elements Reference - AWS Identity and Access Management"

[Amazon ECS IAM Policies]:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html "Amazon ECS IAM Policies - Amazon EC2 Container Service"
[Amazon ECS Container Agent IAM Role]:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html＃container_Agent_IAM_role "Amazon ECS Container Agent IAM Role - Amazon ECS IAM Policies - Amazon EC2 Container Service"
[Amazon ECS IAM User Policies]:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html#ECS_IAM_user_policies "Amazon ECS IAM User Policies - Amazon ECS IAM Policies - Amazon EC2 Container Service"
[Run Tasks]:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html#IAM_run_policies "Run Tasks - Amazon ECS IAM Policies - Amazon EC2 Container Service"
[Start Tasks]:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html#IAM_start_policies "Start Tasks - Amazon ECS IAM Policies - Amazon EC2 Container Service"
[Container Instances]:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html#IAM_container_instance_policies "Container Instances - Amazon ECS IAM Policies - Amazon EC2 Container Service"
[Task Definitions]:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html#IAM_task_definition_policies "Task Definitions - Amazon ECS IAM Policies - Amazon EC2 Container Service"
[Tasks]:http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html#IAM_task_policies "Tasks - Amazon ECS IAM Policies - Amazon EC2 Container Service"

[Amazon ECS Actions]:http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_Operations.html "Actions - EC2ContainerService"
[Amazon ECS CreateCluster]:http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCluster.html "CreateCluster - EC2ContainerService"
[Amazon ECS RegisterContainerInstance]:http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RegisterContainerInstance.html "RegisterContainerInstance - EC2ContainerService"
[Amazon ECS DeregisterContainerInstance]:http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeregisterContainerInstance.html "DeregisterContainerInstance - EC2ContainerService"
[Amazon ECS DiscoverPollEndpoint]:http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DiscoverPollEndpoint.html "DiscoverPollEndpoint - EC2ContainerService"
[Amazon ECS SubmitContainerStateChange]:http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_SubmitContainerStateChange.html "SubmitContainerStateChange - EC2ContainerService"
[Amazon ECS SubmitTaskStateChange]:http://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_SubmitTaskStateChange.html "SubmitTaskStateChange - EC2ContainerService"


[Amazon Resource Names(ARN)]:http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html "Amazon Resource Names (ARNs) and AWS Service Namespaces - Amazon Web Services"