インスタンスプロファイルをとことん掘ってみた


インスタンスプロファイル削除コマンド
```
aws iam remove-role-from-instance-profile --instance-profile-name instance-profile-name --role-name role-name
```
IAMロールのセッション時間：１時間
IAMロールには管理者権限付与

## まとめ
- インスタンスプロファイルがないと認証情報がセットされず、セッション有効期限後に権限がなくなる
- セッション有効期限の間は認証情報が有効なので古いインスタンスプロファイルの権限操作ができる

## インスタンスプロファイル削除することによる挙動
### インスタンスプロファイル情報
インスタンスプロファイル削除後、IAMコンソールで確認してみるとEC2のロールを作成するとあるはずの「インスタンスプロファイルの ARN」がなくなっている
インスタンスプロファイルがないとIAMロールを結び付けられないのでこれは重要
（参考）インスタンスプロファイルとは
https://qiita.com/sakai00kou/items/a4b96dcfa6bb3e656cd9

- 元の状態
```
{
    "InstanceProfiles": [
        {
            "InstanceProfileId": "**********", 
            "Roles": [
                {
                    "AssumeRolePolicyDocument": {
                        "Version": "2012-10-17", 
                        "Statement": [
                            {
                                "Action": "sts:AssumeRole", 
                                "Effect": "Allow", 
                                "Principal": {
                                    "Service": "ec2.amazonaws.com"
                                }
                            }
                        ]
                    }, 
                    "RoleId": "**********", 
                    "CreateDate": "2023-03-07T15:00:51Z", 
                    "RoleName": "role-name", 
                    "Path": "/", 
                    "Arn": "arn:aws:iam::**********:role/role-name"
                }
            ], 
            "CreateDate": "2023-03-07T15:00:53Z", 
            "InstanceProfileName": "instance-profile-name", 
            "Path": "/", 
            "Arn": "arn:aws:iam::**********:instance-profile/instance-profile-name"
        }
    ]
}
```
- インスタンスプロファイル削除後
```
aws iam list-instance-profiles-for-role --role-name  role-name
{
    "InstanceProfiles": []
}
```

### AWS CLIによる権限確認
- 元の状態
```
aws s3 ls
→バケット一覧が問題なく表示
```


- プロファイル削除後
```
aws s3 ls
→バケット一覧が問題なく表示
```

- セッション無効化
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html
```
aws s3 ls
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
```

- セッション無効化解除
    - セッション取り消し解除のために下記インラインポリシー削除
AWSRevokeOlderSessions
```
aws s3 ls
→バケット一覧が問題なく表示
```

- セッション有効時間経過後
```
 aws s3 ls
Unable to locate credentials. You can configure credentials by running "aws configure".
```


### インスタンスメタデータ

- 元の状態
```
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
role-name
```


- プロファイル削除後
```
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
role-name
```

- セッション時間経過後
```
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
  <title>404 - Not Found</title>
 </head>
 <body>
  <h1>404 - Not Found</h1>
 </body>
</html>
```

### インスタンス
オペレーションを呼び出すために認証情報が使用される IAM ユーザーまたはロールに関する詳細を返します。
これを実行するのにIAMロールの権限はいらない
しかし、セッション時間経過後に記載のエラーの通りクレデンシャルは必要になる。
https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html
- 元の状態
```
 aws sts get-caller-identity
{
    "Account": "**********", 
    "UserId": "**********:i-**********", 
    "Arn": "arn:aws:sts::**********:assumed-role/role-name/i-**********"
}
```


- プロファイル削除後
```
 aws sts get-caller-identity
{
    "Account": "**********", 
    "UserId": "**********:i-**********", 
    "Arn": "arn:aws:sts::**********:assumed-role/role-name/i-**********"
}
```

- セッション時間経過後
```
aws sts get-caller-identity
Unable to locate credentials. You can configure credentials by running "aws configure".
```

### 設定ファイルと認証情報ファイルの設定
aws sts get-caller-identityが発生した理由は認証情報がセットされなかったと話したので確認する。

- 元の状態
```
aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************ZOXG         iam-role    
secret_key     ****************tDAi         iam-role    
    region                <not set>             None    None
```

- プロファイル削除後
```
aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************ZOXG         iam-role    
secret_key     ****************tDAi         iam-role    
    region                <not set>             None    None
```

- セッション時間経過後
```
aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key                <not set>             None    None
secret_key                <not set>             None    None
    region                <not set>             None    None
```

## インスタンスプロファイルを再度作成
再作成→IAMロールに関連付け→インスタンスに再アタッチ→再起動で正常になる
再度作成してみるとインスタンスプロファイルの ARNが再度表示された
```
aws iam create-instance-profile --instance-profile-name instance-profile-name
{
    "InstanceProfile": {
        "Path": "/",
        "InstanceProfileName": "instance-profile-name",
        "InstanceProfileId": "****************",
        "Arn": "arn:aws:iam::****************:instance-profile/instance-profile-name",
        "CreateDate": "2023-03-08T02:38:54+00:00",
        "Roles": []
    }
}
aws iam add-role-to-instance-profile --instance-profile-name instance-profile-name --role-name role-name
aws ec2 describe-iam-instance-profile-associations
```

### 
下のようにメタデータを確認するとプロファイルがロールに関連づいてない旨のエラーが表示
インスタンスプロファイルは古いプロファイルの情報を参照しているため、コンソール画面から新しいインスタンスプロファイルをアタッチ
メタデータの更新のために停止して起動
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html
- インスタンスプロファイル再アタッチ直後
```
curl http://169.254.169.254/latest/meta-data/iam/info
{
  "Code" : "Success",
  "Message" : "Instance Profile does not contain a role. Please see documentation at https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_iam-ec2.html#troubleshoot_iam-ec2_errors-info-doc.",
  "LastUpdated" : "2023-03-08T03:22:55Z",
  "InstanceProfileArn" : "arn:aws:iam::****************:instance-profile/instance-profile-name",
  "InstanceProfileId" : "****************"
}
```

- インスタンス停止して起動後
```
curl http://169.254.169.254/latest/meta-data/iam/info
{
  "Code" : "Success",
  "LastUpdated" : "2023-03-09T07:52:06Z",
  "InstanceProfileArn" : "arn:aws:iam::**************:instance-profile/instance-profile-name",
  "InstanceProfileId" : "**************"
}
```
認証情報もセットされてるし、その他の操作も問題なくできてた