ARN(Amazon Resource Name)とは、AWS のリソースを1つに特定するための名前で、arn:パーティション:サービス:リージョン:アカウントID:リソース という、コロンで区切った6つの欄でできています。 IAM ポリシーの Resource、ロールの指定、サービス同士の連携など、「どのリソースか」を伝える場面で使います。

この記事では、主要33サービスの ARN を形式・実例つきの一覧にし、欄が空になるサービスとその理由、ワイルドカードがどこまで一致するか、CLI と boto3 での取得・組み立て・分解、ポリシーでエラーになる書き間違いまでをまとめます。

確認環境:Ubuntu 24.04 / AWS CLI 1.46.1 / Python 3.11 / boto3 1.43。コマンドは AWS の API をローカルで再現するツール(moto 5.2.3)で実行しました。掲載したコマンドは、ローカルの接続先を指定するオプション(--endpoint-url)を外し、実際の AWS でそのまま使える形にしています。

ARNの早見表(6つの欄の読み方)

arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image
 │   │    │         │              │            └ ⑥ リソース(種類と名前)
 │   │    │         │              └ ⑤ アカウントID(12桁、ハイフンなし)
 │   │    │         └ ④ リージョン
 │   │    └ ③ サービス
 │   └ ② パーティション
 └ ① 固定の文字 arn
番号 欄 入るもの 例
① 接頭辞 固定で arn arn
② パーティション リージョンのまとまり aws / aws-cn / aws-us-gov
③ サービス サービスの名前空間 s3 / iam / lambda / ec2
④ リージョン リージョンコード。空のサービスがある ap-northeast-1
⑤ アカウントID リソースを持つアカウントの12桁の番号。空のサービスがある 123456789012
⑥ リソース 種類と名前。区切りはサービスごとに違う function:resize-image / table/Orders

⑥のリソースの書き方は3種類あります。

形 一般形 例
名前だけ arn:partition:service:region:account-id:resource-id arn:aws:sqs:ap-northeast-1:123456789012:order-queue
種類/名前 arn:partition:service:region:account-id:resource-type/resource-id arn:aws:dynamodb:ap-northeast-1:123456789012:table/Orders
種類:名前 arn:partition:service:region:account-id:resource-type:resource-id arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image

どの形になるかはサービスごとに決まっているので、次の一覧で確かめてから書きます。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「AWS ARNとは?形式の読み方とサービス別の書き方一覧」

サービス別のARN一覧(主要33サービス)

「リージョン欄」「アカウント欄」は、その欄に値が入るかどうかです。「空」と書いたサービスでは、コロンを2つ続けて書きます。実例は、東京リージョン・アカウント ID 123456789012 でリソースを作って取得したもの、または AWS 公式ドキュメントの形式に当てはめたものです。

ストレージ・データベース

サービス リソース 実例 リージョン欄 アカウント欄
S3 バケット arn:aws:s3:::example-bucket 空 空
S3 オブジェクト arn:aws:s3:::example-bucket/logs/2026/app.log 空 空
S3 アクセスポイント arn:aws:s3:ap-northeast-1:123456789012:accesspoint/example-access-point 入る 入る
DynamoDB テーブル arn:aws:dynamodb:ap-northeast-1:123456789012:table/Orders 入る 入る
RDS DB インスタンス arn:aws:rds:ap-northeast-1:123456789012:db:app-db 入る 入る
ElastiCache クラスター arn:aws:elasticache:ap-northeast-1:123456789012:cluster:session-cache 入る 入る
EFS ファイルシステム arn:aws:elasticfilesystem:ap-northeast-1:123456789012:file-system/fs-f80e5d5b 入る 入る
OpenSearch Service ドメイン arn:aws:es:ap-northeast-1:123456789012:domain/search 入る 入る
Backup バックアップボールト arn:aws:backup:ap-northeast-1:123456789012:backup-vault:daily-vault 入る 入る

権限・暗号化・設定

