IAMロールとAWSサービスロールの違いって何？（自分なりの理解）

## はじめに
レプリケーションの設定をしている時に、IAMロール・AWSサービスロールという2つが出てきてそれぞれのロールの違いって何？となったので色々調べて自分なりに理解したのでそれを備忘録として残す

## IAMロール（単に「ロール」）とは
[公式の説明](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-role)の通り、IAMロール（単に「ロール」）とは、一時的な権限としてユーザとかサービスに権限を付与するのに使うもの

このロールは同一AWSアカウント内のユーザの権限を制御するためにあるものではなく、

- AWSのサービスに対して権限を付与する
- 他のAWSアカウントのユーザに一時的に使ってもらうための権限を付与する
- WebサービスからAWSのアクセスしたりするための権限を付与する

という事をするために存在する
そのため、AWSアカウントに属するユーザに対して権限を制御をするのにロールをアタッチして・・・という事は行わない
（AWSアカウントに属するユーザに対する権限設定は、ユーザに管理ポリシー・インラインポリシーなどを付与する）

それは実際にManagement Console上から[新規ロールを作成するという手順](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console)を見ると分かるが、以下の画像のようにロール作成時には`信頼されたエンティティの種類の選択`というStepが必須で存在し、信頼されたエンティティとは、`自分のAWSにアクセスしてもいいと思う＝信頼するアクセス元（エンティティ）`という意味と思われるので、何か（ユーザ・サービスなど）に権限を与えるためのものと考えられる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/e166f258-5abe-52c5-338f-f0d6a99f8c5c.png)

・参考：[ロールの用語と概念　ロール](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-role)
・参考：[IAMロールと信頼されたエンティティの関係性](https://qiita.com/yuta-katayama-23/items/7055c1a2e5a9cddf7a76)
・参考：[自分なりにAWS IAMについてまとめた　ロール](https://qiita.com/ot-nemoto/items/5067ac7555213a4794d5#%E3%83%AD%E3%83%BC%E3%83%AB)

## AWSサービスロール（単に「サービスロール」）とは
[^サービス]: ・Lambda<br>・S3<br>・Code Buildなどなど
[公式の説明](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-service-role)の通り、AWSの各サービス[^サービス]に、ユーザに代わって何かを行う権限を付与するためのロール

※ユーザに代わって何かを行うの例としては、

- S3のレプリケーション
- Code BuildでBuildする時にCode Commitからソースコードをチェックアウトする
- LambdaからECSのUpdateService、CloudFrontのCreateInvalidationを実行する

といった事で、ユーザがAWSの各サービスAPI（AWS CLIコマンドでできる事と思ってOK）を呼び出して行う操作

ここで、『あれIAMロールもAWSのサービスに権限を付与するために使えるとなっていたけどどういう事？』となるが、サービスロールとは上記で書いた**IAMロールの中のサービスに限定したものでARNのパスでサービスロールと識別できるもの**と考えられる
（「信頼されたエンティティの種類」がAWSサービスを選択したIAMロール ＝ AWSサービスロール）
ロールとしての機能は、IAMロールもAWSサービスロールも同じ（実際にIAMロールとサービスロールとで同じ事ができる事を確かめた記事は[ここを参照](https://qiita.com/ot-nemoto/items/cb0ec592451ae171d30f)）

※[IAM 識別子](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_identifiers.html)というページに書かれているように、あくまで**識別子**で分かりやすくするためにロールのARNのパスを`/service-role/`としているだけ（ARNを見た時に、`/service-role/`となっていれば見ただけで、『あーこれはサービスロールなのね』と分かるという事）

・参考：[自分なりにAWS IAMについてまとめた　サービスロール](https://qiita.com/ot-nemoto/items/5067ac7555213a4794d5#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%AD%E3%83%BC%E3%83%AB)

## 各ロールの見分け方
- **IAMロール**<br>ロールのARNのパスが`/`であるもの<br>ロールのARNは`arn:aws:iam::123456789012:role/{role名}`という形式
- **AWSサービスロール**<br>ロールのARNのパスが`/service-role/`であるもの<br>ロールのARNは`arn:aws:iam::123456789012:role/service-role/{ロール名}`という形式

| IAMロール | サービスロール |
|:-:|:-:|
| ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/274b625a-04f0-c200-dab0-217be29e5931.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/91d0e16e-6451-6ac4-ec5b-76765e5cda58.png) |

ちなみに、Management Consoleから[AWS のサービス用ロールの作成 (コンソール)](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_create_for-service.html#roles-creatingrole-service-console)の手順でロールを作成すると必ずIAMロールになる
これはAWS CLIコマンドの`create-role`の説明を見ると、

>This parameter is optional. If it is not included, it defaults to a slash (/).<br>このパラメーターはオプションです。 含まれていない場合、デフォルトでスラッシュ（/）になります。

と書かれているように、オプションで指定しないとデフォルトでパスが`/`になるため
つまり、Management Consoleからではpathのオプション設定ができないので、サービスロールである事を識別できるようにしたい時はAWS CLIコマンドでロール作成を行う必要がある

・参考：[AWS CLI　create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html)
・参考：[【AWS】IAM ロールのパスをルート(/)以外にする](https://qiita.com/d_desuyon/items/4fba127ce566e909985d)