ReadOnlyAccessポリシーがアップデートされてマネジメントコンソールからCloudFront Functionsのコード等を確認できる権限が追加されました

少し前まで、ReadOnlyAccessポリシーのIAMでは権限不足でマネジメントコンソールからCloudFront Functionsのコードなどが参照できない状態でした。ポリシーにアップデートがあり現在では参照できるようになっています。
2021.10.29

はじめに

清水です。今年2021年初夏にリリースされたCloudFront Functions (CF2)、Lambda@Edgeに比べ処理内容はシンプルなものに限定されますが、ユースケースが当てはまると大変便利に活用できます。またマネジメントコンソールからFunctionのテスト実施など、パブリッシングまでの手続きを踏める点も個人的にお気に入りです。そんなCF2、これまではAWS管理ポリシーReadOnlyAccess権限を持ったIAMユーザ/ロールでマネジメントコンソールを確認した際、Functionの一覧画面までは表示できてもコードなどが確認できる個々のFunction詳細画面は表示できない状態でした。ReadOnlyAccessポリシーの権限が不足しているのかな、ぐらいに思っていたのですが、先日この詳細を確認していたところ、ちょうどReadOnlyAccessポリシーのアップデートに遭遇しました。日本時間で2021/10/27の出来事です。結果、「ReadOnlyAccessではマネジメントコンソールからCF2のコード参照ができない」問題が解決されたことなどが確認できたので、本エントリにまとめておきたいと思います。

ReadOnlyAccessでCloudFront Functionsのコードを確認する方法の模索

本エントリで扱う事象、「ReadOnlyAccessポリシーのアップデートでCF2のコードがマネジメントコンソールから確認できるようになった」ことに気がついたきっかけを振り返っておきます。以前からReadOnlyAccessのIAMでCF2のコードがマネジメントコンソールから参照できない事象は把握していました。具体的には、以下のFunctionsの一覧画面までは参照可能でした。

しかしこのあと、Functionの名称をクリックして詳細画面に進もうとすると、以下のように「Failed to load function」のエラーが発生していましした。こちらの画面は後述するようにIAMでの権限を微調整して当時の状況を再現したものになります。エラー内容の詳細は厳密には異なりますが、このように権限不足でFunctionの詳細が表示できず、コードも表示できない、という状態でした。

個人的にはFunctionの変更の必要がなければ参照権限のみのReadOnlyAccessでアクセスし、コードなどの確認をしたいなと考えていました。(不必要に操作権限を持つユーザを使いたくありません。)ReadOnlyAccess権限のみで、Functionの詳細情報すべてではなくても、例えばコードだけでも確認する方法などがないかな、と。こちらについては、例えばAWS CLIを使ってaws cloudfront get-functionコマンドでCF2コードの確認(ダウンロード)などができる、ということが確認できました。

% aws cloudfront get-function --name Basic-auth-TEST output-filename.js
{
    "ETag": "E3UNXXXXXXXXXX",
    "ContentType": "application/octet-stream"
}

またこの段階でReadOnlyAccessポリシーにはcloudfront:Get*cloudfront:List*が確認でき、CloudFrontReadOnlyAccessポリシーとの差分などからcloudfront:DescribeFunctionあたりの権限がReadOnlyAccessポリシーには不足しているため、マネジメントコンソールからコードの参照(Functionの詳細画面の表示)ができないのかなぁ、などと推測をしておりました。(この時点でCloudFrontReadOnlyAccessポリシーではマネジメントコンソールからのコードの参照が可能でした。)これがちょうど、2021/10/26のことでした。

2021/10/27にバージョンアップしたReadOnlyAccessポリシー

翌2021/10/27、もういちど権限まわりを確認してきちんとまとめておこうとしたところ、ReadOnlyAccess権限でもマネジメントコンソールからCF2のコードが確認できてしまいました。検証中だったのでIAMの権限まわりの調整を間違えたのかとも思いましたが、そうではありません。

そういえばAWS管理ポリシーもバージョンアップがあるよな、ということでポリシーのバージョンについて確認してみます。ちょうど2021-10-27 05:14 UTC+0900に現時点のデフォルトバージョン、Version 82にバージョンアップしていました。

左側の三角形をクリックすると、各バージョンのポリシー内容が参照できます。ここから、Version 82とその1つ前、Version 81をdiffコマンドで比較してみました。事前にjqでの整形も入れています。

% diff <(jq . ReadOnlyAccessVersion82.json) <(jq . ReadOnlyAccessVersion81.json)
166d165
<         "cloudfront:DescribeFunction",
1026d1024
<         "support:DescribeCases",

"cloudfront:DescribeFunction"が追加されていることがわかります。具体的にいえば、"Effect": "Allow""Resource": "*"に対して、"Action":"cloudfront:DescribeFunction"が追加されていることになります。この"cloudfront:DescribeFunction"権限でマネジメントコンソールのFunctionのコードなどが確認できるようになったわけです。

ポリシーアップデート前の状態の再現

本エントリをまとめるにあたり、当時(ReadOnlyAccessポリシーアップデート前)の状況を再現して権限不足のエラー内容などを確認しています。具体的には、ReadOnlyAccessのVersion 81からVersion 82のアップデートで"cloudfront:DescribeFunction"の権限が追加されているので、ReadOnlyAccessポリシーをアタッチしたIAMにインラインポリシーで"cloudfront:DescribeFunction"をDenyするようにしています。権限の優先順序としては、「明示的なDeny > 明示的なAllow > 暗黙的なDeny (デフォルト)」となるので、「明示的なAllow」により強い「明示的なDeny」を使って権限を制限しているわけです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "cloudfront:DescribeFunction"
            ],
            "Resource": "*"
        }
    ]
}

この他にも、古いバージョン(今回ならVersion 81)のポリシーをまるっとコピーしてインラインポリシーなどカスタムポリシーで指定する、ということも検討できるかと思います。カスタマー管理ポリシーであればバージョンのデフォルト設定を変える、などの対応もできるかと思いますが、AWS管理ポリシーの場合はこのような方法での再現になるのかな、と思いました。

まとめ

AWS管理のIAMポリシー「ReadOnlyAccess」に"cloudfront:DescribeFunction"が日本時間2021/10/27日付けで追加されており、ReadOnlyAccess権限でもマネジメントコンソールからCloudFront Functionsのコードが参照可能になっていたアップデートをまとめみました。ものすごく細かいアップデートなのですが、個人的にちょうどこのあたりを調査しており、たまたまReadOnlyAccessポリシーのバージョンアップタイミングに遭遇したことからまとめてみたしだいです。ReadOnlyAccess含め、AWS管理ポリシーはちょいちょいバージョンアップが入ります。今回のようにリリース直後のサービスなどで権限不足で参照できない、といったことがあった場合でも、しばらくすると参照できるようになっている、なんてこともまれによくあるのではないかと思います。