

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

# Amazon EKS コンテナから Amazon Neptune データベースにアクセスする
<a name="access-amazon-neptune-database-from-amazon-eks-container"></a>

*Amazon Web Services、Ramakrishnan Palaninathan*

## 概要
<a name="access-amazon-neptune-database-from-amazon-eks-container-summary"></a>

本パターンは、フルマネージド型のグラフデータベースである Amazon Neptune と、コンテナオーケストレーションサービスである Amazon Elastic Kubernetes Service (Amazon EKS) との間の接続を確立して Neptune データベースにアクセスします。Neptune DB クラスターは、 AWSの仮想プライベートクラウド (VPC) 内に制限されています。そのため、Neptune にアクセスするには、接続を有効にするために VPC を注意して設定する必要があります。

Neptune は、Amazon Relational Database Service (Amazon RDS) for PostgreSQL とは異なり一般的なデータベースアクセス認証情報に依存しません。代わりに、認証に AWS Identity and Access Management (IAM) ロールを使用します。したがって、Amazon EKS から Neptune に接続するには、Neptune へのアクセスに必要なアクセス許可を持つ、IAM ロールの設定が必要になります。

さらに、Neptune エンドポイントには、クラスターが存在する VPC 内のみでアクセスできます。つまり、Amazon EKS と Neptune の間の通信が容易になるようにネットワーク設定を構成する必要があります。Neptune と Amazon EKS 間のシームレスな接続を可能にするには、特定の要件とネットワーク設定に応じて[さまざまな方法で VPC を設定](https://docs.aws.amazon.com/neptune/latest/userguide/get-started-vpc.html)します。それぞれの方法には個別の利点と考慮事項があり、アプリケーションのニーズに合ったデータベースアーキテクチャを柔軟に設計できます。

## 前提条件と制限事項
<a name="access-amazon-neptune-database-from-amazon-eks-container-prereqs"></a>

**前提条件**
+ 最新バージョンの **kubectl** をインストールします ([手順](https://kubernetes.io/docs/tasks/tools/#kubectl)を参照)。バージョンを確認するには次を実行します。

  ```
  kubectl version --short
  ```
+ 最新バージョンの **eksctl** をインストールします ([手順](https://eksctl.io/installation/)を参照)。バージョンを確認するには次を実行します。

  ```
  eksctl info
  ```
+  AWS Command Line Interface (AWS CLI) バージョン 2 の最新バージョンをインストールします ([手順](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)を参照）。バージョンを確認するには次を実行します。

  ```
  aws --version
  ```
+ Neptune DB クラスターを作成します ([手順](https://docs.aws.amazon.com/neptune/latest/userguide/get-started-cfn-create.html)を参照)。VPC [ピアリング](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)、[AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-getting-started.html)、またはその他の方法を使用して、クラスターの VPC と Amazon EKS 間の通信を確立します。また、クラスターのステータスが「使用可能」であり、セキュリティグループのポート 8182 にインバウンドルールがあることを確認します。
+ 既存の Amazon EKS クラスターで IAM OpenID Connect (OIDC) プロバイダーを設定します ([手順](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)を参照)。

**製品バージョン**
+ [Amazon EKS 1.27](https://docs.aws.amazon.com/eks/latest/userguide/kubernetes-versions.html)
+ [Amazon Neptune エンジンバージョン 1.3.0.0 (2023-11-15)](https://docs.aws.amazon.com/neptune/latest/userguide/engine-releases-1.3.0.0.html)

## アーキテクチャ
<a name="access-amazon-neptune-database-from-amazon-eks-container-architecture"></a>

次の図は、Neptune データベースへのアクセスを可能にする、Amazon EKS クラスター内の Kubernetes ポッドと Neptune との間の接続を示しています。

![\[Kubernetes ノードのポッドを Amazon Neptune に接続します。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/2fcf9e00-1664-462a-825e-b0fdd962f478/images/86da67e5-340e-4b29-acc6-2da416ce57eb.png)


**自動化とスケール**

Amazon EKS [Horizontal Pod Autoscaler](https://docs.aws.amazon.com/eks/latest/userguide/horizontal-pod-autoscaler.html) を使用することでこのソリューションをスケールできます。

## ツール
<a name="access-amazon-neptune-database-from-amazon-eks-container-tools"></a>

**サービス**
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) を使用すると、独自の Kubernetes コントロールプレーンやノードをインストールまたは維持 AWS することなく、 で Kubernetes を実行できます。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) は、誰を認証し、誰に使用する権限を付与するかを制御することで、 AWS リソースへのアクセスを安全に管理するのに役立ちます。
+ [Amazon Neptune](https://docs.aws.amazon.com/neptune/latest/userguide/intro.html) は、複雑に接続されたデータセットを扱うアプリケーションを構築して実行するために使用できるマネージドグラフデータベースサービスです。

## ベストプラクティス
<a name="access-amazon-neptune-database-from-amazon-eks-container-best-practices"></a>

ベストプラクティスについては、「*Amazon EKS ベストプラクティスガイド*」の「[アイデンティティとアクセス管理](https://aws.github.io/aws-eks-best-practices/security/docs/iam/)」を参照してください。

## エピック
<a name="access-amazon-neptune-database-from-amazon-eks-container-epics"></a>

### 環境変数を設定する
<a name="set-environment-variables"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| クラスターコンテキストを検証する。 | Helm またはその他のコマンドラインツールを使用して Amazon EKS クラスターを操作するときは、事前にクラスターの詳細をカプセル化する環境変数を定義する必要があります。これらの変数は、正しいクラスターとリソースをターゲットにするために、後続のコマンドで使用されます。まず、正しいクラスターコンテキスト内で動作していることを確認します。これにより、後続のコマンドが目的の Kubernetes クラスターに送信されます。現在のコンテキストを確認するには、次のコマンドを実行します。<pre>kubectl config current-context</pre> | AWS 管理者、クラウド管理者 | 
| `CLUSTER_NAME` 変数を定義します。 | Amazon EKS クラスターの `CLUSTER_NAME` 環境変数を定義します。次のコマンドで、サンプル値をクラスター AWS リージョン に適した`us-west-2`値に置き換えます。サンプル値 `eks-workshop` を既存のクラスターの名前に置き換えます。<pre>export CLUSTER_NAME=$(aws eks describe-cluster --region us-west-2 --name eks-workshop --query "cluster.name" --output text)</pre> | AWS 管理者、クラウド管理者 | 
| 出力を検証します。 | 変数が正しく設定されていることを確認するには、次のコマンドを実行します。<pre>echo $CLUSTER_NAME</pre>このコマンドの出力が、前のステップで指定した入力と一致することを確認します。 | AWS 管理者、クラウド管理者 | 

### IAM ロールを作成し、Kubernetes サービスアカウントに関連付けます。
<a name="create-iam-role-and-associate-it-with-kubernetes"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
|  サービスアカウントを作成します。 | [サービスアカウントの IAM ロール](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html?sc_channel=el&sc_campaign=appswave&sc_content=eks-integrate-secrets-manager&sc_geo=mult&sc_country=mult&sc_outcome=acq)を使用して、Kubernetes サービスアカウントを IAM ロールにマッピングし、Amazon EKS で実行されるアプリケーションのきめ細かなアクセス許可管理を有効にします。[eksctl](https://eksctl.io/) を使用すると、IAM ロールを作成して、Amazon EKS クラスター内の特定の Kubernetes サービスアカウントに関連付けることができます。 AWS 管理ポリシー`NeptuneFullAccess`は、指定した Neptune クラスターへの書き込みおよび読み取りアクセスを許可します。これらのコマンドを実行するときは、先に、クラスターに [OIDC エンドポイント](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html?sc_channel=el&sc_campaign=appswave&sc_content=eks-integrate-secrets-manager&sc_geo=mult&sc_country=mult&sc_outcome=acq)が関連付けられている必要があります。という名前の管理 AWS ポリシーに関連付けるサービスアカウントを作成します`NeptuneFullAccess`。<pre>eksctl create iamserviceaccount --name eks-neptune-sa --namespace default --cluster $CLUSTER_NAME --attach-policy-arn arn:aws:iam::aws:policy/NeptuneFullAccess --approve --override-existing-serviceaccounts</pre>`eks-neptune-sa ` は作成するサービスアカウントの名前です。完了すると、このコマンドは次のレスポンスを表示します。<pre>2024-02-07 01:12:39 [ℹ] created serviceaccount "default/eks-neptune-sa"</pre> | AWS 管理者、クラウド管理者 | 
| アカウントが正しく設定されていることを確認します。 | `eks-neptune-sa` サービスアカウントがクラスターのデフォルトの名前空間で正しく設定されていることを確認します。<pre>kubectl get sa eks-neptune-sa -o yaml</pre>出力は次のようになります:<pre>apiVersion: v1<br />kind: ServiceAccount<br />metadata:<br />  annotations:<br />    eks.amazonaws.com/role-arn: arn:aws:iam::123456789123:role/eksctl-eks-workshop-addon-iamserviceaccount-d-Role1-Q35yKgdQOlmM<br />  creationTimestamp: "2024-02-07T01:12:39Z"<br />  labels:<br />    app.kubernetes.io/managed-by: eksctl<br />  name: eks-neptune-sa<br />  namespace: default<br />  resourceVersion: "5174750"<br />  uid: cd6ba2f7-a0f5-40e1-a6f4-4081e0042316</pre> | AWS 管理者、クラウド管理者 | 
| 接続を確認する。 | `pod-util` というサンプルポッドをデプロイし、Neptune との接続を確認します。<pre>apiVersion: v1<br />kind: Pod<br />metadata:<br />  name: pod-util<br />  namespace: default<br />spec:<br />  serviceAccountName: eks-neptune-sa<br />  containers:<br />  - name: pod-util<br />    image: public.ecr.aws/patrickc/troubleshoot-util<br />    command:<br />      - sleep<br />      - "3600"<br />    imagePullPolicy: IfNotPresent</pre><pre>kubectl apply -f pod-util.yaml</pre><pre>kubectl exec --stdin --tty pod-util -- /bin/bash<br />bash-5.1# curl -X POST -d '{"gremlin":"g.V().limit(1)"}' https://db-neptune-1.cluster-xxxxxxxxxxxx.us-west-2.neptune.amazonaws.com:8182/gremlin<br />{"requestId":"a4964f2d-12b1-4ed3-8a14-eff511431a0e","status":{"message":"","code":200,"attributes":{"@type":"g:Map","@value":[]}},"result":{"data":{"@type":"g:List","@value":[]},"meta":{"@type":"g:Map","@value":[]}}}<br />bash-5.1# exit<br />exit</pre> | AWS 管理者、クラウド管理者 | 

### 接続アクティビティを検証する
<a name="validate-connection-activity"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| IAM データベース認証を有効にする | デフォルトでは、Neptune DB クラスターの作成時、IAM データベース認証は無効になっています。 AWS マネジメントコンソールを使用して、IAM データベース認証を有効にするか、無効にすることができます AWS ドキュメントの手順に従って、[Neptune で IAM データベース認証を有効にします](https://docs.aws.amazon.com/neptune/latest/userguide/iam-auth-enable.html)。 | AWS 管理者、クラウド管理者 | 
| 接続を検証します。 | このステップでは、既に実行中のステータスにある `pod-util` コンテナを操作して、**awscurl**をインストールし、接続を検証します。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/access-amazon-neptune-database-from-amazon-eks-container.html) | AWS 管理者、クラウド管理者 | 

## トラブルシューティング
<a name="access-amazon-neptune-database-from-amazon-eks-container-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| Neptune データベースにアクセスできない。 | サービスアカウントにアタッチされている IAM ポリシーを確認します。実行する操作に必要なアクション (`neptune:Connec,neptune:DescribeDBInstances` など) が許可されていることを確認します。 | 

## 関連リソース
<a name="access-amazon-neptune-database-from-amazon-eks-container-resources"></a>
+ [Kubernetes サービスアカウント AWS を使用して へのアクセスを Kubernetes ワークロードに許可する](https://docs.aws.amazon.com/eks/latest/userguide/service-accounts.html) (Amazon EKS ドキュメント)
+ [サービスアカウントの IAM ロール](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) (Amazon EKS ドキュメント)
+ [新しい Neptune DB クラスターの作成](https://docs.aws.amazon.com/neptune/latest/userguide/get-started-create-cluster.html) (Amazon Neptune ドキュメント)