아마존 컨테이너에서 아마존 Neptune 데이터베이스에 액세스 EKS - AWS 권장 가이드

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

아마존 컨테이너에서 아마존 Neptune 데이터베이스에 액세스 EKS

작성자: 라마크리슈난 팔라니나단 () AWS

환경: 프로덕션

기술: 컨테이너 및 마이크로서비스, 데이터베이스

워크로드: 기타 모든 워크로드

AWS서비스: 아마존EKS, 아마존 넵튠

요약

이 패턴은 완전관리형 그래프 데이터베이스인 Amazon Neptune과 컨테이너 오케스트레이션 서비스인 Amazon Elastic Kubernetes Service EKS (Amazon) 간에 연결을 설정하여 Neptune 데이터베이스에 액세스합니다. Neptune DB 클러스터는 켜진 가상 사설 클라우드 () 내에 제한됩니다. VPC AWS이러한 이유로 Neptune에 액세스하려면 연결이 가능하도록 신중하게 구성해야 VPC 합니다.

SQLPostgre용 Amazon 관계형 데이터베이스 서비스 (RDSAmazon) 와 달리 Neptune은 일반적인 데이터베이스 액세스 자격 증명을 사용하지 않습니다. 대신 인증에 AWS Identity and Access Management () IAM 역할을 사용합니다. 따라서 EKS Amazon에서 Neptune에 연결하려면 Neptune에 액세스하는 데 필요한 권한을 가진 역할을 IAM 설정해야 합니다.

또한 Neptune 엔드포인트는 클러스터가 있는 곳 내에서만 액세스할 수 있습니다VPC. 즉, EKS Amazon과 Neptune 간의 원활한 통신을 위해 네트워크 설정을 구성해야 합니다. 특정 요구 사항 및 네트워킹 기본 설정에 따라 Neptune과 Amazon 간의 원활한 연결이 VPC가능하도록 구성하는 다양한 접근 방식이 있습니다. EKS 각 방법은 뚜렷한 장점과 고려 사항을 제공하므로 애플리케이션 요구 사항에 맞게 데이터베이스 아키텍처를 유연하게 설계할 수 있습니다.

사전 조건 및 제한 사항

사전 조건

  • kubectl의 최신 버전을 설치합니다 (지침 참조). 버전을 확인하려면 다음을 실행하세요.

    kubectl version --short
  • eksctl의 최신 버전을 설치합니다 (지침 참조). 버전을 확인하려면 다음을 실행하세요.

    eksctl info
  • AWS Command Line Interface (AWS CLI) 버전 2의 최신 버전을 설치합니다 (지침 참조). 버전을 확인하려면 다음을 실행하세요.

    aws --version
  • Neptune DB 클러스터를 생성합니다 (지침 참조). VPC피어링 또는 다른 방법을 EKS 통해 VPC 클러스터와 Amazon 간에 통신을 설정해야 합니다. AWS Transit Gateway 또한 클러스터 상태가 “사용 가능”이고 포트 8182에 보안 그룹을 위한 인바운드 규칙이 있는지 확인하십시오.

  • 기존 아마존 EKS 클러스터에서 IAM OpenID Connect (OIDC) 공급자를 구성합니다 (지침 참조).

제품 버전

아키텍처

다음 다이어그램은 Neptune 데이터베이스에 대한 액세스를 제공하기 위한 Amazon 클러스터의 Kubernetes EKS 파드와 Neptune 간의 연결을 보여줍니다.

쿠버네티스 노드의 파드를 Amazon Neptune과 연결합니다.

자동화 및 규모 조정

Amazon EKS Horizontal 포드 오토스케일러를 사용하여 이 솔루션을 확장할 수 있습니다.

도구

서비스

모범 사례

모범 사례는 Amazon EKS 모범 사례 안내서의 Identity 및 Access Management를 참조하십시오.

에픽

작업설명필요한 기술

클러스터 컨텍스트를 확인하십시오.

Helm 또는 기타 명령줄 도구를 사용하여 Amazon EKS 클러스터와 상호 작용하기 전에 클러스터의 세부 정보를 캡슐화하는 환경 변수를 정의해야 합니다. 이러한 변수는 올바른 클러스터와 리소스를 대상으로 하는지 확인하기 위해 후속 명령에서 사용됩니다.

먼저, 올바른 클러스터 컨텍스트 내에서 작업하고 있는지 확인하십시오. 이렇게 하면 모든 후속 명령이 의도한 Kubernetes 클러스터로 전송됩니다. 현재 컨텍스트를 확인하려면 다음 명령을 실행합니다.

kubectl config current-context
AWS관리자, 클라우드 관리자

CLUSTER_NAME변수를 정의합니다.

Amazon EKS 클러스터의 CLUSTER_NAME 환경 변수를 정의합니다. 다음 명령에서 샘플 값을 us-west-2 클러스터에 AWS 리전 맞는 값으로 바꿉니다. 샘플 값을 eks-workshop 기존 클러스터 이름으로 교체합니다.

export CLUSTER_NAME=$(aws eks describe-cluster --region us-west-2 --name eks-workshop --query "cluster.name" --output text)
AWS관리자, 클라우드 관리자

출력을 검증합니다.

변수가 제대로 설정되었는지 확인하려면 다음 명령을 실행합니다.

echo $CLUSTER_NAME

이 명령의 출력이 이전 단계에서 지정한 입력과 일치하는지 확인합니다.

