IAM権限のトラブルシュートが少しだけ楽になりそうな話

# はじめに
昨日ネットサーフィンしていたら以下のようなリリースを見つけました。

* [AWS ID とアクセス管理により、AWS でアクセス拒否エラーのトラブルシューティングを行う方が効率的になりました。](https://aws.amazon.com/jp/about-aws/whats-new/2021/11/aws-identity-access-management-efficient-troubleshoot-error/)

以下を見る限り拒否されたときのメッセージがより詳細になったということかなと思いました。
業務でIAMの権限作っていてどの権限が足りないとか毎回全部調査していたので、どの程度詳細に出るようになったのか確認してみます。

>Amazon ウェブサービス (AWS)でのアクセス権限のトラブルシューティングを迅速に行う手助けをするために、AWS アイデンティティおよびアクセス管理 (IAM) に、アクセス拒否エラーメッセージで拒否されたアクセス権限を担当するポリシータイプが含まれるようになりました。

尚、最初は以下の3つのサービスのみで、それ以外のサービスは今後追加されているようです。
今回はたまたまテストで作っていたCodeCommitの環境があったので、それを使って確認してみます。

>Amazon Sagemaker、AWS CodeCommit、AWS Secrets マネージャーは、この追加コンテキストを提供する最初の AWS サービスの 1 つです。

# 実施内容
## 別サービス(EC2)で確認
まずは上記に含まれていないサービスでどのように拒否メッセージが出力されるか確認してみます。
こちらもたまたまテストで作ったEC2があったので、それを使ってみます。


まずは拒否権限無しでCLIでEC2の情報が取得できることを確認します。

```
> aws ec2 describe-instances --instance-ids i-0615XXXXXXXcb79
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "InstanceType": "t2.small",
                    "KeyName": "keypair",
                    "LaunchTime": "2021-11-05T07:21:06+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "ap-northeast-1a",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
~~以下略~~
```

EC2操作を拒否するためにIAMユーザに以下のポリシーをアタッチします。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": "ec2:*",
            "Resource": "*"
        }
    ]
}
```

出力された拒否メッセージはシンプルなもので、操作権限がないよとだけ言われています。

```
> aws ec2 describe-instances --instance-ids i-0615XXXXXXXcb79

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
```

## CodeCommitで確認
今度は対象となっているCodeCommitで試してみます。
こちらもEC2と同じくまずはCodeCommitの情報が取得できることを確認します。

```
> aws codecommit list-branches --repository-name TestRepoA
{
    "branches": [
        "master",
        "test"
    ]
}
```

続いてIAMユーザにCodeCommit操作を拒否するポリシーをアタッチします。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": "codecommit:*",
            "Resource": "*"
        }
    ]
}
```

そして再度同じコマンドを実行してみると...おお！なんか詳細にメッセージが出力されてきました。

```
> aws codecommit list-branches --repository-name TestRepoA

An error occurred (AccessDeniedException) when calling the ListBranches operation: User: arn:aws:iam::XXXXXXXXXXXX:user/test_user is not authorized to perform: codecommit:ListBranches on resource: arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:TestRepoA with an explicit deny in an identity-based policy
```

メッセージとしては、「どのユーザが」「どのリソースに対して」「どの操作をしようとしたときに」「どのポリシーで明示的に拒否されている」ということが記載されているようです。(拙い英語力で読む限りは)
もっと複雑な権限で試せるとよかったのかもしれませんが、これだけでも今までのメッセージに比べると全然わかりやすくなっています。

公式にはSCPで拒否されていることもメッセージに出力されるとあるので、トラブルシュートの速度とその後の対応のスピード感はこのリリースで上がるかもしれませんね。

>たとえば、Amazon Sagemakerで DescribeDomain アクションを試みる開発者がアクセスを拒否されると、このエラー メッセージは、中央セキュリティ チームが管理するサービスコントロールポリシー (SCP) によってアクセスが拒否されたことを理解できます。

## ちなみに
拒否ではなく許可権限が不足しているユーザでCodeCommitに対してコマンドを実行してみました。

```
> aws codecommit list-branches --repository-name TestRepoA --profile test-devuser

An error occurred (AccessDeniedException) when calling the ListBranches operation: User: arn:aws:iam::XXXXXXXXXXXX:user/test-devuser is not authorized to perform: codecommit:ListBranches on resource: arn:aws:codecommit:ap-northeast-1:XXXXXXXXXXXX:TestRepoA because no identity-based policy allows the codecommit:ListBranches action
```

許可されていない場合もどの権限が足りていないかがメッセージに出力されるので、不足している権限の確認がすぐにできて良いですね。

# おわりに
今はまだ3サービスのみですが、今後は他のサービスにも展開していくとのことなので楽しみですね。
早くリリースしてもらいたいところです。