AWS豆知識: IAM Policy の Version がいつも 2012-10-17 なのはなぜか
AWS IAM Policy の Version がなぜ 2012-10-17 なのかを解説します。Version の意味、各 AWS サービスの API バージョンとの違い、Version を省略した場合の挙動までまとめて確認できます。
AWS を使っていると、IAM Policy の Version に 2012-10-17 が指定されているのをよく見かけます。
1
2
3
4
5
6
7
8
9
10
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}
初めて見ると、次のような疑問を持つ人も多いと思います。
- なぜいつもこの日付なのか
- AWS は更新され続けているのに、なぜ Version は変わらないのか
この記事では、この日付が何を意味しているのかを、よくある疑問に沿って整理していきます。
IAM Policy の Version が 2012-10-17 なのはなぜか
結論から言うと、2012-10-17 は IAM Policy Language のバージョンです。AWS の全サービスで共通して使われる API バージョンではありません。
AWS の API バージョンはサービスごとに異なります。たとえば、次のようなものがあります。
- Amazon S3:
2006-03-01Amazon S3 API リファレンス - AWS Lambda:
2015-03-31AWS Lambda GetFunction API リファレンス1
GET /2015-03-31/functions/FunctionName?Qualifier=Qualifier HTTP/1.1
- Amazon EC2:
2016-11-151
API Version: 2016-11-15
つまり、IAM Policy でよく使われる Version は 2012-10-17 ですが、AWS の API がすべて同じバージョンという意味ではありません。
なぜ 2012-10-17 という日付なのか
もっともよく知られている説明は、2012-10-17 が IAM Policy Language の大きなアップデートを示す日付だ、というものです。
このバージョンでは ${aws:username} や ${aws:PrincipalTag} のような Policy Variables が導入され、1 つのポリシーを多くのユーザーやロールに対して柔軟に使い回しやすくなりました。
そのため、IAM Policy では 2012-10-17 が事実上の標準として広く使われています。
Version を書かないとどうなるか
Version を省略すると、AWS は古い 2008-10-17 のルールでポリシーを解釈します。
その場合、${aws:username} のような文字列は変数として解釈されず、ただの文字列として扱われることがあります。
どこで 2008-10-17 をまだ見かけるのか
2012 年以前に作成され、その後あまり手が入っていない AWS アカウントでは、Version フィールドを持たない Inline Policy が今でも多く残っていることがあります。
公式には、JSON ポリシードキュメントで Version を完全に省略した場合、IAM は 2008-10-17 の解釈ルールを使います。
そのため、表からは見えにくいものの、2008 世代のポリシーが今もそのまま使われているケースがあります。
また、AWS Console で一部のリソース向けアクセスポリシーを作成すると、自動生成される JSON テンプレートが 2008-10-17 を初期値にしていることがあります。これは 2012-10-17 が使えないからではなく、既存システムや API との互換性を優先しているためです。
- SQS Queue Policies: SQS コンソールで「ポリシーを編集」を開くと、初期テンプレートが
2008-10-17のままになっていることがあります。 - SNS Topic Policies: SQS と同じく、SNS の既定ポリシー JSON でも 2008 形式が表示されることがあります。
- VPC Endpoint Policies (Gateway タイプのみ): S3 や DynamoDB 向けの Gateway Endpoint では、既定ポリシーが 2008 と記載されることがあります。
なぜこれらの古い Version は自動的に更新されないのか
これは、サービス側 API の設計、たとえば SQS の SetQueueAttributes などと関係しています。
- API 互換性: 多くの Resource Policy は IAM API ではなく、各サービスの API 経由で管理されます。古くからある API との互換性を壊さないために、AWS は既定値をあえて維持しています。
- 求められる要件が比較的シンプル: SQS や SNS では、多くの場合、特定の ARN に対して Allow または Deny を設定できれば十分で、2012 版の高度な変数機能が必須とは限りません。
将来 Version は更新されるか
今後新しいバージョンが出る可能性はありますが、現時点では公式な発表はありません。
仮に新バージョンが登場しても、AWS は通常、既存との互換性を保つために旧バージョンをしばらく残します。実運用では、可能な範囲で新しいバージョンを使うのがよいでしょう。