Acesso a um banco de dados do Amazon Neptune usando um contêiner do Amazon EKS - Recomendações da AWS

Acesso a um banco de dados do Amazon Neptune usando um contêiner do Amazon EKS

Ramakrishnan Palaninathan, Amazon Web Services

Resumo

Este padrão estabelece uma conexão entre o Amazon Neptune, um banco de dados de grafos totalmente gerenciado, e o Amazon Elastic Kubernetes Service (Amazon EKS), um serviço de orquestração de contêineres, para acessar um banco de dados do Neptune. Os clusters de banco de dados do Neptune ficam restritos a uma nuvem privada virtual (VPC) na AWS. Por esse motivo, o acesso ao Neptune requer uma configuração cuidadosa da VPC para habilitar a conectividade.

Ao contrário do Amazon Relational Database Service (Amazon RDS) para PostgreSQL, o Neptune não depende de credenciais típicas de acesso a banco de dados. Em vez disso, ele usa perfis do AWS Identity and Access Management (IAM) para autenticação. Assim, para estabelecer conexão com o Neptune usando o Amazon EKS, é preciso configurar um perfil do IAM que tenha as permissões necessárias de acesso.

Além disso, os endpoints do Neptune são acessíveis apenas dentro da VPC em que o cluster está localizado. Isso significa que você precisa definir as configurações de rede para possibilitar a comunicação entre o Amazon EKS e o Neptune. Conforme seus requisitos específicos e preferências de rede, é possível adotar diversas abordagens para configurar a VPC e habilitar a conectividade entre o Neptune e o Amazon EKS de forma eficiente e sem interrupções. Cada método oferece vantagens e considerações distintas, proporcionando flexibilidade no planejamento da arquitetura do banco de dados para atender às necessidades da sua aplicação.

Pré-requisitos e limitações

Pré-requisitos

  • Instale a versão mais recente do kubectl (consulte as instruções). Para conferir qual versão está instalada, execute:

    kubectl version --short
  • Instale a versão mais recente do eksctl (consulte as instruções). Para conferir qual versão está instalada, execute:

    eksctl info
  • Instale a versão mais recente da AWS Command Line Interface (AWS CLI) versão 2 (consulte as instruções). Para conferir qual versão está instalada, execute:

    aws --version
  • Crie um cluster de banco de dados do Neptune (consulte as instruções). Certifique-se de estabelecer a comunicação entre a VPC do cluster e o Amazon EKS por meio de emparelhamento da VPC, uso do AWS Transit Gateway ou outro método. Além disso, verifique se o status do cluster está como “disponível” e se há uma regra de entrada na porta 8182 para o grupo de segurança.

  • Configure um provedor de OpenID Connect (OIDC) do IAM em um cluster do Amazon EKS existente (consulte as instruções).

Versões do produto

Arquitetura

O diagrama apresentado a seguir ilustra a conexão entre os pods do Kubernetes em um cluster do Amazon EKS e o Neptune, para fornecer acesso a um banco de dados do Neptune.

Demonstração da conexão entre pods em um nó do Kubernetes com o Amazon Neptune.

Automação e escala

É possível usar o Horizontal Pod Autoscaler do Amazon EKS para escalar esta solução.

Ferramentas

Serviços

  • O Amazon Elastic Kubernetes Service (Amazon EKS) ajuda você a executar o Kubernetes na AWSsem precisar instalar e manter seus próprios nós ou painel de controle do Kubernetes.

  • OAWS Identity and Access Management (IAM) ajuda você a gerenciar com segurança o acesso aos seus recursos AWS controlando quem está autenticado e autorizado a usá-los.

  • O Amazon Neptune é um serviço de banco de dados de grafos que facilita a criação e a execução de aplicações capazes de trabalhar com conjuntos de dados fortemente conectados.

Práticas recomendadas

Para conhecer as práticas recomendadas, consulte a seção Identity and Access Management nos Guias de práticas recomendadas do Amazon EKS.

Épicos

TarefaDescriçãoHabilidades necessárias

Verifique o contexto do cluster.

