メニュー
Amazon DynamoDB
開発者ガイド (API Version 2012-08-10)

DAX のアクセスコントロール

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

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

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

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

警告

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

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 の信頼関係のドキュメントの例です。

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

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

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

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

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

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

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

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

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

Copy
{ "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 へのアクセス

IAM ポリシーの DAX での使用をさらに理解するために、一般的なシナリオを紹介します。(このセクション全体でのこのシナリオを参照します。)次の図は、このシナリオの高レベルの概要を示しています。

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

  • IAM ユーザー (Bob)。

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

  • IAM ポリシー (BobAccessPolicy)。このポリシーは BobUserRole にアタッチされます。BobAccessPolicyBobUserRole がアクセスを許可される DynamoDB および DAX リソースを定義します。

  • DAX クラスター (DAXCluster01)。

  • IAM サービスロール (DAXServiceRole)。このロールは DAXCluster01 に DynamoDB へのアクセスを許可します。

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

  • DynamoDB テーブル (Books)。

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

DynamoDB にアクセスするが、DAX を使用したアクセスはしない

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

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

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

BobAccessPolicy の次に示すポリシードキュメントを考えてみます。

Copy
{ "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 に対する読み書きアクセスが必要な場合、次のポリシーが機能します。

Copy
{ "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" ], "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

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

  • dax:DefineAttributeList

  • dax:DefineAttributeListId

  • dax:DefineKeySchema

  • dax:Endpoints

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

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

Bob には、DynamoDB からおよび DAX. から Books テーブルへの読み取り専用アクセスが必要だとします。次のポリシー (BobUserRole にアタッチ) で、このアクセスを付与できます。

Copy
{ "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 は GetItemBatchGetItemQuery、およびScan リクエストを DAXCluster01 に送信できるようになります。

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

Copy
{ "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 ポリシーが、DAXCluster01 経由での読み取り専用アクションをサポートしながら、Books テーブルでの DynamoDB 読み書きアクションを許可する必要があります。

次の例に示す BobUserRole のポリシードキュメントでこのアクセスを付与します。

Copy
{ "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" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

さらに、DAXServiceRole には、DAXCluster01 に対して Books テーブルでの読み取り専用アクションの実行を許可する IAM ポリシーが必要になります。

Copy
{ "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 にアタッチされた次のポリシードキュメントでこのアクセスを付与します。

Copy
{ "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" ], "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" ], "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books" } ] }

さらに、DAXServiceRole には、DAXCluster01 に対して Books テーブルでの読み書きアクションの実行を許可する IAM ポリシーが必要になります。

Copy
{ "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) でこのアクセスを付与します。

Copy
{ "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" ], "Resource": "arn:aws:dax:us-west-2:123456789012:cache/DAXCluster01" } ] }

このアクセスポリシーでは、DynamoDB に直接アクセスする権限はないことに注意してください。

BobAccessPolicy と合わせて、次の DAXAccessPolicy が、BobUserRoleBooks テーブルに直接アクセスできない場合でも、BobUserRole に DynamoDB テーブル Books へのアクセスを付与します。

Copy
{ "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 クラスターアクセスポリシーのアクセスコントロールを設定する場合は、エンドツーエンドのアクセスを完全に理解して、最小権限の原則が守られていることを確認してください。また、DAX クラスターへのアクセスをユーザーに付与することで、以前に確立されたアクセスコントロールポリシーが覆されないことを確認する必要があります。