サービス リソース 実例 リージョン欄 アカウント欄
IAM ユーザー arn:aws:iam::123456789012:user/taro 空 入る
IAM パスつきユーザー arn:aws:iam::123456789012:user/dev/hanako 空 入る
IAM ロール arn:aws:iam::123456789012:role/app-role 空 入る
IAM グループ arn:aws:iam::123456789012:group/developers 空 入る
IAM カスタマー管理ポリシー arn:aws:iam::123456789012:policy/app-read 空 入る
IAM AWS 管理ポリシー arn:aws:iam::aws:policy/ReadOnlyAccess 空 aws が入る
IAM インスタンスプロファイル arn:aws:iam::123456789012:instance-profile/web-profile 空 入る
IAM アカウント全体(root) arn:aws:iam::123456789012:root 空 入る
STS ロールを引き受けたセッション arn:aws:sts::123456789012:assumed-role/app-role/deploy-session 空 入る
KMS キー arn:aws:kms:ap-northeast-1:123456789012:key/22c8c245-abb2-4df5-84a3-727cc3ab17f5 入る 入る
KMS エイリアス arn:aws:kms:ap-northeast-1:123456789012:alias/app-key 入る 入る
Secrets Manager シークレット arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/db/password-jjquml 入る 入る
Systems Manager パラメータ arn:aws:ssm:ap-northeast-1:123456789012:parameter/app/prod/db_host 入る 入る
ACM 証明書 arn:aws:acm:ap-northeast-1:123456789012:certificate/49acbd54-341e-4bd2-bbf5-eef2e26e03c6 入る 入る
WAF Web ACL(リージョン用) arn:aws:wafv2:ap-northeast-1:123456789012:regional/webacl/web-acl/2ae41a53-c5f2-4d38-bf2d-6dd613642fb5 入る 入る

コンピューティング・コンテナ

サービス リソース 実例 リージョン欄 アカウント欄
Lambda 関数 arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image 入る 入る
Lambda バージョン arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image:1 入る 入る
Lambda エイリアス arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image:prod 入る 入る
EC2 インスタンス arn:aws:ec2:ap-northeast-1:123456789012:instance/i-1234567890abcdef0 入る 入る
EC2 VPC arn:aws:ec2:ap-northeast-1:123456789012:vpc/vpc-0e9801d129EXAMPLE 入る 入る
EC2 サブネット arn:aws:ec2:ap-northeast-1:123456789012:subnet/subnet-39c223fb58a90eba7 入る 入る
EC2 セキュリティグループ arn:aws:ec2:ap-northeast-1:123456789012:security-group/sg-5e11cbb41e1001c95 入る 入る
ECS クラスター arn:aws:ecs:ap-northeast-1:123456789012:cluster/web-cluster 入る 入る
ECS サービス arn:aws:ecs:ap-northeast-1:123456789012:service/web-cluster/web-service 入る 入る
ECS タスク定義 arn:aws:ecs:ap-northeast-1:123456789012:task-definition/web-task:1 入る 入る
ECR リポジトリ arn:aws:ecr:ap-northeast-1:123456789012:repository/web/app 入る 入る
EKS クラスター arn:aws:eks:ap-northeast-1:123456789012:cluster/main 入る 入る

メッセージ・連携・監視

サービス リソース 実例 リージョン欄 アカウント欄
SQS キュー arn:aws:sqs:ap-northeast-1:123456789012:order-queue 入る 入る
SNS トピック arn:aws:sns:ap-northeast-1:123456789012:order-events 入る 入る
EventBridge ルール arn:aws:events:ap-northeast-1:123456789012:rule/nightly-batch 入る 入る
EventBridge Scheduler スケジュール arn:aws:scheduler:ap-northeast-1:123456789012:schedule/default/nightly 入る 入る
Step Functions ステートマシン arn:aws:states:ap-northeast-1:123456789012:stateMachine:order-flow 入る 入る
Kinesis Data Streams ストリーム arn:aws:kinesis:ap-northeast-1:123456789012:stream/click-stream 入る 入る
Data Firehose 配信ストリーム arn:aws:firehose:ap-northeast-1:123456789012:deliverystream/log-delivery 入る 入る
CloudWatch Logs ロググループ arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/resize-image 入る 入る
CloudWatch アラーム arn:aws:cloudwatch:ap-northeast-1:123456789012:alarm:cpu-high 入る 入る
CloudFormation スタック arn:aws:cloudformation:ap-northeast-1:123456789012:stack/network-stack/1ebb5981-90ff-4b8e-ba2a-564d0c3f9cb7 入る 入る