Antes de interagir com o cluster do Amazon EKS usando o Helm ou outras ferramentas de linha de comando, você deve definir variáveis de ambiente que contenham os detalhes do cluster. As variáveis definidas serão usadas nos próximos comandos para garantir que todas as ações sejam direcionadas ao cluster e aos recursos corretos.

Primeiro, confirme que você está operando no contexto correto do cluster. Dessa forma, você garante que quaisquer comandos executados a seguir sejam aplicados ao cluster do Kubernetes correto. Para verificar o contexto atual, execute o comando apresentado a seguir.

kubectl config current-context
Administrador da AWS, administrador de nuvem

Defina a variável CLUSTER_NAME.

Defina a variável de ambiente CLUSTER_NAME para o cluster do Amazon EKS. No comando apresentado a seguir, substitua o valor de amostra us-west-2 pela Região da AWS correta do seu cluster. Substitua o valor de amostra eks-workshop pelo nome do seu cluster existente.

export CLUSTER_NAME=$(aws eks describe-cluster --region us-west-2 --name eks-workshop --query "cluster.name" --output text)
Administrador da AWS, administrador de nuvem

Valide a saída.

Para validar se as variáveis foram definidas corretamente, execute o comando apresentado a seguir.

echo $CLUSTER_NAME

Verifique se a saída deste comando corresponde à entrada que você especificou na etapa anterior.

Administrador da AWS, administrador de nuvem
TarefaDescriçãoHabilidades necessárias

Criar uma conta de serviço do .

Com os perfis do IAM para contas de serviço, você pode mapear as contas de serviço do Kubernetes para perfis do IAM a fim de possibilitar um gerenciamento de permissões detalhado para as aplicações executadas no Amazon EKS. É possível usar a ferramenta eksctl para criar e associar um perfil do IAM a uma conta de serviço específica do Kubernetes dentro do seu cluster do Amazon EKS. A política NeptuneFullAccess, gerenciada pela AWS, permite acesso de leitura e gravação ao cluster do Neptune especificado.

Importante

É necessário que o cluster tenha um endpoint de OIDC associado antes de executar estes comandos.

Crie uma conta de serviço que você deseja associar a uma política gerenciada pela AWS chamada 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

em que eks-neptune-sa consiste no nome da conta de serviço que você deseja criar.

Quando o comando for concluído, ele mostrará a seguinte resposta:

2024-02-07 01:12:39 [ℹ] created serviceaccount "default/eks-neptune-sa"
Administrador da AWS, administrador de nuvem

Verifique se a conta foi configurada corretamente.

Certifique-se de que a conta de serviço eks-neptune-sa foi configurada corretamente no namespace padrão do seu cluster.

kubectl get sa eks-neptune-sa -o yaml

O resultado deve ser semelhante ao seguinte:

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
Administrador da AWS, administrador de nuvem

Verifique a conectividade.

Implante um pod de amostra chamado pod-util e verifique a conectividade com o 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
Administrador da AWS, administrador de nuvem
TarefaDescriçãoHabilidades necessárias

Habilite a autenticação do banco de dados do IAM.

Por padrão, a autenticação de banco de dados do IAM está desabilitada quando você cria um cluster de banco de dados do Neptune. É possível habilitar ou desabilitar a autenticação do banco de dados do IAM usando o Console de gerenciamento da AWS

Siga as etapas apresentadas na documentação da AWS para habilitar a autenticação do banco de dados do IAM no Neptune.

Administrador da AWS, administrador de nuvem

Verifique as conexões.

Nesta etapa, você interage com o contêiner pod-util, que já está em execução, para instalar a ferramenta awscurl e verificar a conexão.

  1. Execute o comando apresentado a seguir para localizar o pod.

    kubectl get pods

    O resultado deve ser semelhante ao seguinte:

    NAME READY STATUS RESTARTS AGE pod-util 1/1 Running 0 50m
  2. Execute o comando apresentado a seguir para instalar 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"}}
Administrador da AWS, administrador de nuvem

Solução de problemas

ProblemaSolução

Não é possível acessar o banco de dados do Neptune.

Analise a política do IAM anexada à conta de serviço. Certifique-se de que as ações necessárias (por exemplo, neptune:Connec,neptune:DescribeDBInstances) são permitidas para as operações que você deseja executar.

Recursos relacionados