

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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>

데이터 액세스 정책문에 사용할 수 있는 3가지 Neptune 쿼리 작업(`ReadDataViaQuery`, `WriteDataViaQuery`, `DeleteDataViaQuery`)이 있습니다. 특정 쿼리에는 이러한 작업을 2개 이상 수행할 수 있는 권한이 필요할 수 있으며, 쿼리를 실행하기 위해 이러한 작업의 조합을 허용해야 하는지 명확하지 않을 수 있습니다.

Neptune은 쿼리를 실행하기 전에 쿼리의 각 단계를 실행하는 데 필요한 권한을 결정하고, 이를 쿼리에 필요한 전체 권한 세트로 결합합니다. 이 전체 권한 세트에는 쿼리가 *수행할 수 있는* 모든 작업이 포함된다는 점에 유의하세요. 이는 데이터를 대상으로 실행될 때 쿼리가 실제로 수행하는 작업 세트일 필요는 없습니다.

즉, 특정 쿼리를 실행하도록 허용하려면 실제로 수행하는지 여부에 관계없이 쿼리가 수행할 수 있는 모든 작업에 대한 권한을 제공해야 합니다.

다음은 이에 대해 더 자세히 설명하는 몇 가지 Gremlin 쿼리 샘플입니다.
+ 

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

  `g.V()` 및 `count()`는 읽기 액세스 권한만 필요하므로, 전체 쿼리에는 `ReadDataViaQuery` 액세스만 필요합니다.
+ 

  ```
  g.addV()
  ```

  `addV()`는 새 버텍스를 삽입하기 전에 주어진 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가 같은 엣지가 이미 존재하는지 확인해야 하기 때문입니다. 따라서 전체 쿼리에는 `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` 절은 지정된 패턴과 일치하거나 패턴을 생성합니다. 패턴이 일치하지 않으면 쓰기가 발생할 수 있으므로, 읽기 권한뿐만 아니라 쓰기 권한도 필요합니다.