

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從 Amazon EKS 容器存取 Amazon Neptune 資料庫
<a name="access-amazon-neptune-database-from-amazon-eks-container"></a>

*Ramakrishnan Palaninathan，Amazon Web Services*

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

此模式會在全受管圖形資料庫 Amazon Neptune 與容器協同運作服務 Amazon Elastic Kubernetes Service (Amazon EKS) 之間建立連線，以存取 Neptune 資料庫。Neptune 資料庫叢集受限於虛擬私有雲端 (VPC) AWS。因此，存取 Neptune 需要仔細設定 VPC 才能啟用連線。

與 PostgreSQL 的 Amazon Relational Database Service (Amazon RDS) 不同，Neptune 不依賴一般資料庫存取憑證。而是使用 AWS Identity and Access Management (IAM) 角色進行身分驗證。因此，從 Amazon EKS 連線至 Neptune 需要設定具有存取 Neptune 必要許可的 IAM 角色。

此外，Neptune 端點只能在叢集所在的 VPC 內存取。這表示您必須設定網路設定，以促進 Amazon EKS 和 Neptune 之間的通訊。根據您的特定需求和聯網偏好設定，[有多種方法來設定 VPC](https://docs.aws.amazon.com/neptune/latest/userguide/get-started-vpc.html)，以啟用 Neptune 和 Amazon EKS 之間的無縫連線。每個方法都有不同的優點和考量，可讓您靈活地設計資料庫架構，以符合應用程式的需求。

## 先決條件和限制
<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 資料庫叢集 （請參閱[說明](https://docs.aws.amazon.com/neptune/latest/userguide/get-started-cfn-create.html))。請務必透過 VPC [對等互連、 或其他方法，在叢集的 VPC](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) 和 Amazon EKS 之間建立通訊。 [AWS Transit Gateway](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-getting-started.html)此外，請確定叢集的狀態為「可用」，且其對安全群組的連接埠 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)

## Architecture
<a name="access-amazon-neptune-database-from-amazon-eks-container-architecture"></a>

下圖顯示 Amazon EKS 叢集中的 Kubernetes Pod 與 Neptune 之間的連線，以提供 Neptune 資料庫的存取權。

![\[使用 Amazon Neptune 連接 Kubernetes 節點中的 Pod。\]](http://docs.aws.amazon.com/zh_tw/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 最佳實務指南*》中的 [Identity and Access Management](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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證叢集內容。 | 使用 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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 服務帳戶。 | 您可以使用[服務帳戶的 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，`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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟用 IAM 資料庫身分驗證。 | 根據預設，當您建立 Neptune 資料庫叢集時，IAM 資料庫身分驗證會停用。您可以使用 啟用或停用 IAM 資料庫身分驗證 AWS 管理主控台。請依照 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/zh_tw/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>
+ [AWS 使用 Kubernetes 服務帳戶授予 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 資料庫叢集 ](https://docs.aws.amazon.com/neptune/latest/userguide/get-started-create-cluster.html)(Amazon Neptune 文件）