AWS で他の主体 (ユーザや EC2 などの AWS サービス) に何かするのを許可するときには IAM ポリシーや IAM ロールを定義して権限を委譲しますが、これらの概念についての自分なりの理解と具体例を記します。
AWS で他の誰かに何かするのを許可するときにやること
他の誰かに何かするのを許可するときは、ちゃんと免許を発行するのがよいと思います。
免許を発行するには、許可をするアクションが「免許の種類」(IAM ポリシー) として定義されていて、さらにそれをどんな人に与えうるかの「免許の種類 (の組) に対する受験資格」 (IAM ロール) が定義されている必要があります。
日本国の道路交通法でも、第六章第一節で「大型」「中型」「原付」のように何の運転を許可するのかで「免許の種類」が定義され、それに対して第六章第二節に「大型は二十一歳以上」「中型は二十歳以上」「原付は十六歳以上」といった受験資格が定義されていると思います (実際には受験資格ではなく欠格事由として定義されていますが)。それと似ています。
ただ似ていないのは、AWS 国では受験資格 (IAM ロール) を定義するときに、「免許の種類」を 2 つ以上組み合わせることができます。喩えるなら「『大型 + 普通二輪』受験資格」といった感じです。その受験資格を満たす人に「『大型 + 普通二輪』免許」を発行することができます。これによって、あなたが他の誰かにやってほしいことに必要十分な受験資格をカスタムしていく運用になります。
実際の流れ
先ほど「免許の種類」「免許の種類 (の組) に対する受験資格」が必要と書きましたが、実際に AWS 国で他の誰かに何かするのを許可するときには、以下の流れにしたがうと思います。
- 「免許の種類」(IAM ポリシー) (の組) を選びます。既に用意されているもの (AWS 管理ポリシー; 後述) から選ぶか、要件に合うものがなければ自分で新しく定義します。
- その上で、その「免許の種類 (の組) に対する受験資格」 (IAM ロール) を定義します。つまり、「どんな主体 (プリンシパル)」 (信頼されたエンティティ) が、「どの免許の種類 (の組)」 (許可ポリシー 1 つ以上) の受験資格を有するかを定義します。
そうすれば、許可したい相手に免許を発行できます。日本国の免許のような試験はないですが、むしろあなたが試験官としてその相手に許可してよいかちゃんと確認します。
補足1. 免許の対象となるアクション
上では運転免許に喩えましたが、「実際何をすることに免許が要るのか」は、以下に AWS の各サービスごとの免許の対象となるアクション一覧のリファレンスがあります。IAM からポリシーを作成しようとすると JSON 画面の右サイドバーにも一覧は出てきます。
Actions, resources, and condition keys for AWS services - Service Authorization Reference
例えばサービス Price List のアクションは以下などです。
Actions, resources, and condition keys for AWS Price List - Service Authorization Reference
-
"pricing:GetProducts"(AWS Price List で検索条件に一致する製品の情報を取得する) -
"prising:GetAttributeValues"(AWS Price List でパラメータに適合する価格リストを一覧表示する)
補足2. 既に用意されている免許の種類 (AWS 管理ポリシー)
AWS 国には既に用意されている「免許の種類」(IAM ポリシー) があります。AWS 管理ポリシーといいます。この中に要件を満たすものがあれば利用することができます。内容を編集することはできません。
AWS 管理ポリシー - AWS 管理ポリシー
例えば以下の AmazonEC2ReadOnlyAccess は、EC2 インスタンスの状態を読み取る系のアクションを許可します (EC2 インスタンス上の OS 内のファイルを読み取るのではない)。
AmazonEC2ReadOnlyAccess - AWS 管理ポリシー
補足3. 免許の有効範囲・条件
「免許の種類」「受験資格」はリージョンごとに定義する必要などはないです。現実のアメリカ合衆国などでは州ごとに運転免許制度が定義されていますが、AWS 国の「免許の種類」「受験資格」は全リージョン共通です。
- もし「東京リージョンでのみこれをすることを許可する」といったときは、「免許の種類」を定義するとき「免許の条件等」
"Statement": [{"Condition": {ここ}}]に「リージョンは東京に限る」"StringEquals": {"aws:RequestedRegion": "ap-northeast-1"}などと書くことになると思います。日本国の免許の条件等にも「眼鏡等」「普通車は AT 車に限る」などがありますが、AWS 国の免許はこのリージョンの他、「この IP に限る」や、「何月何日何時から何時に限る」といった条件を付けることもできます。
誰かに何かするのを許可する具体例
以下、誰かに何かするのを許可する具体例を挙げます。
ブラウザ上の AWS マネジメントコンソールの IAM 画面からの操作を想定しています。
具体例1. EC2 インスタンスに AWS 製品の料金情報の取得を許可する
AWS の各製品の料金情報を取得したいことはあると思います。これを EC2 インスタンスから取得するには EC2 インスタンスに取得を許可する必要があります。
-
ポリシーを定義します (名前は例えば
policy-pricing-getproductsとします)。- アクションに
"pricing:GetProducts"を指定します。
- アクションに
-
ロールを定義します (名前は例えば
role-ec2-pricing-getproductsとします)。- EC2 に許可を与えたいので、「信頼されたエンティティタイプ」は「AWS のサービス」を選択し、「ユースケース」のプルダウンで「EC2」を選択します。
- 「許可ポリシー」では先ほど定義したポリシーを検索してチェックします。
あとはこのロールを EC2 インスタンスにアタッチすれば、そのインスタンスから料金情報が取得できるようになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "pricing:GetProducts",
"Resource": "*"
}
]
}
具体例2. EventBridge Scheduler に EC2 インスタンスの起動・停止を許可する
EC2 インスタンスの自動起動・停止をスケジュールしたいことはあると思います。これには EventBridge Scheduler に EC2 インスタンスの起動・停止を許可する必要があります。
-
ポリシーを定義します (名前は例えば
policy-ec2-start-stopとします)。 -
ロールを定義します (名前は例えば
role-scheduler-ec2-start-stopとします)。- EventBridge Scheduler に許可を与えたいので「信頼されたエンティティタイプ」で「カスタム信頼ポリシー」を選択し、JSON 入力欄のプリンシパルの箇所に直接
"Service": "scheduler.amazonaws.com"を書き込みます (以下) 3。 - 「許可ポリシー」では先ほど定義したポリシーを検索してチェックします。
- EventBridge Scheduler に許可を与えたいので「信頼されたエンティティタイプ」で「カスタム信頼ポリシー」を選択し、JSON 入力欄のプリンシパルの箇所に直接
あとは EventBridge でスケジュールを作成し、実行ロールとして上記で定義したロールを指定すれば、EC2 インスタンスのスケジュール起動・停止ができます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeInstances",
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": "*"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}