

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Neptune のデータにアクセスするためのカスタム IAM ポリシーステートメントの作成
<a name="iam-data-access-policies"></a>

Neptune データアクセスポリシーステートメントは、[データアクセスアクション](iam-dp-actions.md)、[リソース](iam-data-resources.md)、および[条件キー](iam-data-condition-keys.md#iam-neptune-condition-keys)を使用し、これらはすべて `neptune-db:` プレフィックスが付きます。

**Topics**
+ [Neptune データアクセスポリシーステートメントでのクエリアクションの使用](#iam-data-query-actions)
+ [Amazon Neptune でのデータアクセスのための IAM アクション](iam-dp-actions.md)
+ [Amazon Neptune のデータにアクセスするための IAM リソースタイプ](iam-data-resources.md)
+ [Amazon Neptune のデータにアクセスするための IAM 条件キー](iam-data-condition-keys.md)
+ [Amazon Neptune での IAM データアクセスポリシーの作成](iam-data-access-examples.md)

## Neptune データアクセスポリシーステートメントでのクエリアクションの使用
<a name="iam-data-query-actions"></a>

データアクセスポリシーステートメントで使用できる Neptune クエリアクションには、`ReadDataViaQuery`、`WriteDataViaQuery`、`DeleteDataViaQuery` の 3 つがあります。特定のクエリには、これらのアクションを複数実行するためのアクセス許可が必要な場合があり、クエリを実行するためにこれらのアクションのどの組み合わせを許可する必要があるかが常に明確であるとは限りません。

クエリを実行する前に、Neptune はクエリの各ステップを実行するのに必要なアクセス許可を決定し、それらを組み合わせてクエリに必要なアクセス許可のフルセットにします。このフルセットのアクセス許可には、クエリが実行する*可能性のある*すべてのアクションが含まれますが、必ずしもクエリがデータに対して実際に実行するアクションのセットではないことに注意してください。

つまり、特定のクエリの実行を許可するには、そのクエリが実際に実行するかどうかにかかわらず、そのクエリが実行する可能性のあるすべてのアクションにアクセス許可を与える必要があります。

以下に、Gremlin クエリの例をいくつか示します。これについてさらに詳しく説明しています。
+ 

  ```
  g.V().count()
  ```

  `g.V()` および `count()` は読み取りアクセスだけを必要とするため、クエリ全体として必要なのは `ReadDataViaQuery` アクセスのみです。
+ 

  ```
  g.addV()
  ```

  `addV()` は、新しい ID の頂点を挿入する前に、特定の ID の頂点が存在するかどうかを確認する必要があります。つまり、`ReadDataViaQuery` と `WriteDataViaQuery` の両方のアクセスが必要です。
+ 

  ```
  g.V('1').as('a').out('created').addE('createdBy').to('a')
  ```

  `g.V('1').as('a')` と `out('created')` は読み取りアクセスのみを必要としますが、`addE().from('a')` は読み取りと書き込みの両方のアクセスを必要とします。`addE()` は `from` を読み取る必要があり、`to` は新しい ID のエッジを追加する前に、同じ ID のエッジが既に存在するかどうかを確認する必要があるためです。そのため、クエリ全体としては、`ReadDataViaQuery` と `WriteDataViaQuery` の両方のアクセスが必要です。
+ 

  ```
  g.V().drop()
  ```

  `g.V()` は読み取りアクセスのみを必要とします。`drop()` は頂点またはエッジを削除する前にそれらを読み取る必要があるため、読み取りアクセスと削除アクセスの両方が必要です。そのため、クエリ全体としては `ReadDataViaQuery` と `DeleteDataViaQuery` の両方のアクセスが必要です。
+ 

  ```
  g.V('1').property(single, 'key1', 'value1')
  ```

  `g.V('1')` は読み取りアクセスのみを必要としますが、`property(single, 'key1', 'value1')` は読み取り、書き込み、および削除アクセスを必要とします。ここでは、`property()` ステップは、頂点にまだ存在しない場合はキーと値を挿入しますが、既に存在する場合は、既存のプロパティ値を削除し、代わりに新しい値を挿入します。したがって、クエリ全体としては、`ReadDataViaQuery`、`WriteDataViaQuery`、および `DeleteDataViaQuery` アクセスが必要です。

  `property()` ステップを含むクエリには、`ReadDataViaQuery`、`WriteDataViaQuery`、および `DeleteDataViaQuery` アクセス許可が必要です。

openCypher の例をいくつか示します。
+ 

  ```
  MATCH (n)
  RETURN n
  ```

  このクエリはデータベース内のすべてのノードを読み込んで返します。必要なのは `ReadDataViaQuery` アクセスだけです。
+ 

  ```
  MATCH (n:Person)
  SET n.dept = 'AWS'
  ```

  このクエリには、`ReadDataViaQuery`、`WriteDataViaQuery`、および `DeleteDataViaQuery` アクセスが必要です。「Person」というラベルの付いたすべてのノードを読み取り、キー `dept` と値 `AWS` を持つ新しいプロパティを追加するか、`dept` プロパティが既に存在する場合は、古い値を削除して、代わりに `AWS` を挿入します。また、設定する値が `null` の場合、`SET` はプロパティをすべて削除します。

   `SET` 句は既存の値を削除しなければならない場合があるため、**常に** `DeleteDataViaQuery` アクセス許可だけでなく `ReadDataViaQuery` および `WriteDataViaQuery` アクセス許可も必要です。
+ 

  ```
  MATCH (n:Person)
  DETACH DELETE n
  ```

  このクエリには `ReadDataViaQuery` および `DeleteDataViaQuery` アクセス許可が必要です。ラベル `Person` の付いたノードをすべｒて検索し、それらのノードに接続されているエッジや関連するラベルやプロパティとともに削除します。
+ 

  ```
  MERGE (n:Person {name: 'John'})-[:knows]->(:Person {name: 'Peter'})
  RETURN n
  ```

  このクエリには `ReadDataViaQuery` および `WriteDataViaQuery` アクセス許可が必要です。`MERGE` 句は、指定されたパターンと一致するか、それを作成します。パターンが一致しないと書き込みが発生する可能性があるため、読み取りアクセス許可だけでなく書き込みアクセス許可も必要です。