

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 从 Amazon EKS 容器访问 Amazon Neptune 数据库
<a name="access-amazon-neptune-database-from-amazon-eks-container"></a>

*Ramakrishnan Palaninathan，Amazon Web Services*

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

这种模式在完全托管的图形数据库 Amazon Neptune 与容器编排服务 Amazon Elastic Kubernetes Service（Amazon EKS）之间建立连接，用于访问 Neptune 数据库。Neptune 数据库集群被限制在 AWS上的虚拟私有云（VPC）中。因此，访问 Neptune 需要仔细配置 VPC 以启用连接。

与 Amazon Relational Database Service（Amazon RDS）for PostgreSQL 不同，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 对等](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>

下图显示了 Amazon EKS 集群中的 Kubernetes 容器组（pod）与 Neptune 之间的连接，通过该连接可访问 Neptune 数据库。

![\[连接 Kubernetes 节点中的容器组（pod）与 Amazon Neptune。\]](http://docs.aws.amazon.com/zh_cn/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>

**服务**
+ [亚马逊 Elastic Kubernetes Service（亚马逊](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) EKS）可帮助你在上面运行 AWS Kubernetes，而无需安装或维护自己的 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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证集群上下文。 | 在使用 Helm 或其他命令行工具与 Amazon EKS 集群进行交互之前，必须定义用于封装集群详细信息的环境变量。这些变量将在后续命令中使用，以确保它们针对正确的集群和资源。首先，确认您在正确的集群环境中运行。这样可以确保将任何后续命令发送到预期的 Kubernetes 集群。要验证当前上下文，请运行以下命令。<pre>kubectl config current-context</pre> | AWS 管理员、云管理员 | 
| 定义 `CLUSTER_NAME` 变量。 | 定义 Amazon EKS 集群的 `CLUSTER_NAME` 环境变量。在以下命令中，将示例值`us-west-2`替换 AWS 区域 为适用于您的集群的正确值。将示例值 `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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建服务账户。 | 您可使用[服务账户的 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` 的示例容器组（pod）并检查与 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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启用 IAM 数据库身份验证。 | 默认情况下，创建 Neptune 数据库集群时禁用 IAM 数据库身份验证。您可以使用 AWS 管理控制台启用或禁用 IAM 数据库身份验证。按照 AWS 文档中的步骤在 Nept [une 中启用 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_cn/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 工作负载访问权限（亚马逊 EK](https://docs.aws.amazon.com/eks/latest/userguide/service-accounts.html) S 文档）
+ [服务账户的 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 文档）