ネットワーク・配信

サービス リソース 実例 リージョン欄 アカウント欄
Elastic Load Balancing ALB arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:loadbalancer/app/web-alb/ddbfcdaf82b78408 入る 入る
Elastic Load Balancing ターゲットグループ arn:aws:elasticloadbalancing:ap-northeast-1:123456789012:targetgroup/web-tg/d38504845ce5879e 入る 入る
CloudFront ディストリビューション arn:aws:cloudfront::123456789012:distribution/G5J9ANN0FASEM 空 入る
Route 53 ホストゾーン arn:aws:route53:::hostedzone/Z0123456789EXAMPLE 空 空
API Gateway REST API(管理用) arn:aws:apigateway:ap-northeast-1::/restapis/a1b2c3d4e5 入る 空
API Gateway API の呼び出し arn:aws:execute-api:ap-northeast-1:123456789012:a1b2c3d4e5/prod/GET/orders 入る 入る

サービス名と名前空間が違うものに気をつけます。Step Functions は states、EventBridge は events、OpenSearch Service は es、EFS は elasticfilesystem、ALB は elasticloadbalancing です。

一覧から読み取れる細かな決まりもあります。

サービス 決まり
Lambda バージョンやエイリアスは、関数の ARN の後ろに :1 や :prod を付ける
Secrets Manager 名前の後ろに、ハイフンと6文字のランダムな文字が付く。ポリシーでは secret:prod/db/password-?????? のように書くと当てはまる
CloudWatch Logs ロググループの ARN には、末尾に :* が付いた形と付かない形がある。取得コマンドの arn は :* つきで返る
ECS タスク定義は family:リビジョン番号、サービスは クラスター名/サービス名
ALB・CloudFormation 名前の後ろに ID が付く。名前だけでは ARN を組み立てられないので、取得コマンドを使う

リージョン欄・アカウント欄が空になる理由

欄が空になるのは、その欄がなくてもリソースを1つに特定できるサービスです。

サービス 空になる欄 理由
S3(バケット・オブジェクト) リージョン、アカウント バケット名はパーティション全体で重複しない。名前だけで1つに決まる
IAM・STS リージョン IAM はリージョンをまたいで共通の(グローバルな)サービス。ユーザーやロールはリージョンに属さない
CloudFront リージョン ディストリビューションはリージョンに属さないグローバルなリソース
Route 53 リージョン、アカウント ホストゾーンはグローバルなリソースで、ID だけで1つに決まる
API Gateway(管理用) アカウント apigateway の ARN はアカウント欄を空にする決まり。呼び出し用の execute-api にはアカウント ID が入る

空の欄は詰めずに、コロンをそのまま残します。S3 ならコロンが3つ続き、IAM なら2つ続きます。

arn:aws:s3:::example-bucket            ← リージョンもアカウントも空(:::)
arn:aws:iam::123456789012:role/app-role ← リージョンだけ空(::)

AWS 管理ポリシーは、アカウント欄に12桁の番号ではなく aws が入ります(arn:aws:iam::aws:policy/ReadOnlyAccess)。自分のアカウントで作ったポリシーと見分ける目印になります。

ワイルドカード(* と ?)はどこまで一致するか

IAM ポリシーの Resource では、ARN の中にワイルドカードを書けます。

記号 意味
* 0文字以上の任意の文字列。スラッシュ(/)も含めて一致する
? 任意の1文字

決まりは次のとおりです(AWS 公式ドキュメント「IAM JSON policy elements: Resource」「IAM identifiers」にもとづきます)。

