Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

DAX での Identity and Access Management

DynamoDB Accelerator (DAX) は DynamoDB と連携して動作し、アプリケーションにキャッシングレイヤーをシームレスに追加するように設計されています。ただし、DAX と DynamoDB は別の AWS サービスです。どちらのサービスもそれぞれのセキュリティポリシーの実装に AWS Identity and Access Management (IAM) を使用しますが、セキュリティモデルは DAX と DynamoDB で異なります。

両方のセキュリティモデルを理解することを強くお勧めします。そうすることで、DAX を使用するアプリケーションに適切なセキュリティ手段を実装できます。

このセクションでは、DAX が提供するアクセスコントロールメカニズムを説明し、必要に合わせて調整できる IAM ポリシーの例を示します。

DynamoDB では、個別の DynamoDB リソースでユーザーが実行できるアクションを制限する IAM ポリシーを作成できます。たとえば、特定の DynamoDB テーブルに対して、ユーザーに読み取り専用アクションのみを許可するユーザーロールを作成できます。(詳しくは、Amazon DynamoDB での Identity and Access Management を参照してください)。 対して、DAX のセキュリティモデルでは、クラスターのセキュリティおよびクラスターがユーザーに代わって実行する DynamoDB API アクション機能が中心です。

警告

現在 IAM ロールおよびポリシーを使用して DynamoDB テーブルのデータへのアクセスを制限している場合、DAX を使用することで、これらのポリシーが覆される場合があります。たとえば、あるユーザーが、DAX 経由では DynamoDB テーブルにアクセスできるが、DynamoDB に直接アクセスすると同じテーブルに対する明示的なアクセスができないという場合があります。詳細については、「Amazon DynamoDB での Identity and Access Management」を参照してください。

DAX では、DynamoDB のデータに対してユーザーレベルの分離を実施していません。代わりに、ユーザーは DAX クラスターにアクセスする際に、そのクラスターの IAM ポリシーのアクセス権限を継承します。そのため、DAX 経由で DynamoDB テーブルにアクセスする際、有効なアクセスコントロールは DAX クラスターの IAM ポリシーのアクセス権限のみです。他のアクセス権限は認識されません。

隔離が必要な場合は、追加の DAX クラスターを作成して、各クラスターごとに IAM ポリシーを限定することをお勧めします。たとえば、複数の DAX クラスターを作成し、各クラスターに 1 つのテーブルのみに対してアクセスを許可することもできます。

DAX の IAM サービスロール

DAX クラスターを作成するときに、クラスターを IAM ロールと関連付ける必要があります。これは、クラスターのサービスロールと呼ばれます。

DAXCluster01 という新しい DAX クラスターを作成するとします。DAXServiceRole というサービスロールを作成し、そのロールを DAXCluster01 と関連付けます。DAXServiceRole のポリシーは、DAXCluster01 を使用するユーザーに代わって DAXCluster01 が実行できる DynamoDB アクションを定義します。

サービスロールを作成する際に、DAXServiceRole と DAX サービス自体の信頼関係を指定する必要があります。信頼関係は、どのエンティティがロールを引き受けアクセス権限を利用できるかを決定します。以下は、DAXServiceRole の信頼関係のドキュメントの例です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "dax.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

この信頼関係では、DAX クラスターが DAXServiceRole を引き受け、ユーザーに代わって DynamoDB API コールを実行します。

許可された DynamoDB API アクションは、DAXServiceRole にアタッチする IAM ポリシードキュメントに記載します。以下に、ポリシードキュメントの例を示します。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DaxAccessPolicy", "Effect": "Allow", "Action": [ "dynamodb:*" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Books" ] } ] }

このポリシーでは、DAX は、Books という名前の DynamoDB テーブルに対してすべての DynamoDB API アクションを実行できます。テーブルは us-west-2 リージョンにあり、AWS アカウント ID 123456789012 によって所有されています。

DAX クラスターのアクセスを許可する IAM ポリシー

DAX クラスターを作成したら、ユーザーが DAX クラスターにアクセスできるように、IAM ユーザーにアクセス権限を付与する必要があります。

たとえば、Alice という名前の IAM ユーザーに DAXCluster01 へのアクセスを許可するとします。最初に、受取人がアクセスできる DAX クラスターおよび DAX API アクションを定義する IAM ポリシー (AliceAccessPolicy) を作成します。次に、このポリシーをユーザー Alice にアタッチして、アクセスを付与します。

次に示すポリシードキュメントは、受取人に DAXCluster01 のフルアクセスを付与します。

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "dax:*" ], "Effect": "Allow", "Resource": [ "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" ] } ] }

ポリシードキュメントは DAX クラスターへのアクセスを許可しますが、DynamoDB に対するアクセス権限は付与しません。(DynamoDB アクセス権限は、DAX サービスロールによって付与されます。)