AWS관리자, 클라우드 관리자
작업설명필요한 기술

서비스 계정을 생성합니다.

서비스 계정의 IAM 역할을 사용하여 Kubernetes 서비스 계정을 IAM 역할에 매핑하여 Amazon에서 실행되는 애플리케이션에 대한 권한을 세밀하게 관리할 수 있습니다. EKS eksctl을 사용하여 Amazon 클러스터 내의 특정 Kubernetes 서비스 계정에 IAM 역할을 생성하고 연결할 수 있습니다. EKS AWS 관리형 정책은 지정된 Neptune 클러스터에 대한 쓰기 및 읽기 액세스를 NeptuneFullAccess 허용합니다.

중요: 이 명령을 실행하려면 먼저 클러스터와 연결된 OIDC엔드포인트가 있어야 합니다.

라는 AWS 관리형 정책에 연결할 서비스 계정을 만드십시오NeptuneFullAccess.

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

생성하려는 서비스 계정의 eks-neptune-sa 이름은 어디에 있습니까?

완료 시 이 명령은 다음과 같은 응답을 표시합니다.

2024-02-07 01:12:39 [ℹ] created serviceaccount "default/eks-neptune-sa"
AWS관리자, 클라우드 관리자

계정이 제대로 설정되었는지 확인하세요.

클러스터의 기본 네임스페이스에 eks-neptune-sa 서비스 계정이 올바르게 설정되어 있는지 확인하세요.

kubectl get sa eks-neptune-sa -o yaml

출력은 다음과 같아야 합니다.

apiVersion: v1 kind: ServiceAccount metadata: annotations: eks.amazonaws.com/role-arn: arn:aws:iam::123456789123:role/eksctl-eks-workshop-addon-iamserviceaccount-d-Role1-Q35yKgdQOlmM creationTimestamp: "2024-02-07T01:12:39Z" labels: app.kubernetes.io/managed-by: eksctl name: eks-neptune-sa namespace: default resourceVersion: "5174750" uid: cd6ba2f7-a0f5-40e1-a6f4-4081e0042316
AWS관리자, 클라우드 관리자

연결 상태를 확인하세요.

라는 샘플 포드를 pod-util 배포하고 Neptune과의 연결을 확인합니다.

apiVersion: v1 kind: Pod metadata: name: pod-util namespace: default spec: serviceAccountName: eks-neptune-sa containers: - name: pod-util image: public.ecr.aws/patrickc/troubleshoot-util command: - sleep - "3600" imagePullPolicy: IfNotPresent
kubectl apply -f pod-util.yaml
kubectl exec --stdin --tty pod-util -- /bin/bash 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 {"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":[]}}} bash-5.1# exit exit
AWS관리자, 클라우드 관리자
작업설명필요한 기술

IAM데이터베이스 인증을 활성화합니다.

기본적으로 Neptune DB 클러스터를 생성하면 IAM 데이터베이스 인증이 비활성화됩니다. 를 사용하여 IAM 데이터베이스 인증을 활성화하거나 비활성화할 수 있습니다. AWS Management Console

AWS 설명서의 단계에 따라 Neptune에서 IAM 데이터베이스 인증을 활성화하십시오.

AWS관리자, 클라우드 관리자

연결 확인.

이 단계에서는 이미 실행 상태인 pod-util 컨테이너와 상호 작용하여 awscurl을 설치하고 연결을 확인합니다.

  1. 다음 명령을 실행하여 포드를 찾습니다.

    kubectl get pods

    출력은 다음과 같아야 합니다.

    NAME READY STATUS RESTARTS AGE pod-util 1/1 Running 0 50m
  2. 다음 명령을 실행하여 awscurl을 설치합니다.

    kubectl exec --stdin --tty pod-util -- /bin/bash bash-5.1#pip3 install awscurl Installing collected packages: idna, configparser, configargparse, charset-normalizer, certifi, requests, awscurl Successfully installed awscurl-0.32 certifi-2024.2.2 charset-normalizer-3.3.2 configargparse-1.7 configparser-6.0.0 idna-3.6 requests-2.31.0 bash-5.1# awscurl https://db-neptune-1.cluster-xxxxxxxxxxxx.us-west-2.neptune.amazonaws.com:8182/status --region us-west-2 --service neptune-db {"status":"healthy","startTime":"Thu Feb 08 01:22:14 UTC 2024","dbEngineVersion":"1.3.0.0.R1","role":"writer","dfeQueryEngine":"viaQueryHint","gremlin":{"version":"tinkerpop-3.6.4"},"sparql":{"version":"sparql-1.1"},"opencypher":{"version":"Neptune-9.0.20190305-1.0"},"labMode":{"ObjectIndex":"disabled","ReadWriteConflictDetection":"enabled"},"features":{"SlowQueryLogs":"disabled","ResultCache":{"status":"disabled"},"IAMAuthentication":"enabled","Streams":"disabled","AuditLog":"disabled"},"settings":{"clusterQueryTimeoutInMs":"120000","SlowQueryLogsThreshold":"5000"}}
AWS관리자, 클라우드 관리자

문제 해결

문제Solution

Neptune 데이터베이스에 액세스할 수 없습니다.

서비스 IAM 계정에 연결된 정책을 검토하세요. 실행하려는 작업에 필요한 조치 (예:neptune:Connec,neptune:DescribeDBInstances) 를 허용하는지 확인하세요.

관련 리소스