Resource Access Management (RAM) は、一般的なアクセス制御シナリオ向けにシステムポリシーを提供しています。システムポリシーの粒度が不足している場合は、ApsaraMQ for RabbitMQ リソースへの最小権限アクセスを実現するために、カスタムポリシーを作成してください。
代表的な権限プロファイル
ポリシーをゼロから記述する前に、ご利用のユースケースに該当するアクセスパターンを特定します。
| アクセスパターン | 範囲 | ポリシー例 |
|---|---|---|
| パブリッシュのみ | 単一 vhost | 例 2:メッセージのパブリッシュ |
| コンシュームのみ | 単一 vhost | 例 3:メッセージのコンシューム |
| パブリッシュおよびコンシューム | 単一 vhost | 例 4:メッセージのパブリッシュとコンシューム |
| 完全なメッセージング | 単一 vhost(認証情報管理を含む) | 例 1:vhost への完全なメッセージングアクセス |
| 認証情報管理 | 単一インスタンス | 例 5:静的アカウント認証情報の管理 |
| インスタンス作成 | アカウント全体 | 例 6:インスタンスの作成 |
| 制限付きインスタンス作成 | アカウント全体(条件付き) | 例 7:インターネットアクセスなしの Platinum Edition インスタンスの作成 |
| インスタンスの完全管理 | 単一インスタンス | 例 8:単一インスタンスへの完全アクセス |
カスタムポリシーの基本
Alibaba Cloud が管理するシステムポリシーとは異なり、カスタムポリシーはお客様ご自身で作成および保守する必要があります。
アタッチ:カスタムポリシーを RAM ユーザー、ユーザーグループ、または RAM ロールにアタッチすることで、権限が有効になります。
削除:ポリシーを削除する前に、すべてのプリンシパルからのアタッチを解除してください。未アタッチのポリシーは直接削除できます。
バージョン管理:RAM ではカスタムポリシーのバージョン管理機能が提供されています。RAM コンソールまたは API を使用してポリシーバージョンを管理してください。
関連操作
リソース ARN フォーマット
ApsaraMQ for RabbitMQ のすべてのリソースは、次の Alibaba Cloud リソースネーム (ARN) フォーマットを使用します。
acs:amqp:$region:$accountid:/instances/$instanceId/...| 変数 | 説明 | 例 |
|---|---|---|
$region | リソースが存在するリージョン。すべてのリージョンを指定する場合は * を使用します。 | cn-hangzhou |
$accountid | Alibaba Cloud アカウント ID。任意のアカウントを指定する場合は * を使用します。 | 1234567890 |
$instanceId | ApsaraMQ for RabbitMQ インスタンス ID | amqp-cn-xxxxx |
$vhostName | Vhost 名 | my-vhost |
$exchangeName | エクスチェンジ名 | my-exchange |
$queueName | キュー名 | my-queue |
リソース階層
instances/
├── $instanceId/
│ ├── vhosts/
│ │ └── $vhostName/
│ │ ├── exchanges/
│ │ │ └── $exchangeName/
│ │ │ └── messages/*
│ │ └── queues/
│ │ └── $queueName/
│ │ └── messages/*
│ └── staticAccount/*サポートされているリージョンについては、「エンドポイント」をご参照ください。
アクションリファレンス
ApsaraMQ for RabbitMQ のアクションは、AMQP プロトコル操作用の クライアント API アクション と、コンソールおよび API を通じた管理操作用の コンソールおよび OpenAPI アクション の 2 種類に分類されます。
クライアント API アクション
| クライアント API | アクション | リソース | 説明 |
|---|---|---|---|
| exchange.declare (passive=false) | amqp:CreateExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* | エクスチェンジを宣言します。エクスチェンジが存在しない場合は作成し、存在する場合はプロパティを検証して不一致時にエラーを返します。 |
| exchange.declare (passive=true) | amqp:GetExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName | エクスチェンジが存在するかどうかを確認します。エクスチェンジが存在しない場合はエラーを返します。 |
| exchange.bind | amqp:GetExchange (ソース) | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName (ソース) | ソースエクスチェンジを送信先エクスチェンジにバインドします。 |
amqp:CreateExchange (送信先) | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* (送信先) | ||
| exchange.unbind | amqp:GetExchange (ソース) | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName (ソース) | ソースエクスチェンジを送信先エクスチェンジからアンバインドします。 |
amqp:CreateExchange (送信先) | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* (送信先) | ||
| queue.declare (passive=false) | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | キューを宣言します。キューが存在しない場合は作成し、存在する場合はプロパティを検証して不一致時にエラーを返します。 |
| queue.declare (passive=true) | amqp:GetQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName | キューが存在するかどうかを確認します。キューが存在しない場合はエラーを返します。 |
| queue.declare (デッドレター交換付き) | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | デッドレター交換にバインドされたキューを宣言します。 |
amqp:GetQueue | acs:amqp:$region:$accountid:/vhosts/$vhostName/queues/$queueName | ||
amqp:CreateExchange (デッドレター) | acs:amqp:$region:$accountid:/instances/$instanceName/vhosts/$vhostName/exchanges/$exchangeName (デッドレター) | ||
| queue.bind | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | キューをエクスチェンジにバインドします。 |
amqp:GetExchange | acs:amqp:$region:$accountid:/instances/$instanceName/vhosts/$vhostName/exchanges/$exchangeName | ||
| queue.unbind | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | キューをエクスチェンジからアンバインドします。 |
amqp:GetExchange | acs:amqp:$region:$accountid:/instances/$instanceName/vhosts/$vhostName/exchanges/$exchangeName | ||
| BasicRecover | amqp:BasicRecover | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | 未応答のメッセージをコンシューマーに再配信します。 |
| BasicCancel | amqp:BasicCancel | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | コンシューマーサブスクリプションをキャンセルします。 |
| BasicPublish | amqp:BasicPublish | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName/messages/* | エクスチェンジにメッセージをパブリッシュします。 |
| BasicConsume | amqp:BasicConsume | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | キュー上でコンシューマーを開始します。 |
| BasicAck | amqp:BasicAck | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | 1 つ以上のメッセージを確認します。 |
| BasicNack | amqp:BasicNack | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | 1 つ以上のメッセージを拒否します。 |
| BasicReject | amqp:BasicReject | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | 単一のメッセージを拒否します。 |
| BasicGet | amqp:BasicGet | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | キュー内のメッセージに直接アクセスします。 |
RAM ワイルドカードマッチングルール
RAM ポリシー内のワイルドカード (*) は、アクション名のプレフィックス に基づいてマッチします。amqp:Get* は Get で始まるすべてのアクション(例:amqp:GetInstance や amqp:GetQueue)にマッチし、他の単語で始まるアクションにはマッチしません。amqp:BasicGet は Basic で始まるため、amqp:Get* にはマッチしません。メッセージのコンシュームに BasicGet を呼び出すには、アクションリストに明示的に amqp:BasicGet を追加する必要があります。
代表的な権限エラーと必要なアクション
API 呼び出しが UnauthorizedOperation を返し、AccessDeniedDetail に NoPermissionType=ImplicitDeny が表示される場合、ポリシーに必要なアクションが不足しています。よくあるシナリオとして、amqp:BasicGet を追加せずに amqp:Get* を設定するケースがあります。このような場合は、明示的に amqp:BasicGet を追加してください。
ポリシー例:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"amqp:Get*",
"amqp:List*",
"amqp:BasicGet"
],
"Resource": "*"
}
]
}コンソールおよび OpenAPI アクション
| API オペレーション | アクション | リソース | 説明 |
|---|---|---|---|
| ListInstances | amqp:ListInstance | acs:amqp:$region:$accountid:/instances/* | インスタンスの一覧を照会します。 |
| CreateInstance | amqp:CreateInstance | acs:amqp:$region:$accountid:/instances/* | インスタンスを作成します。条件キー をサポートしています。 |
| DeleteInstance | amqp:DeleteInstance | acs:amqp:$region:$accountid:/instances/$instanceId | インスタンスを削除します。 |
| GetInstance | amqp:GetInstance | acs:amqp:$region:$accountid:/instances/$instanceId | インスタンスを表示します。 |
| ListVhost | amqp:ListVhost | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/* | vhost の一覧を照会します。 |
| CreateVhost | amqp:CreateVhost | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/* | vhost を作成します。 |
| DeleteVhost | amqp:DeleteVhost | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName | vhost を削除します。また、インスタンスに対して amqp:GetInstance が必要です。 |
| ListExchange | amqp:ListExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* | エクスチェンジの一覧を照会します。また、インスタンスに対して amqp:GetInstance が必要です。 |
| CreateExchange | amqp:CreateExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/* | エクスチェンジを作成します。 |
| DeleteExchange | amqp:DeleteExchange | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/exchanges/$exchangeName | エクスチェンジを削除します。 |
| ListQueue | amqp:ListQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | キューの一覧を照会します。また、インスタンスに対して amqp:GetInstance が必要です。 |
| CreateQueue | amqp:CreateQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/* | キューを作成します。 |
| DeleteQueue | amqp:DeleteQueue | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName | キューを削除します。 |
| QueuePurge | amqp:QueuePurge | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | キューをパージします。 |
| ListStaticAccounts | amqp:ListStaticAccounts | acs:amqp:$region:$accountid:/instances/$instanceId/staticAccount/* | ユーザー名とパスワードを表示します。また、インスタンスに対して amqp:GetInstance が必要です。 |
| FetchStaticAccount | amqp:FetchStaticAccount | acs:amqp:$region:$accountid:/instances/$instanceId/staticAccount/* | ユーザー名とパスワードを作成します。また、インスタンスに対して amqp:GetInstance が必要です。 |
| DeleteStaticAccount | amqp:DeleteStaticAccount | acs:amqp:$region:$accountid:/instances/$instanceId/staticAccount/* | ユーザー名とパスワードを削除します。 |
| キュー別メッセージ照会 | amqp:BasicGet | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | キュー内のメッセージにアクセスします。 |
| メッセージ ID 別メッセージ照会 | amqp:BasicGet | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | キュー内のメッセージにアクセスします。 |
| メッセージの再送信 | amqp:BasicGet, amqp:BasicPublish | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | メッセージを再送信します。 |
| メッセージ送信 | amqp:BasicPublish | acs:amqp:$region:$accountid:/instances/$instanceId/vhosts/$vhostName/queues/$queueName/messages/* | メッセージを送信します。 |
CreateInstance の条件キー
CreateInstance アクションでは、インスタンス作成を制限するために次の条件キーがサポートされています。詳細については、「条件」をご参照ください。
| 条件キー | タイプ | 有効な値 | 説明 |
|---|---|---|---|
amqp:InstanceType | String | enterprise (Enterprise Edition), vip (Platinum Edition) | RAM ID が作成できるインスタンスエディションを制限します。 |
amqp:SupportEIP | String | true, false | インスタンスがインターネットアクセスをサポートするかどうかを制限します。 |
システムポリシー
Resource Access Management (RAM) は、ApsaraMQ for RabbitMQ 向けに次のシステムポリシーを提供しています。
| ポリシー名 | 説明 | 粒度 |
|---|---|---|
AliyunAMQPFullAccess | ApsaraMQ for RabbitMQ の完全な管理権限を付与します (Action: amqp:*, Resource: *)。 | アカウント全体 |
PowerUserAccess | RAM、IMS などの管理操作を除外する NotAction 文を使用して、Alibaba Cloud サービスおよびリソースへの完全なアクセスを付与します。amqp:* は除外リストに含まれていないため、このポリシーは ApsaraMQ for RabbitMQ の完全な権限も付与します。 | アカウント全体 |
どちらのシステムポリシーもアカウント全体に適用され、特定のキューにスコープを限定することはできません。キュー単位の詳細な権限を付与するには、カスタムポリシーを作成し、Resource フィールドにキューの ARN を指定してください。例については、本トピック後半の「例 9:異なる RAM ユーザーに異なるキューへのアクセスを許可」をご参照ください。
ポリシー例
以下の例に含まれるプレースホルダー変数は、実際の値に置き換えてください。各変数の詳細については、「リソース ARN フォーマット」をご参照ください。
例 1:vhost への完全なメッセージングアクセス
特定の vhost 内で、エクスチェンジ、キュー、および静的アカウント認証情報のパブリッシュ、コンシューム、管理を行う権限を付与します。
{
"Version": "1",
"Statement": [
{
"Action": [
"amqp:GetInstance",
"amqp:ListVhost",
"amqp:GetVhost"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName",
"acs:amqp:*:*:/instances/$instanceId/vhosts/*"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:ListExchange",
"amqp:CreateExchange",
"amqp:DeleteExchange",
"amqp:ListQueue",
"amqp:DeleteQueue",
"amqp:CreateQueue",
"amqp:BasicRecover",
"amqp:BasicCancel",
"amqp:BasicPublish",
"amqp:BasicConsume",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:BasicReject",
"amqp:QueuePurge",
"amqp:BasicGet",
"amqp:GetExchange",
"amqp:GetQueue"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/*",
"Effect": "Allow"
},
{
"Action": [
"amqp:ListStaticAccounts",
"amqp:FetchStaticAccount",
"amqp:DeleteStaticAccount"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/staticAccount/*",
"Effect": "Allow"
}
]
}例 2:メッセージのパブリッシュ
プロデューサークライアントが特定の vhost 内のエクスチェンジにメッセージをパブリッシュするために必要な最小限の権限を付与します。具体的には、エクスチェンジおよびキューの宣言、メッセージのパブリッシュ、配信の応答を行います。
{
"Version": "1",
"Statement": [
{
"Action": [
"amqp:GetInstance"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:CreateExchange",
"amqp:CreateQueue",
"amqp:BasicRecover",
"amqp:BasicPublish",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:GetExchange",
"amqp:GetQueue"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/*",
"Effect": "Allow"
}
]
}例 3:メッセージのコンシューム
コンシューマークライアントが特定の vhost 内のキューからメッセージをコンシュームするために必要な最小限の権限を付与します。具体的には、エクスチェンジおよびキューの宣言、メッセージのコンシューム、応答の管理を行います。
{
"Version": "1",
"Statement": [
{
"Action": [
"amqp:GetInstance",
"amqp:GetVhost"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:CreateExchange",
"amqp:CreateQueue",
"amqp:BasicRecover",
"amqp:BasicCancel",
"amqp:BasicConsume",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:BasicReject",
"amqp:QueuePurge",
"amqp:BasicGet",
"amqp:GetExchange",
"amqp:GetQueue"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/*",
"Effect": "Allow"
}
]
}例 4:メッセージのパブリッシュとコンシューム
特定の vhost 内でメッセージのパブリッシュおよびコンシュームを行う権限を付与します。「例 2」および「例 3」のアクションを組み合わせています。
{
"Version": "1",
"Statement": [
{
"Action": [
"amqp:GetInstance",
"amqp:GetVhost"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:ListExchange",
"amqp:CreateExchange",
"amqp:DeleteExchange",
"amqp:ListQueue",
"amqp:DeleteQueue",
"amqp:CreateQueue",
"amqp:BasicRecover",
"amqp:BasicCancel",
"amqp:BasicPublish",
"amqp:BasicConsume",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:BasicReject",
"amqp:QueuePurge",
"amqp:BasicGet",
"amqp:GetExchange",
"amqp:GetQueue"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/*",
"Effect": "Allow"
}
]
}例 5:静的アカウント認証情報の管理
特定のインスタンスの静的アカウント認証情報(ユーザー名とパスワードのペア)を一覧表示、作成、削除する権限を付与します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"amqp:ListStaticAccounts",
"amqp:FetchStaticAccount",
"amqp:DeleteStaticAccount"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/staticAccount/*"
},
{
"Effect": "Allow",
"Action": "amqp:GetInstance",
"Resource": "acs:amqp:*:*:/instances/$instanceId"
}
]
}例 6:インスタンスの作成
任意のリージョンで任意のエディションの ApsaraMQ for RabbitMQ インスタンスを作成する権限を付与します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "amqp:CreateInstance",
"Resource": "acs:amqp:*:$accountid:/instances/*"
}
]
}例 7:インターネットアクセスなしの Platinum Edition インスタンスの作成
条件キーを使用して、インスタンス作成を Platinum Edition (vip) かつインターネットアクセスをサポートしない (SupportEIP: false) インスタンスに制限します。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "amqp:CreateInstance",
"Resource": "acs:amqp:*:$accountid:/instances/*",
"Condition": {
"StringEquals": {
"amqp:InstanceType": [
"vip"
],
"amqp:SupportEIP": [
"false"
]
}
}
}
]
}例 8:単一インスタンスへの完全アクセス
単一インスタンスに対する ApsaraMQ for RabbitMQ のすべての権限(vhost 管理、メッセージング操作、静的アカウント管理を含む)を付与します。amqp:ListInstance アクションはすべてのインスタンスに対してスコープが設定されているため、ターゲットインスタンスがコンソールのインスタンス一覧に表示されます。
{
"Version": "1",
"Statement": [
{
"Action": "amqp:ListInstance",
"Resource": "acs:amqp:*:*:/instances/*",
"Effect": "Allow"
},
{
"Action": "amqp:*",
"Resource": [
"acs:amqp:*:*:/instances/$instanceId",
"acs:amqp:*:*:/instances/$instanceId/vhosts/*"
],
"Effect": "Allow"
},
{
"Action": [
"amqp:ListStaticAccounts",
"amqp:FetchStaticAccount",
"amqp:DeleteStaticAccount"
],
"Resource": "acs:amqp:*:*:/instances/$instanceId/staticAccount/*",
"Effect": "Allow"
}
]
}例 9:異なる RAM ユーザーに異なるキューへのアクセスを許可
RAM ユーザー A が キュー A にのみアクセスでき、RAM ユーザー B が キュー B にのみアクセスできるようにするには、2 つの個別のカスタムポリシーを作成し、それぞれ対応する RAM ユーザーにアタッチします。これにより、各 RAM ユーザーは自身のポリシーで指定されたキューに対してのみ許可された操作を実行できます。
RAM ユーザー A 向けのポリシー(queueA へのアクセスを許可):
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"amqp:BasicConsume",
"amqp:BasicPublish",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:GetQueue"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/queues/queueA"
]
}
]
}RAM ユーザー B 向けには、Resource 値が queueB を指すようにした同一のポリシーを 2 つ目に作成し、RAM ユーザー B にアタッチします。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"amqp:BasicConsume",
"amqp:BasicPublish",
"amqp:BasicAck",
"amqp:BasicNack",
"amqp:GetQueue"
],
"Resource": [
"acs:amqp:*:*:/instances/$instanceId/vhosts/$vhostName/queues/queueB"
]
}
]
}