ユーザー Alice 用に、まず上記のポリシードキュメントを持った AliceAccessPolicy を作成します。次に、ポリシーを Alice にアタッチします。

注記

ポリシーを IAM ユーザーにアタッチする代わりに、IAM ロールにアタッチできます。この方法では、そのロールを引き受けるユーザーのすべてに、ポリシーで定義したアクセス権限があります。

ユーザーポリシーは、DAX サービスロールとともに、受取人が DAX 経由でアクセスできる DynamoDB リソースおよび API アクションを決定します。

導入事例: DynamoDB および DAX へのアクセス

次のシナリオは、DAX で使用する IAM ポリシーについての理解を深めるために役立ちます (このシナリオは、このセクションの他の部分でも参照されます)。 次の図は、このシナリオの大まかな概要を示しています。

このシナリオでは、次のエンティティがあります。

  • IAM ユーザー (Bob)。

  • IAM ロール (BobUserRole)。Bob は実行時にこのロールを引き受けます。

  • IAM ポリシー (BobAccessPolicy)。このポリシーは、BobUserRole にアタッチされています。BobAccessPolicy では、BobUserRole がアクセスを許可される DynamoDB リソースと DAX リソースが定義されます。

  • DAX クラスター (DAXCluster01)。

  • サービス IAM ロール (DAXServiceRole)。このロールにより、DAXCluster01 は DynamoDB にアクセスできます。

  • IAM ポリシー (DAXAccessPolicy)。このポリシーは、DAXServiceRole にアタッチされています。DAXAccessPolicy では、DAXCluster01 がアクセスを許可される DynamoDB API およびリソースが定義されます。

  • DynamoDB テーブル (Books)。

BobAccessPolicyDAXAccessPolicy のポリシーステートメントの組み合わせにより、Bob が Books に対して何ができるかが決まります。たとえば、Books に (DynamoDB エンドポイントを使用して) 直接アクセスできる、(DAX クラスターを使用して) 間接的にアクセスできる、またはその両方などです。Books からデータを読み取る、Books にデータを書き込む、またはその両方が可能な場合もあります。

DynamoDB にアクセスできるが、DAX にはアクセスできない

DynamoDB テーブルに直接アクセスすることは許可するが、DAX クラスターを使用した間接的なアクセスは防止することもできます。DynamoDB への直接アクセスについては、BobUserRole のアクセス権限は BobAccessPolicy (ロールにアタッチされている) によって決まります。

DynamoDB (のみ) への読み取り専用アクセス

Bob は、BobUserRole で DynamoDB にアクセスできます。このロールにアタッチされた IAM ポリシー (BobAccessPolicy) は、BobUserRole がアクセスできる DynamoDB テーブルと、BobUserRole が呼び出すことができる API を決定します。

BobAccessPolicy に対して、次のポリシードキュメントを検討してください。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

このドキュメントが BobAccessPolicy にアタッチされていると、BobUserRole は DynamoDB エンドポイントにアクセスし、Books テーブルで読み取り専用のオペレーションを実行できるようになります。

DAX はこのポリシーには含まれていないため、DAX 経由のアクセスは拒否されます。

DynamoDB (のみ) への書き込み専用アクセス

BobUserRole に DynamoDB への読み書きアクセスが必要な場合、次のポリシーが使えます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

ここでも、DAX はこのポリシーには含まれていないため、DAX 経由のアクセスは拒否されます。

DynamoDB および DAX へのアクセス

DAX クラスターに対するアクセスを許可するには、IAM ポリシーに DAX 固有アクションを含める必要があります。

次の DAX 固有アクションは、DynamoDB API の似た名前のそれに対応しています。

  • dax:GetItem

  • dax:BatchGetItem

  • dax:Query

  • dax:Scan

  • dax:PutItem

  • dax:UpdateItem

  • dax:DeleteItem

  • dax:BatchWriteItem

  • dax:ConditionCheckItem

dax:EnclosingOperation 条件キーについても同様です。

さらに、DynamoDB API に対応していない DAX 固有アクションが 4 つあります。

  • dax:DefineAttributeList

  • dax:DefineAttributeListId

  • dax:DefineKeySchema

  • dax:Endpoints

この 4 つのアクションすべてを、DAX クラスターへのアクセスを許可するすべての IAM ポリシー内で指定する必要があります。これらのアクションは、低レベルの DAX データトランスポートプロトコル専用です。アプリケーションでこれらのアクションを考慮する必要はありません。これらは IAM ポリシーでのみ使用されます。

DynamoDB への読み取り専用アクセスと DAX への読み取り専用アクセス

