IAMロールについて

# はじめに
SAAを取得してCLIの勉強の為に[connpassのJAWS-UG CLI専門支部](https://jawsug-cli.connpass.com/)に参加して、CLIもIAMも全く理解出来ていなかった為、復習とアウトプットの為に記事にする事にしました。
アウトプット慣れしていない事やそもそも学歴がないので変な文章・間違った知識がある場合はご指摘は歓迎します。

# 私のスペック
SESでエンジニア歴1年ほど、それまでは6年ほど営業職
JsとC#で開発経験・インフラ経験は無し
SAAは取得済み

# IAMロールとは
IAMとはAWSリソースへのアクセスを管理するための`認証認可を制御するサービス`です。

その中でロールはAWSサービスやアプリケーションなどのエンティティからAWSリソースを操作する権限を付与することができる機能です。

ここでいう`認証は「誰に」`、`認可は「何を許可/禁止」`
と考えてもらえればわかりやすいです。
そして`ロールは「誰に」`の部分を制御し、`ポリシーは「何を許可/禁止」`する部分です。

ポリシーをロールにアタッチをし
そのロールをアタッチすることでポリシーで定義した権限を与えることができます。
# Assumeロール・信頼ポリシー

ロールを作成する際に信頼ポリシーと言う「誰を」信頼するかを
json形式で定義したファイルが必要になります。
以下の様なのが例です。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "sts:AssumeRole", 
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com" //ec2を信頼する
            }
        }
    ]
}
```
ここではPrincipalとはAWSリソースへのアクセスを許可するエンティティを指定します。
この場合ec2を許可している事になります。
またアカウントIDを指定してアカウントを信頼することでもできます。


また、sts:AssumeRoleは一時的なセキュリティ認証情報のstsが裏側で作成されています。
CLIやGUIでAWSリソースやサービスを操作するにはアクセスキー、シークレットアクセスキーを使いアクセスしますが、ロールをアタッチする事によりこのAssumeRoleがアクセスキー・シークレットアクセスキー・セッショントークンを与えてくれます。

# インスタンスプロファイル
では実際にロールを作ってみようと思った矢先に大事な物を必要です。
それがインスタンスプロファイルです。

ずっとコンソールで操作をしているだけだった私は初めて聞いたとき何それとコンソール上のどこにも無いと戸惑いました。
このインスタンスプロファイルはCLIでロールを作成する際に出てくる大事な箱です。

箱と言っても何の箱と？と思うかもしれませんが
ec2インスタンスとIAMロールを結び助けるための箱です。

コンソール上ではわからないのですがec2にロールをアタッチする際に「IAMロールを選択」
と表示されているプルダウンがありますよね？
そこに表示されているのがインスタンスプロファイルです。
実は裏側ではロールはec2に直接結ばれているのではなく
インスタンスプロファイルを通して　結ばれています。

# IAMポリシーの作成
ここから実際にポリシーを作成していきます。
```js:ポリシー名を指定
IAM_POLICY_NAME='AmazonEC2FullAccess'
```
```js:IAMポリシーARNを取得
IAM_POLICY_ARN=$( \
  aws iam list-policies \
    --scope AWS \
    --max-items 1000 \
    --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].Arn" \
    --output text \
) \
  && echo "${IAM_POLICY_ARN}"
```
以下結果
```
arn:aws:iam::aws:policy/AmazonEC2FullAccess
```
# IAMロールの作成
```js:ロールの利用を許可するサービス(ホスト名形式)を指定
IAM_ROLE_PRINCIPAL='ec2.amazonaws.com'
```
```js:信頼ポリシードキュメント用ディレクトリを指定
DIR_IAM_ROLE_DOC="${HOME}/environment/conf-handson-cli-iam-novice"
```
```js:信頼ポリシードキュメント名を指定
IAM_ROLE_DOC_NAME='handson-cli-iam-novice-role'
```
```js:信頼ポリシードキュメントのファイル名を指定
FILE_IAM_ROLE_DOC="${DIR_IAM_ROLE_DOC}/${IAM_ROLE_DOC_NAME}.json" \
  && echo ${FILE_IAM_ROLE_DOC}

// ${HOME}/environment/conf-handson-cli-iam-novice/handson-cli-iam-novice-role.json
```
```js:信頼ポリシードキュメントを作成
cat << EOF > ${FILE_IAM_ROLE_DOC}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "${IAM_ROLE_PRINCIPAL}"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF

cat ${FILE_IAM_ROLE_DOC}

```
以下結果
```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
```

# IAMロールの作成
```js:IAMロール名を指定
IAM_ROLE_NAME='handson-cli-iam-role'
```
```js:IAMロール名を作成
aws iam create-role \
  --role-name ${IAM_ROLE_NAME} \
  --assume-role-policy-document file://${FILE_IAM_ROLE_DOC}
```
以下結果
```
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17", 
            "Statement": [
                {
                    "Action": "sts:AssumeRole", 
                    "Sid": "", 
                    "Effect": "Allow", 
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    }
                }
            ]
        }, 
        "RoleId": "AROAUM3FYFHAKSSC6HKUX", 
        "CreateDate": "2022-05-08T13:20:49Z", 
        "RoleName": "handson-cli-iam-role", 
        "Path": "/", 
        "Arn": "arn:aws:iam::302471719360:role/handson-cli-iam-role"
    }
}
```
```js:作成したロールにポリシーをアタッチ
aws iam attach-role-policy \
  --role-name ${IAM_ROLE_NAME} \
  --policy-arn ${IAM_POLICY_ARN}
// 出力無し
```

# 終わりに
まだまだわからない事だらけです
そしてIAMは奥が深い

# 参考
・[AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/ja_jp/IAM/latest/UserGuide/intro-structure.html)
・[AWSサービス資料1](https://www.slideshare.net/AmazonWebServicesJapan/20190129-aws-black-belt-online-seminar-aws-identity-and-access-management-iam-part1)
・[AWSサービス資料2](https://www.slideshare.net/AmazonWebServicesJapan/20190130-aws-black-belt-online-seminar-aws-identity-and-access-management-aws-iam-part2)
・[クラスメソッドさんのDevelopersIO](https://dev.classmethod.jp/articles/iam-role-and-assumerole/)