「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」
複数のキーまたは値による条件の作成
ポリシーの Condition
要素を使用して、1 つのキーに複数の値または複数のキーが対応つけられているリクエストをテストできます。プログラムまたは AWS を通じて AWS マネジメントコンソール
にリクエストを行うと、リクエストにはプリンシパル、オペレーション、タグなどに関する情報が含まれます。リクエストに含まれる情報とデータについては、「リクエスト」を参照してください。条件キーを使用して、リクエスト内の一致するキーの値をテストできます。たとえば、条件キーを使用して、DynamoDB テーブルの特定の属性へのアクセスや、タグに基づいた
Amazon EC2 インスタンスへのアクセスをコントロールできます。
Condition
エレメントは複数の条件を含むことができ、各条件は複数のキー値ペアを含むことができます。ほとんどの条件キーでは、複数の値の使用がサポートされています。以下の図が解説したものです。他に特定のない限り、すべてのキーには複数の値を含むことができます。

複数のキーまたは値を含む条件の評価ロジック
ポリシーに複数の条件演算子がある場合、または 1 つの条件演算子に複数のキーがアタッチされている場合、条件は論理 AND
を使用して評価されます。1 つの条件演算子に 1 つのキーのための複数の値が含まれる場合、条件演算子は論理 OR
を使用して評価されます。目的の Allow
または Deny
効果をトリガーするには、すべての条件が true に解決される必要があります。

複数のキーと値の使用
1 つのキーに複数の値が含まれるリクエストの場合、配列のように条件を角括弧で囲む必要があります ("Key2":["Value2A", "Value2B"])。また、ForAllValues
または ForAnyValue
set 演算子を StringLike
条件演算子とともに使用する必要もあります。これらの限定子によって条件演算子にセット演算機能が追加されるため、複数のリクエスト値を複数の条件値と照合できます。
-
ForAllValues
– リクエストセットのすべてのメンバーの値が条件キーセットのサブセットであるかどうかをテストします。リクエストのすべてのキー値がポリシーの 1 つ以上の値と一致する場合、条件は true を返します。また、リクエストにキーがない場合、またはキー値が空の文字列などの null データセットに解決される場合は true を返します。 -
ForAnyValue
– リクエスト値のセットの少なくとも 1 つのメンバーが、条件キー値のセットの少なくとも 1 つのメンバーと一致するかどうかをテストします。リクエスト内のキー値のいずれかがポリシーの条件値のいずれかと一致する場合に true が返されます。一致するキーまたは空のデータセットがない場合、条件は false を返します。
数値 foo が A または B と等しく、かつもう 1 つの数値 bar が C と等しいときに限り、リソースをジョンに使用させるとします。このような場合、次の図のような条件ブロックを作成します。

加えて、ジョンのアクセスを 2019 年 1 月 1 日以降に制限するものと仮定します。2019 年 1 月 1 日に等しい日付と共に、他の条件、DateGreaterThan
、を追加することになります。このような条件が付いたブロックは、以下の図のようになります。