Bob には、DynamoDB と DAX の両方から Books テーブルへの読み取り専用アクセスが必要であるとします。次のポリシー (BobUserRole にアタッチされている) により、このアクセスが付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:DefineAttributeList", "dax:DefineAttributeListId", "dax:DefineKeySchema", "dax:Endpoints" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

ポリシーには、DAX アクセス用のステートメント (DAXAccessStmt) と、DynamoDB アクセス用の別のステートメント (DynamoDBAccessStmt) があります。これらのステートメントにより、Bob は、GetItemBatchGetItemQueryScan リクエストを DAXCluster01 に送信できるようになります。

ただし、DAXCluster01 のサービスロールにも、DynamoDB の Books テーブルへの読み取り専用のアクセスが必要になります。DAXServiceRole にアタッチされた以下の IAM ポリシーは、この条件を満たします。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

DynamoDB への読み書きアクセスと DAX の読み取り専用アクセス

特定のユーザーロールに、DAX 経由では読み取り専用アクセスを許可したまま、DynamoDB テーブルへの読み書きアクセスを提供できます。

Bob の場合、BobUserRole の IAM ポリシーは、Books テーブルに対する DynamoDB の読み取り/書き込みアクションを許可しながら、DAXCluster01 を介した読み取り専用アクションもサポートする必要があります。

BobUserRole に対する次のポリシードキュメントの例では、このアクセスが付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:DefineKeySchema", "dax:DefineAttributeList", "dax:DefineAttributeListId", "dax:Endpoints" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

さらに、DAXServiceRole には、DAXCluster01Books に対して読み取り専用のアクションを実行できるようにする IAM ポリシーが必要になります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:DescribeTable" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

DynamoDB への読み書きアクセスと DAX への読み書きアクセス

次に、Bob に DynamoDB から直接、または DAXCluster01 から間接的な Books テーブルへの読み書きアクセスが必要であるとします。BobAccessPolicy にアタッチされている次のポリシードキュメントでは、このアクセスが付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:PutItem", "dax:UpdateItem", "dax:DeleteItem", "dax:BatchWriteItem", "dax:DefineKeySchema", "dax:DefineAttributeList", "dax:DefineAttributeListId", "dax:Endpoints", "dax:ConditionCheckItem" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" }, { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

さらに、DAXServiceRole には、DAXCluster01Books テーブルに対して読み書きアクションを実行できるようにする IAM が必要になります。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

DAX 経由で DynamoDB にアクセスするが、DynamoDB に直接アクセスはしない

このシナリオでは、Bob は Books テーブルに DAX 経由でアクセスできますが、DynamoDB の Books テーブルに直接アクセスすることはできません。したがって、Bob が DAX にアクセスすると、他の場合はアクセスできない DynamoDB テーブルへのアクセスも取得します。DAX サービスロール用の IAM ポリシーを設定する際に、ユーザーアクセスポリシー経由で DAX クラスターへのアクセスを付与されたユーザーには、そのポリシーで指定されたテーブルへのアクセスも付与されることに注意してください。この場合、BobAccessPolicy には DAXAccessPolicy で指定されたテーブルへのアクセスが付与されます。

現在 IAM ロールおよびポリシーを使用して DynamoDB テーブルおよびデータへのアクセスを制限している場合、DAX を使用することで、これらのポリシーが覆される場合があります。次のポリシーでは、Bob は DynamoDB テーブルに DAX 経由でアクセスできますが、DynamoDB の同じテーブルに明示的に直接アクセスすることはできません。

BobUserRole にアタッチされている次のポリシードキュメント (BobAccessPolicy) では、このアクセスが付与されます。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DAXAccessStmt", "Effect": "Allow", "Action": [ "dax:GetItem", "dax:BatchGetItem", "dax:Query", "dax:Scan", "dax:PutItem", "dax:UpdateItem", "dax:DeleteItem", "dax:BatchWriteItem", "dax:DefineKeySchema", "dax:DefineAttributeList", "dax:DefineAttributeListId", "dax:Endpoints", "dax:ConditionCheckItem" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" } ] }

このアクセスポリシーでは、DynamoDB に直接アクセスする権限はありません。

BobAccessPolicy と次の DAXAccessPolicy により、BobUserRole は、DynamoDB テーブル Books にアクセスできるようになります。ただし、BobUserRole は、Books テーブルに直接アクセスすることはできません。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DynamoDBAccessStmt", "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem", "dynamodb:DescribeTable", "dynamodb:ConditionCheckItem" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

この例に示すように、ユーザーアクセスポリシーおよび DAX クラスターアクセスポリシーのアクセスコントロールを設定する場合は、エンドツーエンドのアクセスを完全に理解し、最小権限の原則が守られていることを確認してください。また、DAX クラスターへのアクセスをユーザーに付与することで、以前に確立されたアクセスコントロールポリシーが覆されないことを確認してください。