

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

# Python による IAM 認証を使用した Amazon Neptune データベースへの接続
<a name="iam-auth-connecting-python"></a>

`boto3` `neptunedata` クライアントは、Python から IAM 対応の Neptune データベースに接続する最も簡単な方法を提供します。クライアントは署名バージョン 4 の署名を自動的に処理するため、自分でリクエストに署名する必要はありません。

## 前提条件
<a name="iam-auth-connecting-python-prereqs"></a>
+ Python 3.x
+ `boto3` ライブラリ: `pip install boto3`
+ AWS 標準メソッド (環境変数、 AWS 設定ファイル、インスタンスプロファイル、または Lambda 実行ロール) を使用して設定された 認証情報
+ Neptune クラスターで`neptune-db:*`アクションを許可する IAM ポリシー

## デフォルトの認証情報を使用した接続
<a name="iam-auth-connecting-python-default"></a>

このアプローチ`boto3`は、インスタンスプロファイルを持つ Amazon Elastic Compute Cloud インスタンス、 AWS Lambda 関数、設定済み AWS プロファイルなど、 が認証情報を自動的に解決できる場合に役立ちます。

エンドポイント URL を Neptune クラスターエンドポイントに置き換えます。

**Gremlin と openCypher**

```
import boto3
from botocore.config import Config

cfg = Config(retries={"total_max_attempts": 1, "mode": "standard"}, read_timeout=None)

neptune = boto3.client('neptunedata', config=cfg,
    region_name='{{us-east-1}}',
    endpoint_url='https://{{your-neptune-endpoint}}:8182')

# Gremlin
resp = neptune.execute_gremlin_query(gremlinQuery='g.V().limit(1)')
print(resp['result'])

# openCypher
resp = neptune.execute_open_cypher_query(openCypherQuery='MATCH (n) RETURN n LIMIT 1')
print(resp['results'])
```

**SPARQL**

`boto3` `neptunedata` クライアントは現在 SPARQL をサポートしていません。SPARQL クエリを IAM 対応 Neptune データベースに送信するには、リクエスト署名ユーティリティと`requests`ライブラリ () で署名バージョン 4 を使用して`botocore`リクエストを手動で署名します`pip install boto3 requests`。

```
import requests
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
from botocore.session import Session

endpoint = 'https://{{your-neptune-endpoint}}:8182'
region = '{{us-east-1}}'

query = 'SELECT ?s ?p ?o WHERE { ?s ?p ?o } LIMIT 1'

request = AWSRequest(method='POST', url=f'{endpoint}/sparql/',
    data={'query': query})
SigV4Auth(Session().get_credentials(), 'neptune-db', region).add_auth(request)

resp = requests.post(f'{endpoint}/sparql/', headers=request.headers,
    data={'query': query})
print(resp.json())
```

**注記**  
この例では`botocore.session.Session`、 を使用して、環境変数、 AWS 設定ファイル、インスタンスプロファイル、または Lambda 実行ロールから AWS 認証情報を自動的に解決します。認証情報を明示的に設定する必要はありません。

## 一時的な認証情報を使用する
<a name="iam-auth-connecting-python-temp-creds"></a>

クロスアカウントアクセス、時間制限付きセッション、または存続期間の長い認証情報を避けるためのセキュリティのベストプラクティスとして、 AWS STS を使用して一時的な認証情報を取得し、 を作成します`boto3.Session`。

**Gremlin と openCypher**

```
import boto3
from botocore.config import Config

sts = boto3.client('sts')
creds = sts.assume_role(
    RoleArn='arn:aws:iam::{{123456789012}}:role/{{NeptuneRole}}',
    RoleSessionName='neptune-session'
)['Credentials']

session = boto3.Session(
    aws_access_key_id=creds['AccessKeyId'],
    aws_secret_access_key=creds['SecretAccessKey'],
    aws_session_token=creds['SessionToken'],
    region_name='{{us-east-1}}'
)

cfg = Config(retries={"total_max_attempts": 1, "mode": "standard"}, read_timeout=None)

neptune = session.client('neptunedata', config=cfg,
    endpoint_url='https://{{your-neptune-endpoint}}:8182')

# Gremlin
resp = neptune.execute_gremlin_query(gremlinQuery='g.V().limit(1)')
print(resp['result'])

# openCypher
resp = neptune.execute_open_cypher_query(openCypherQuery='MATCH (n) RETURN n LIMIT 1')
print(resp['results'])
```

**注記**  
一時的な認証情報は、指定された間隔 (デフォルトは 1 時間) 後に期限切れになり、クライアントによって自動的に更新されません。長時間実行されるアプリケーションの場合は、代わりにプロファイルベースの認証情報またはインスタンスプロファイルを使用します。

**SPARQL**

`boto3` `neptunedata` クライアントは現在 SPARQL をサポートしていないため、一時的な認証情報を使用してリクエストを手動で署名する必要があります。

```
import boto3
import requests
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
from botocore.credentials import ReadOnlyCredentials

sts = boto3.client('sts')
creds = sts.assume_role(
    RoleArn='arn:aws:iam::{{123456789012}}:role/{{NeptuneRole}}',
    RoleSessionName='neptune-session'
)['Credentials']

endpoint = 'https://{{your-neptune-endpoint}}:8182'
region = '{{us-east-1}}'

query = 'SELECT ?s ?p ?o WHERE { ?s ?p ?o } LIMIT 1'

request = AWSRequest(method='POST', url=f'{endpoint}/sparql/',
    data={'query': query})
SigV4Auth(ReadOnlyCredentials(
    creds['AccessKeyId'], creds['SecretAccessKey'], creds['SessionToken']
), 'neptune-db', region).add_auth(request)

resp = requests.post(f'{endpoint}/sparql/', headers=request.headers,
    data={'query': query})
print(resp.json())
```

## での の使用 AWS Lambda
<a name="iam-auth-connecting-python-lambda"></a>

Lambda では、実行ロールは を介して認証情報を自動的に提供します`boto3`。デフォルトの認証情報の例では、変更なしで動作します。

接続管理と再試行ロジックの完全な Lambda の例については、「」を参照してください[AWS Lambda Amazon Neptune の 関数の例](lambda-functions-examples.md)。