AWS には所定の条件演算子およびキー (aws:CurrentTime
など) があります。各 AWS のサービスもまた、サービス固有のキーを定義します。
たとえば、以下の条件でユーザーのジョンに Amazon SQS キューへのアクセスを許可すると仮定します。
-
時刻は 2019 年 7 月 16 日の午後 12:00 以降です。
-
日時は 2019/7/16 の午後 3 時前です。
-
リクエスト元は、192.0.2.0~192.0.2.255 または 203.0.113.0~203.0.113.255 の範囲の IP アドレスです。
お客様の条件ブロックには 3 つの個別の条件演算子があり、ジョンはお客様のキュー、トピック、またはリソースにアクセスするためには、それら 3 つすべての条件演算子に一致しなければいけません。
お客様のポリシーにおいて、条件ブロックは以下のようなものになります。aws:SourceIp
の 2 つの値は、OR
を使用して評価されます。個別の 3 つの条件演算子が、AND
を使用して、評価されます。
"Condition" : { "DateGreaterThan" : { "aws:CurrentTime" : "2019-07-16T12:00:00Z" }, "DateLessThan": { "aws:CurrentTime" : "2019-07-16T15:00:00Z" }, "IpAddress" : { "aws:SourceIp" : ["192.0.2.0/24", "203.0.113.0/24"] } }
条件セット演算子で複数の値を使用する例
リクエスト内の複数の値とポリシーで指定した 1 つ以上の値との一致を調べるポリシーを作成できます。テクニカルサポートフォーラムでスレッドに関する情報を保存するために使用される
Thread
という Amazon DynamoDB テーブルがあるとします。テーブルには、ID
、UserName
、PostDateTime
、Message
、および Tags
という名前の属性があります。
{
ID=101
UserName=Bob
PostDateTime=20130930T231548Z
Message="A good resource for this question is docs.aws.amazon.com"
Tags=["AWS", "Database", "Security"]
}
DynamoDB で set 演算子を使用して、個々のデータ項目および属性への詳細なアクセスを実装する方法については、Amazon DynamoDB 開発者ガイド の「DynamoDB のきめ細かなアクセスコントロール」を参照してください。
PostDateTime
、Message
、および Tags
属性のみの表示をユーザーに許可するポリシーを作成できます。ユーザーのリクエストにこれらの属性のいずれかが含まれている場合、許可されます。ただし、リクエストに他の属性
(ID
など) が含まれている場合、リクエストは拒否されます。論理的に言えば、許可される属性 (PostDateTime
、Message
、Tags
) のリストを作成する必要があります。また、ユーザーがリクエストしたすべての属性が、その許可された属性のリストに含まれている必要があることをポリシーで示す必要があります。
次のポリシーの例は、ForAllValues
条件演算子で StringEquals
限定子を使用する方法を示しています。この条件では、ユーザーは、Thread
という名前の DynamoDB テーブルの ID
、Message
、または Tags
属性のみをリクエストできます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:GetItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "ID", "Message", "Tags" ] } } } ] }
ユーザーが DynamoDB に対し、Thread
テーブルから Message
および Tags
属性を取得するためのリクエストをすると仮定します。この場合、ユーザーがリクエストした属性がすべてポリシーで指定された値と一致するため、リクエストは許可されます。GetItem
オペレーションは、ユーザーがデータベーステーブルキーとして ID
属性を渡すことを必要とします。また、これはポリシーでも許可されます。ただし、ユーザーのリクエストに UserName
属性が含まれている場合、リクエストは失敗します。その理由は、UserName
が許可された属性のリストに含まれておらず、ForAllValues
修飾子は、要求されたすべての値がポリシーに含まれている必要があるためです。
dynamodb:Attributes
を使用する場合、テーブルのすべてのプライマリキー属性とインデックスキー属性の名前を指定する必要があります。ポリシーに記載されているセカンダリインデックスも指定する必要があります。指定しなかった場合、DynamoDB
は、このキー属性を使用して、リクエストされたアクションを実行できません。
また、ユーザーが一部の属性 (ID
、UserName
属性など) をリクエストに含めることを明示的に禁止することができます。たとえば、更新 (PUT
操作) で特定の属性の変更を禁止する必要があるため、ユーザーが DynamoDB テーブルを更新する場合に、それらの属性を除外することができます。この場合、禁止属性
(ID
、UserName
) のリストを作成します。ユーザーが要求する属性のいずれかが禁止属性のいずれかに一致する場合、リクエストを拒否します。
以下の例では、ユーザーが ForAnyValue
アクションの実行を試みるときに、ID
および PostDateTime
属性へのアクセスを拒否する PutItem
修飾子を使用する方法を示しています。つまり、ユーザーが Thread
テーブルで上記の属性のいずれかの更新を試みた場合です。Effect
エレメントが Deny
に設定されていることに注意してください。
{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAnyValue:StringEquals": { "dynamodb:Attributes": [ "ID", "PostDateTime" ] } } } }
ユーザーが、PostDateTime
テーブルの Message
および Thread
促成の更新をするリクエストを行ったとします。ForAnyValue
限定子によって、要求された属性のいずれかがポリシー内のリストに含まれるかどうかが確認されます。この場合、1 つの一致 (PostDateTime
) があるので、条件は true (真) になります。リクエスト内の他の値も一致した場合(例: リソース)、ポリシー全体の評価は true(真)を返します。ポリシーの結果は
Deny
になっているので、リクエストは拒否されます。
代わりに、ユーザーが PutItem
属性のみを使用して UserName
を実行するリクエストを実行したとします。この場合、リクエスト内の属性 (UserName
のみ) は、ポリシーに含まれるどの属性 (ID
、PostDateTime
) とも一致しません。この条件では false が返されるので、ポリシーの結果 (Deny
) も false になり、このポリシーでリクエストは拒否されません(リクエストを成功させるには、別のポリシーで明示的に許可する必要があります。このポリシーでリクエストは明示的に拒否されていませんが、すべてのリクエストが暗黙的に拒否されます)。
ForAllValues
条件演算子を使用すると、リクエストにキーがない場合、またはキー値が null データセット(空の文字列など)に解決される場合は true を返します。リクエストに少なくとも
1 つの値を含めるようにするには、ポリシーで別の条件を使用する必要があります。例については、「AWS リクエスト時のアクセスの制御」を参照してください。
条件セット演算子を持つ複数の値の評価ロジック
このセクションでは、ForAllValues
および ForAnyValue
演算子と共に使用される評価ロジックの詳細について説明します。次の表は、リクエストに含めることができるキー (PostDateTime
と UserName
) と、PostDateTime
、Message
、Tags
の各値を含むポリシーの条件に含めることができるキーを示しています。
キー(リクエスト) |
条件値 (ポリシー) |
---|---|
|
|
|
|
|
|
組み合わせの評価:
|
|
|
|
|
|
条件演算子の結果は、ポリシーの条件で使用される修飾子によって異なります。
-
ForAllValues
.リクエスト内のすべてのキー (PostDateTime
またはUserName
) がポリシーの 1 つ以上の条件値 (PostDateTime
、Message
、Tags
) と一致する場合に、true (真) が返されます。言い換えると、条件が true (真) となるためには、PostDateTime
はPostDateTime
、Message
、またはTags
と等しく、かつUserName
はPostDateTime
、Message
、またはTags
と等しい必要があります。 -
ForAnyValue
リクエスト値とポリシー値 (例にある 6 つのいずれか) の組み合わせが true (真) を返す場合に、true (真) が返されます。
以下のポリシーには ForAllValues
限定子が含まれます。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "dynamodb:GetItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAllValues:StringEquals": { "dynamodb:Attributes": [ "PostDateTime", "Message", "Tags" ] } } } }
ユーザーが DynamoDB に、属性 PostDateTime
および UserName
を取得するリクエストを送信するとします。組み合わせの評価:
|
|
|
|
|
|
|
|
|
|
|
|
このポリシーには ForAllValues
条件演算子修飾子が含まれています。つまり、PostDateTime
に対して 1 つ以上の一致、UserName
に対して 1 つの一致が必要です。UserName
に対する一致がないので、条件演算子は false (偽) を返し、リクエストは許可されません。
以下のポリシーには ForAnyValue
限定子が含まれます。
{ "Version": "2012-10-17", "Statement": { "Effect": "Deny", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:*:*:table/Thread", "Condition": { "ForAnyValue:StringEquals": { "dynamodb:Attributes": [ "ID", "PostDateTime" ] } } } }
ポリシーには "Effect":"Deny"
が含まれており、アクションは PutItem
です。ユーザーが PutItem
、UserName
、Message
属性を含む PostDateTime
リクエストを作成するとしましょう。その評価、次のとおりとなります。
|
|
|
|
|
|
|
|
|
|
|
|
修飾子が ForAnyValue
で、これらのテストのいずれかが true (真) を返す場合、条件は true (真) を返します。最後のテストでは true が返されるので、条件は true
になります。Effect
エレメントが Deny
に設定されているため、リクエストは拒否されます。
リクエスト内のキー値が空のデータセット (例えば、空のリスト) に解決される場合、ForAllValues
によって修飾される条件演算子は true を返します。ForAnyValue
によって修飾される条件演算子は false を返します。