- AWS
AWS ARNとは?形式の読み方とサービス別の書き方一覧
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期連続の黒字決算。