AssumeRoleを自分なりに理解する～「勇者」と「伝説の剣」と「妖精」の物語～

AssumeRole、繰り返し学習する度にゲシュタルト崩壊して分からなくなり、ふり出しに戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/bb3f0fcc-f7b0-3dec-2643-75e097e9d655.png)

:::note info
「AssumeRoleなんもわからん」から「なんとなくわかった」になるのを目的としているため、正確さにかける表現がある場合があります。正しい情報はAWS公式ドキュメントをご参照ください。
:::
※[チバユキさんの伝説のブログ](https://dev.classmethod.jp/articles/iam-role-passrole-assumerole/)に多大な影響を受け、この記事を書いています。

# 1.「勇者」と「伝説の剣」と「妖精」の物語
ある最果ての地に伝説の剣があった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/087d8b8e-3c79-77a5-14e4-cf521dc0dcce.png)
伝説の剣には魔力が宿っていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/67b38945-e3ae-cc1f-cc3c-241ca2f9ceb4.png)
選ばれし者だけが、伝説の剣を抜くことができるという。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3d5365a6-b581-a470-d1e0-3541a9661efe.png)
伝説の剣のもとには、剣の力を選ばれし者へ与える妖精がいるという。妖精は剣の声を聴き、力を与える者を選ぶ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/cbb4feb2-8e32-5a7f-9ecd-a006b9959097.png)

関係はこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/10d5302c-743f-01d6-3761-e431eb250acb.png)

剣には宿る能力のリストがあり、別途、剣を抜ける選ばれし者のリストがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/c797a40f-325c-0f17-7c80-7515c57a3c3f.png)

剣（IAMロール）に宿る力（ポリシー）のリストはユーザーベースのポリシーである。
剣（IAMロール）を抜ける選ばれし者（Principal）のリストは信頼ポリシーである。
選ばれし者（Principal）に剣（IAMロール）の力を与える妖精（STS）がいる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/d8a257ad-b042-c1a5-0d10-a6e4a3597cf4.png)

剣（IAMロール）に宿る力（ポリシー）のリスト（ユーザーベースのポリシー）

- 火
- 水
- 雷

剣（IAMロール）を抜ける選ばれし者（Principal）のリスト（信頼ポリシー）

- Lambda一族
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/da209a38-3880-8def-0b2a-2ea55982a6c4.png)

妖精（STS）は信頼ポリシーに示された選ばれしPrincipalにしか妖精の力を貸さない。
妖精（STS）の力を借りることができる選ばれしPrincipal・Lambda一族の者だけが、妖精（STS）の力を借りて剣（IAMロール）を抜き、ユーザーベースのポリシーに示された火・水・雷の力（ポリシー）で戦うことができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/d1429d98-4706-486f-e7e2-7ad7dc52e012.png)

ただし、妖精の力（STSが発行した一時トークン）は永続的に使えるものではない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3f061afa-2cbf-bfff-15e3-856aff9d425d.png)
妖精と勇者・Lambdaの冒険は、今始まったばかり…

------------------------

もういいですね。
AssumeRoleとは「**IAMロールを引き受ける動作・アクション**」のことです。

# 2.IAMポリシー3種類
IAMポリシーの種類をおさえる。
## 2-1.ユーザーベースのポリシー
- 「IAMユーザ」「IAMグループ」「IAMロール」に関連づけることができるポリシー
- 別名「アイデンティティベースのポリシー」
- 操作主体（誰が使うか）は関連付けられた「IAMユーザ」「IAMグループ」「IAMロール」のいずれか。暗黙的に自明
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/6d495cae-ff8c-3f63-fb2b-83f11805ec6f.png)

## 2-2.リソースベースのポリシー
- ユーザーベースのポリシーと似ているが、関連づけ先がユーザーではなく「AWSサービス」である
- よく使われるのはS3のバケットポリシー、Amazon SQS キューポリシーなど
- 操作主体（誰が使うか）を表す**Principal**の明記が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/846ef045-9583-614b-7e09-c3f38a4b5a48.png)

## 2-3.IAMロールの信頼ポリシー
- 別名「信頼関係」「信頼ポリシードキュメント」（揺らぎあり）
-  **IAMロールの権限移譲先（Principal）** を記載。 **IAMロールに組み込む** もの。
- 信頼ポリシーで書くアクションは「 **sts:AssumeRole** 」だけ
- 信頼ポリシーを関連づけたIAMロールが保有する権限（やっていい操作）を、Principalに移譲(を許可)する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a134f74e-58a3-1a43-b636-cde73b98f4f2.png)

つまりIAMロールは二種類のポリシーを持つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/4a3fdd5c-77ed-bb9c-2d70-1da2664a6f81.png)

この「 **sts:AssumeRole** 」が今回焦点をあてて理解したい部分。
「assume」には「（役割・責任を）引き受ける」という意味があり、AssumeRoleとは **「IAMロールを引き受ける」という動作・アクション** のことを言う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/5b3c7e58-54dc-52ae-e531-d711d53f5eae.png)

# 3.IAMロールを使うときの流れ
たとえばLambdaにIAMロールを引き受けさせたいときのざっくりイメージ例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/df9cc8c9-6a41-7108-cc01-63ecc0976cf6.png)
①LambdaがIAMロールを引き受けよう（AssumeRole）と思う
②STSが信頼ポリシーを確認し、IAMロールを引き受けていいか判断する
③STSがPrincipal（今回はLambda）に一時トークンを発行する
④一時トークンを使って、（IAMロールに関連付けられている）ユーザーベースのポリシーで許可された操作を行う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/5e0b74cb-933f-4c0a-491f-574122f9f638.png)

簡略化してもう一回。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/4c05a7be-7827-ebf5-e9f6-c85ef6c29f89.png)

# 参考

https://dev.classmethod.jp/articles/iam-role-passrole-assumerole/#toc-10

https://docs.aws.amazon.com/iam/index.html