決まり 内容
使える場所 コロンで区切った各欄の中。1つの欄に複数書ける
使えない場所 パーティション欄、サービス欄、リソースの種類の部分(functi*:my-function のような書き方)
スラッシュの扱い * はスラッシュを越えて一致する。example-bucket/* は下の階層すべてに当てはまる
欄の末尾の * 欄の最後に置いた * は、コロンの区切りを越えて後ろまで一致することがある。意図しない範囲に広がらないよう、欄の中で使うのが推奨
Principal では使えない ARN の一部をワイルドカードにできるのは Resource と NotResource

この決まりを小さな Python の関数にして、一致・不一致を確かめました。* を「0文字以上」、? を「1文字」として、ARN 全体を照合します。

# arn_match.py
import re

def arn_like(pattern: str, arn: str) -> bool:
    """Resource の ARN パターンと実際の ARN を照合する(* は0文字以上、? は1文字)"""
    regex = "".join(".*" if ch == "*" else "." if ch == "?" else re.escape(ch) for ch in pattern)
    return re.fullmatch(regex, arn) is not None

print(arn_like("arn:aws:s3:::example-bucket/*", "arn:aws:s3:::example-bucket/a.txt"))
print(arn_like("arn:aws:s3:::example-bucket/*", "arn:aws:s3:::example-bucket"))
True
False

同じ関数に、よく使う組み合わせを渡した結果です。

Resource に書いたパターン 実際の ARN 結果
arn:aws:s3:::example-bucket arn:aws:s3:::example-bucket 一致
arn:aws:s3:::example-bucket arn:aws:s3:::example-bucket/a.txt 不一致
arn:aws:s3:::example-bucket/* arn:aws:s3:::example-bucket/a.txt 一致
arn:aws:s3:::example-bucket/* arn:aws:s3:::example-bucket/logs/2026/a.txt 一致
arn:aws:s3:::example-bucket/* arn:aws:s3:::example-bucket 不一致
arn:aws:s3:::example-bucket* arn:aws:s3:::example-bucket-backup/a.txt 一致
arn:aws:s3:::example-bucket/*.csv arn:aws:s3:::example-bucket/logs/a.csv 一致
arn:aws:s3:::example-bucket/????-test arn:aws:s3:::example-bucket/2026-test 一致
arn:aws:s3:::example-bucket/????-test arn:aws:s3:::example-bucket/26-test 不一致
arn:aws:iam::123456789012:role/service-* arn:aws:iam::123456789012:role/service-batch 一致
arn:aws:iam::123456789012:role/service-* arn:aws:iam::123456789012:role/app-role 不一致
arn:aws:ec2:*:123456789012:instance/* arn:aws:ec2:ap-northeast-1:123456789012:instance/i-1234567890abcdef0 一致
arn:aws:ec2:*:123456789012:instance/* arn:aws:ec2:ap-northeast-1:999999999999:instance/i-1234567890abcdef0 不一致
arn:aws:sqs:ap-northeast-?:123456789012:order-queue arn:aws:sqs:ap-northeast-3:123456789012:order-queue 一致
arn:aws:sqs:ap-northeast-?:123456789012:order-queue arn:aws:sqs:us-east-1:123456789012:order-queue 不一致
arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image:prod 不一致
arn:aws:lambda:ap-northeast-1:123456789012:function:resize-* arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image:prod 一致
arn:aws:dynamodb:ap-northeast-1:123456789012:table/Orders arn:aws:dynamodb:ap-northeast-1:123456789012:table/OrdersArchive 不一致
arn:aws:dynamodb:ap-northeast-1:123456789012:table/Orders* arn:aws:dynamodb:ap-northeast-1:123456789012:table/OrdersArchive 一致

表から分かる要点は3つです。

  • バケットの ARN とオブジェクトの ARN は別物。example-bucket はバケットだけ、example-bucket/* はオブジェクトだけに当てはまる
  • スラッシュを付けない example-bucket* は、名前が同じ文字で始まる別のバケットにも当てはまる。範囲を絞るなら example-bucket/* と書く
  • Lambda のエイリアスつき ARN は、関数だけの ARN とは一致しない。エイリアスも対象にするなら function:resize-image:* を並べる

バケットとオブジェクトでARNを分けて書く定番のJSON

S3 のアクションには、バケットに対するもの(s3:ListBucket など)と、オブジェクトに対するもの(s3:GetObject、s3:PutObject など)があります。Resource をアクションの対象に合わせて2つの文に分けるのが定番の形です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],
      "Resource": "arn:aws:s3:::example-bucket"
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": "arn:aws:s3:::example-bucket/*"
    }
  ]
}

このポリシーは aws iam create-policy でそのまま登録できます。オブジェクトの ARN は、バケット名の後ろにスラッシュが必要です。特定のフォルダだけにするなら arn:aws:s3:::example-bucket/logs/* のように、スラッシュの後ろにプレフィックスを続けます。

1つの文にまとめて書くこともできます。その場合は Resource を配列にして、2つの ARN を並べます(こちらも登録できることを確かめています)。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetObject", "s3:PutObject"],
      "Resource": [
        "arn:aws:s3:::example-bucket",
        "arn:aws:s3:::example-bucket/*"
      ]
    }
  ]
}

CLIでARNを取得する

多くのサービスでは、リソースを表示するコマンドの結果に ARN が入っています。--query で ARN だけを取り出します。

aws lambda get-function --function-name resize-image \
  --query Configuration.FunctionArn --output text

aws dynamodb describe-table --table-name Orders \
  --query Table.TableArn --output text

aws iam get-role --role-name app-role --query Role.Arn --output text

aws kms describe-key --key-id alias/app-key \
  --query KeyMetadata.Arn --output text
arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image
arn:aws:dynamodb:ap-northeast-1:123456789012:table/Orders
arn:aws:iam::123456789012:role/app-role
arn:aws:kms:ap-northeast-1:123456789012:key/22c8c245-abb2-4df5-84a3-727cc3ab17f5

サービス別の取得コマンドです(すべて実行して、一覧表の ARN が返ることを確かめたものです)。

サービス ARN を取り出すコマンド
自分自身(実行主体) aws sts get-caller-identity --query Arn --output text
IAM ユーザーの一覧 aws iam list-users --query 'Users[].Arn' --output text
SQS aws sqs get-queue-attributes --queue-url キューのURL --attribute-names QueueArn --query Attributes.QueueArn --output text
SNS aws sns list-topics --query 'Topics[].TopicArn' --output text
Secrets Manager aws secretsmanager describe-secret --secret-id prod/db/password --query ARN --output text
CloudWatch Logs aws logs describe-log-groups --query 'logGroups[].arn' --output text
EventBridge aws events describe-rule --name nightly-batch --query Arn --output text
Step Functions aws stepfunctions list-state-machines --query 'stateMachines[].stateMachineArn' --output text
ECS aws ecs list-clusters --query clusterArns --output text
ECR aws ecr describe-repositories --query 'repositories[].repositoryArn' --output text
RDS aws rds describe-db-instances --query 'DBInstances[].DBInstanceArn' --output text
ALB aws elbv2 describe-load-balancers --query 'LoadBalancers[].LoadBalancerArn' --output text
CloudFormation aws cloudformation describe-stacks --query 'Stacks[].StackId' --output text
EC2 サブネット aws ec2 describe-subnets --query 'Subnets[].SubnetArn' --output text

SQS のキューの URL は aws sqs get-queue-url --queue-name order-queue --query QueueUrl --output text で取れます。CloudWatch Logs の arn は、末尾に :* が付いた形(...log-group:/aws/lambda/resize-image:*)で返ります。

ARNを返さないサービスはシェルで組み立てる

S3 のバケットや EC2 のインスタンスのように、表示コマンドの結果に ARN が入らないものは、自分で組み立てます。アカウント ID とパーティションは get-caller-identity から取れます。

ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
PARTITION=$(aws sts get-caller-identity --query Arn --output text | cut -d: -f2)
REGION=ap-northeast-1

echo "arn:${PARTITION}:sqs:${REGION}:${ACCOUNT}:order-queue"

BUCKET=example-bucket
KEY=logs/2026/app.log
echo "arn:${PARTITION}:s3:::${BUCKET}"
echo "arn:${PARTITION}:s3:::${BUCKET}/${KEY}"
arn:aws:sqs:ap-northeast-1:123456789012:order-queue
arn:aws:s3:::example-bucket
arn:aws:s3:::example-bucket/logs/2026/app.log

boto3でARNを取得・組み立て・分解する

Python(boto3)で同じことをするコードです。

# arn_tool.py
import boto3
from botocore.utils import ArnParser

sts = boto3.client("sts")
identity = sts.get_caller_identity()
account = identity["Account"]
partition = identity["Arn"].split(":")[1]
region = sts.meta.region_name

def build_arn(service, resource, region=region, account=account):
    return f"arn:{partition}:{service}:{region}:{account}:{resource}"

# 組み立てる
print(build_arn("sqs", "order-queue"))
print(build_arn("dynamodb", "table/Orders"))
print(build_arn("iam", "role/app-role", region=""))          # IAM はリージョン欄が空
print(build_arn("s3", "example-bucket/logs/*", region="", account=""))  # S3 は両方が空

# 取得する
print(boto3.client("lambda").get_function(FunctionName="resize-image")["Configuration"]["FunctionArn"])

# 分解する
arn = "arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image:prod"
print(arn.split(":", 5))
print(ArnParser().parse_arn(arn))
arn:aws:sqs:ap-northeast-1:123456789012:order-queue
arn:aws:dynamodb:ap-northeast-1:123456789012:table/Orders
arn:aws:iam::123456789012:role/app-role
arn:aws:s3:::example-bucket/logs/*
arn:aws:lambda:ap-northeast-1:123456789012:function:resize-image
['arn', 'aws', 'lambda', 'ap-northeast-1', '123456789012', 'function:resize-image:prod']
{'partition': 'aws', 'service': 'lambda', 'region': 'ap-northeast-1', 'account': '123456789012', 'resource': 'function:resize-image:prod'}

分解のポイントは2つです。

ポイント 内容
split(":", 5) と分割数を指定する リソース欄にもコロンが入るサービス(Lambda、RDS など)があるので、6つ目以降はまとめて1つにする
ArnParser を使う botocore に入っている部品。ARN の形をしていない文字列を渡すと例外になる

ARN の形をしていない文字列を渡したときの結果です。

from botocore.utils import ArnParser
ArnParser().parse_arn("lambda:resize-image")
InvalidArnException: Provided ARN: lambda:resize-image must be of the format: arn:partition:service:region:account:resource

パーティション(aws / aws-cn / aws-us-gov)の違い

2つ目の欄のパーティションは、リージョンのまとまりを表します。

パーティション 対象 属するリージョン(EC2 の例)
aws 標準のリージョン ap-northeast-1、us-east-1 など34
aws-cn 中国のリージョン cn-north-1、cn-northwest-1
aws-us-gov AWS GovCloud (US) us-gov-east-1、us-gov-west-1

リージョンの数は、boto3 に入っているデータから次のコードで数えたものです。

import boto3

session = boto3.session.Session()
print(session.get_available_partitions())
for partition in ["aws", "aws-cn", "aws-us-gov"]:
    print(partition, len(session.get_available_regions("ec2", partition_name=partition)))
['aws', 'aws-cn', 'aws-us-gov', 'aws-iso', 'aws-iso-b', 'aws-iso-e', 'aws-iso-f', 'aws-eusc']
aws 34
aws-cn 2
aws-us-gov 2

パーティションが違うと、アカウントも ARN も別の体系になります。aws のアカウントから aws-cn や aws-us-gov のリージョンを参照することはできません。

テンプレートやスクリプトを複数のパーティションで使う予定があるなら、arn:aws: と固定で書かず、前の節のように実行主体の ARN からパーティションを取り出して組み立てると、そのまま使い回せます。

MalformedPolicyDocumentになる書き間違い例

ポリシーの Resource に ARN を書き間違えると、ポリシーの作成時に MalformedPolicyDocument が返ります。次の形のポリシーで、Resource だけを入れ替えて aws iam create-policy を実行した結果です。

aws iam create-policy --policy-name sample --policy-document \
  '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"s3:GetObject","Resource":"example-bucket/*"}]}'
An error occurred (MalformedPolicyDocument) when calling the CreatePolicy operation: Resource example-bucket/* must be in ARN format or "*".
書いた Resource エラー文(MalformedPolicyDocument に続く部分) 直し方
example-bucket/* Resource example-bucket/* must be in ARN format or "*". arn:aws:s3::: から書く
arn:aws:s3:example-bucket/* Resource arn:aws:s3:example-bucket/* can not contain region information. コロンを3つ続ける(arn:aws:s3:::example-bucket/*)
arn:aws:s3:ap-northeast-1:123456789012:example-bucket Resource arn:aws:s3:ap-northeast-1:123456789012:example-bucket can not contain region information. S3 のバケットではリージョンとアカウントを空にする
arn:aws:iam:ap-northeast-1:123456789012:role/app-role IAM resource arn:aws:iam:ap-northeast-1:123456789012:role/app-role cannot contain region information. IAM ではリージョンを空にする(arn:aws:iam::123456789012:role/app-role)
arn:awss:s3:::example-bucket/* Partition "awss" is not valid for resource "arn:awss:s3:::example-bucket/*". パーティションのつづりを直す
arn:aws::::example The policy failed legacy parsing サービス欄を入れる

ARN 以外の書き間違いでも同じエラーコードになります。

書き間違い エラー文
最後の要素の後ろに余分なカンマがある Syntax errors in policy.
Version を書かずにポリシー変数(${aws:username})を使った Policy document must be version 2012-10-17 or greater.

エラーにならないのに効かない書き方

作成時のチェックは通っても、狙ったリソースに当てはまらない書き方があります。前の節の一致・不一致の表と合わせて確認します。

書き方 起きること 直し方
s3:GetObject の Resource が arn:aws:s3:::example-bucket オブジェクトの ARN と一致しないので、取得が許可されない arn:aws:s3:::example-bucket/* にする
s3:ListBucket の Resource が arn:aws:s3:::example-bucket/* バケットの ARN と一致しないので、一覧が許可されない arn:aws:s3:::example-bucket にする
アカウント ID の桁やリージョンのつづりが違う どのリソースとも一致しない get-caller-identity や取得コマンドの結果を貼り付ける

AssumeRole などに渡すセッションポリシーでは、欄を省略した書きかけの ARN は受け付けられず MalformedPolicyDocumentException になります。6つの欄をそろえて書きます。

よくある質問

Q. ARN とリソース ID(i-1234... など)は、どう使い分けますか? A. リソース ID はそのサービスの中での番号、ARN はパーティション・サービス・リージョン・アカウントまで含めた名前です。IAM ポリシーの Resource や、別のサービスからリソースを指すときは ARN を使います。

Q. S3 の ARN にアカウント ID を入れると、どうなりますか? A. バケットやオブジェクトの ARN では、リージョン欄とアカウント欄を空にするのが正しい形です。値を入れると、ポリシーの作成時に can not contain region information のエラーになります。アクセスポイントの ARN には、リージョンとアカウント ID が入ります。

Q. Resource にアスタリスクだけを書くのと、ARN で書くのはどう違いますか? A. "*" はすべてのリソースが対象になります。一覧を取るアクションのように、対象を ARN で絞れないアクションでは "*" を使います。それ以外は、ARN で対象を絞ると最小権限に近づきます。

Q. アカウント ID を知らなくても ARN は書けますか? A. aws sts get-caller-identity --query Account --output text で取得できます。S3 のバケットや Route 53 のホストゾーンのように、アカウント欄が空のサービスでは不要です。

まとめ

  • ARN はコロンで区切った6つの欄(arn・パーティション・サービス・リージョン・アカウント ID・リソース)でできている
  • リソース欄の区切り(/ か :)はサービスごとに違うので、一覧表か取得コマンドで確かめる
  • S3 はリージョンとアカウント、IAM・STS・CloudFront はリージョンが空。空の欄もコロンは残す
  • * はスラッシュも越えて一致する。example-bucket はバケット、example-bucket/* はオブジェクトと、分けて書く
  • CLI は --query で ARN だけを取り出し、返さないサービスは get-caller-identity の結果から組み立てる
  • 分解は split(":", 5)。リソース欄にコロンが入るサービスでも崩れない
  • MalformedPolicyDocument はエラー文に理由が出る。リージョン欄の入れすぎ、パーティションのつづり、ARN 形式でない文字列を見直す

参考・出典

  • AWS Identity and Access Management ユーザーガイド「Identify AWS resources with Amazon Resource Names (ARNs)」 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html
  • AWS Identity and Access Management ユーザーガイド「IAM JSON policy elements: Resource」 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html
  • Amazon S3 ユーザーガイド「Policy resources for Amazon S3」 https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-arn-format.html
  • Amazon EC2 ユーザーガイド「IAM policies for Amazon EC2」 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policy-structure.html
  • Service Authorization Reference「Actions, resources, and condition keys for Amazon Route 53」 https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonroute53.html
  • Amazon API Gateway デベロッパーガイド「API Gateway Amazon Resource Name (ARN) reference」 https://docs.aws.amazon.com/apigateway/latest/developerguide/arn-format-reference.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「AWS ARNとは?形式の読み方とサービス別の書き方一覧」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?