

# DAX のアクセスコントロール
<a name="DAX.access-control"></a>

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

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

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

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

**警告**  
現在 IAM ロールおよびポリシーを使用して DynamoDB テーブルのデータへのアクセスを制限している場合、DAX を使用することで、これらのポリシーが**覆される**場合があります。たとえば、あるユーザーが、DAX 経由では DynamoDB テーブルにアクセスできても、DynamoDB に直接アクセスすると同じテーブルに対する明示的なアクセスができないという場合があります。詳細については、「[Amazon DynamoDB の Identity and Access Management](security-iam.md)」を参照してください。  
DAX では、DynamoDB のデータに対してユーザーレベルの分離を実施していません。代わりに、ユーザーは DAX クラスターにアクセスする際に、そのクラスターの IAM ポリシーのアクセス権限を継承します。そのため、DAX 経由で DynamoDB テーブルにアクセスする際、有効なアクセスコントロールは DAX クラスターの IAM ポリシーのアクセス権限のみです。他のアクセス権限は認識されません。  
隔離が必要な場合は、追加の DAX クラスターを作成して、クラスターごとに IAM ポリシーを限定することをお勧めします。たとえば、複数の DAX クラスターを作成し、各クラスターに 1 つのテーブルのみに対してアクセスを許可することもできます。

## DAX 用の IAM サービスロール
<a name="DAX.access-control.iam-service-role"></a>

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

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

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

------
#### [ JSON ]

****  

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

------

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

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

------
#### [ JSON ]

****  

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

------

このポリシーでは、DAX は、DynamoDB テーブルに対して必要な DynamoDB API アクションを実行できます。`dynamodb:DescribeTable` アクションは、DAX がテーブルに関するメタデータを維持するために必要です。その他のアクションは、テーブル内の項目に対して実行される読み込みおよび書き込みアクションです。`Books` という名前のテーブルは us-west-2 リージョンにあり、AWS アカウント ID `123456789012` によって所有されています。

**注記**  
DAX は、クロスサービスアクセス中に混乱した代理問題を防止するメカニズムをサポートしています。詳細については、*IAM ユーザーガイド* の [混乱した代理問題](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html) を参照してください。

## DAX クラスターのアクセスを許可する IAM ポリシー
<a name="DAX.access-control.iam-allow-dax-cluster-access"></a>

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

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

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

------
#### [ JSON ]

****  

```
{
    "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 ロールにアタッチできます。この方法では、そのロールを引き受けるユーザーのすべてに、ポリシーで定義したアクセス権限があります。

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

## 導入事例: DynamoDB と DAX にアクセスする
<a name="DAX.access-control.case-study"></a>

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

![\[IAM ポリシーと DAX を使用するシナリオの大まかな概要。\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/dax-access-control-scenario.png)


このシナリオには、次のエンティティがあります。
+ ユーザー (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`)。

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

## DynamoDB へのアクセスと DAX へのアクセス防止
<a name="DAX.access-control.ddb-yes-dax-no"></a>

![\[テーブルへの直接アクセスは許可するが、DAX クラスターを使用した間接アクセスはブロックする IAM ポリシーの概要。\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/dax-access-control-ddb-only.png)


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

### DynamoDB (のみ) への読み込み専用アクセス
<a name="DAX.access-control.ddb-yes-dax-no.ddb-read-only"></a>

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

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

------
#### [ JSON ]

****  

```
{
    "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 (のみ) への読み込み/書き込みアクセス
<a name="DAX.access-control.ddb-yes-dax-no.ddb-read-write"></a>

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

------
#### [ JSON ]

****  

```
{
    "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 へのアクセス
<a name="DAX.access-control.ddb-yes-dax-yes"></a>

![\[DynamoDB テーブルおよび DAX クラスターへのアクセス権を付与する IAM ポリシー。\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/dax-access-control-ddb-and-dax.png)


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 への読み込み専用アクセスと DAX への読み込み専用アクセス
<a name="DAX.access-control.ddb-yes-dax-yes.ddb-read-only-dax-read-only"></a>

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

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DAXAccessStmt",
            "Effect": "Allow",
            "Action": [
                "dax:GetItem",
                "dax:BatchGetItem",
                "dax:Query",
                "dax:Scan"
            ],
            "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`) と DynamoDBaccess 用の別のステートメント (`DynamoDBAccessStmt`) があります。これらのステートメントにより、Bob は、`GetItem`、`BatchGetItem`、`Query`、`Scan` リクエストを `DAXCluster01` に送信できるようになります。

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

------
#### [ JSON ]

****  

```
{
    "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 経由の読み込み専用アクセス
<a name="DAX.access-control.ddb-yes-dax-yes.ddb-read-write-dax-read-only"></a>

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

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

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

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DAXAccessStmt",
            "Effect": "Allow",
            "Action": [
                "dax:GetItem",
                "dax:BatchGetItem",
                "dax:Query",
                "dax:Scan"
            ],
            "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` には、`DAXCluster01` が `Books` テーブルに対して読み込み専用のアクションを実行できるようにする IAM ポリシーが必要になります。

------
#### [ JSON ]

****  

```
{
    "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 への読み込み/書き込みアクセス
<a name="DAX.access-control.ddb-yes-dax-yes.ddb-read-write-dax-read-write.title"></a>

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

------
#### [ JSON ]

****  

```
{
    "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: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` には、`DAXCluster01` が `Books` テーブルに対する読み込み/書き込みアクションを許可する IAM ポリシーが必要になります。

------
#### [ JSON ]

****  

```
{
    "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 への直接アクセスの防止
<a name="DAX.access-control.ddb-no-dax-yes.ddb-read-write-dax-read-write"></a>

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

![\[ユーザーが DynamoDB に直接アクセスせずに DAX クラスターを介してテーブルにアクセスできるシナリオ。\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/dax-access-control-dax-only.png)


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

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

------
#### [ JSON ]

****  

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

------

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

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

------
#### [ JSON ]

****  

```
{
    "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 クラスターへのアクセスをユーザーに付与することで、以前に確立されたアクセスコントロールポリシーが覆されないことを確認してください。