こんにちは、Reoです。
フリーランスのインフラエンジニアとして働きながら、インフラ学習サービス「InfraDojo(インフラ道場)」を運営しています。
AWSの学習でIAMポリシーを開くと、こんな項目が並びます。
Effect
Action
Resource
「権限を設定しているのは分かるけれど、どこから読めばいいの?」
今回は、S3の一覧表示とデータ取得を例に、**「何を、何に対して許可するか」**という読み方を整理します。
まずは3つの項目に注目する
今回は、IAMユーザーやロールに付ける「アイデンティティベースのポリシー」を扱います。
最初に見るのは、次の3つです。
| 項目 | 読み方 | 例 |
|---|---|---|
Effect |
許可するか、拒否するか | Allow |
Action |
何の操作をするか | s3:GetObject |
Resource |
何を対象にするか | S3オブジェクトのARN |
Allow は許可、Deny は明示的な拒否を表します。
Action には操作、Resource にはその操作の対象を書きます。対象の識別には、ARNというAWSリソースを表す名前を使います。IAMポリシーの構成要素
たとえば、次のように読みます。
指定したS3オブジェクトに対して、データを取得する操作を許可する。
Actionだけでなく、Resourceまでセットで読むのがポイントです。
S3の「一覧表示」と「取得」は別の権限
S3では、次の2つは別の操作です。
- バケット内のオブジェクト一覧を取得する
- オブジェクト本体を取得する
対応する権限と対象も変わります。
| やりたいこと | Action | Resourceの対象 |
|---|---|---|
| オブジェクト一覧を取得 | s3:ListBucket |
バケット |
| オブジェクト本体を取得 | s3:GetObject |
オブジェクト |
このため、一覧表示を許可していても、それだけでデータ本体を取得できるわけではありません。S3の権限設定例
バケットと、その中のオブジェクトでは、ARNの形も異なります。
バケット
arn:aws:s3:::amzn-s3-demo-bucket
特定のオブジェクト
arn:aws:s3:::amzn-s3-demo-bucket/reports/sample.csv
Resource を読むときは、バケット名で終わっているか、その後ろにキーが続いているかを確認してみてください。
ポリシーを一つ読んでみる
次のJSONは、読み方を練習するためのサンプルです。
AWSへ適用せず、内容を確認していきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
},
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/reports/*"
}
]
}
Statement の中に、2つの設定が入っています。
1つ目:バケット内の一覧取得を許可する
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
}
対象は、バケットそのものです。
この設定には、一覧取得の範囲をプレフィックスで絞る条件がありません。そのため、一覧取得は reports/ に限定していません。
2つ目:reports/から始まるオブジェクトの取得を許可する
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/reports/*"
}
こちらの対象は、reports/ から始まるキーを持つオブジェクトです。
末尾の * は、任意の文字列に一致するワイルドカードです。
たとえば、次のキーが対象になります。
reports/sample.csv
reports/2026/october.csv
一方、次のキーは、この設定の取得対象には含まれません。
images/logo.png
つまり、このサンプルは「一覧取得の範囲」と「データ取得の範囲」が異なります。
同じStatement内のActionとResourceを対応させて読むと、この違いが見えてきます。
jqで必要な項目を取り出す
JSONを読む練習として、先ほどのサンプルを新しい作業フォルダの policy.json に保存してください。
ここでは、JSONを処理するコマンド jq が使える環境を前提にします。AWSアカウントへの接続は不要です。
次のコマンドを実行します。
jq '.Statement[] | {Effect, Action, Resource}' policy.json
出力は次のようになります。
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
}
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::amzn-s3-demo-bucket/reports/*"
}
コマンドの意味は、次のとおりです。
| 部分 | 意味 |
|---|---|
.Statement[] |
Statementの各要素を順番に取り出す |
| |
取り出した値を次の処理へ渡す |
{Effect, Action, Resource} |
指定した3項目を取り出す |
今回は小さなJSONですが、項目が増えたときにも、見る場所を絞る助けになります。
ただし、これはJSONから項目を取り出す処理です。IAMポリシーとして正しいか、実際にアクセスできるかを検証するものではありません。
Allowがあっても、必ず操作できるとは限らない
実際のAWSでは、一つのポリシーだけでアクセス可否が決まるとは限りません。
ほかのポリシーの明示的な拒否や、アクセス許可の境界、AWS Organizationsの制限なども関係します。明示的な拒否は、許可より優先されます。AWSのポリシー評価
そのため、先ほどのJSONに含まれない操作についても、「この設定では許可していない」と「実際に必ず拒否される」は分けて考える必要があります。
まずは、目の前の設定が何を許可しているかを読めるようになることから始めましょう。
「操作」と「対象」を言葉にしてみよう
IAMポリシーを読むときは、一つのStatementごとに、次の順番で整理してみてください。
-
Effect:許可か、明示的な拒否か -
Action:何の操作か -
Resource:どのリソースに対する操作か
そして、
このバケットの一覧取得を許可する。
reports/から始まるオブジェクトの取得を許可する。
というように、日本語で説明してみると理解を確かめられます。
今回のように、コマンドで必要な情報を取り出して読む練習は、AWS以外のインフラ学習にも役立ちます。
ターミナル操作から慣れていきたい方は、InfraDojoも活用してみてください。ブラウザ上のターミナルで、Linuxの基本操作を実際に入力しながら学べます。
▼ InfraDojo(インフラ道場)
