Configurar o acesso entre contas ao Amazon DynamoDB - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Configurar o acesso entre contas ao Amazon DynamoDB

Criado por Shashi Dalmia (AWS) e Jay Enjamoori (AWS)

Ambiente: produção

Tecnologias: DevOps; bancos de dados; segurança, identidade, conformidade

Serviços da AWS: Amazon DynamoDB; AWS Identity and Access Management; AWS Lambda

Resumo

Esse padrão explica as etapas para configurar o acesso entre contas ao Amazon DynamoDB. Os serviços da Amazon Web Services (AWS) podem acessar tabelas do DynamoDB que estão na mesma conta da AWS se o serviço tiver as permissões apropriadas do AWS Identity and Access Management (IAM) configuradas no banco de dados. No entanto, o acesso de uma conta diferente da AWS exige a configuração de permissões do IAM e o estabelecimento de uma relação de confiança entre as duas contas.

Esse padrão fornece etapas e códigos de exemplo para demonstrar como você pode configurar funções do AWS Lambda em uma conta para ler e gravar em uma tabela do DynamoDB em uma conta diferente.

Pré-requisitos e limitações

  • Duas contas da AWS ativas. Esse padrão se refere a essas contas como Conta A e Conta B.

  • A AWS Command Line Interface (AWS CLI) foi instalada e configurada para acessar a Conta A e criar o banco de dados do DynamoDB. As outras etapas desse padrão fornecem instruções para usar os consoles IAM, DynamoDB e Lambda. Se você planeja usar a AWS CLI em vez disso, configure-o para acessar as duas contas.

Arquitetura

No diagrama a seguir, o AWS Lambda, o Amazon EC2 e o DynamoDB estão todos na mesma conta. Nesse cenário, as funções do Lambda e as instâncias do Amazon Elastic Compute Cloud (Amazon EC2) podem acessar o DynamoDB.

Acessando o DynamoDB pela mesma conta

Se recursos em uma conta diferente da AWS tentarem acessar o DynamoDB, eles precisarão configurar o acesso entre contas e uma relação de confiança. Por exemplo, no diagrama a seguir, para permitir o acesso entre o DynamoDB na Conta A e a função do Lambda na Conta B, você deve criar uma relação de confiança entre as contas e conceder acesso adequado ao serviço Lambda e aos usuários, conforme descrito na seção Épicos. 

Acessando o DynamoDB de uma conta diferente

Ferramentas

Serviços da AWS

  • O Amazon DynamoDB é um serviço de banco de dados NoSQL totalmente gerenciado que fornece uma performance rápida e previsível com escalabilidade integrada.

  • O AWS Lambda é um serviço de computação que permite a execução do código sem provisionar ou gerenciar servidores O Lambda executa o código somente quando necessário e dimensiona automaticamente, desde algumas solicitações por dia até milhares por segundo. Você paga apenas pelo tempo de computação consumido. Não haverá cobranças quando o código não estiver em execução.

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

Código

Esse padrão inclui códigos de exemplo na seção Informações adicionais para ilustrar como você pode configurar uma função do Lambda na Conta B para gravar e ler a tabela do DynamoDB na Conta A. O código é fornecido somente para fins de ilustração e teste. Se você estiver implementando esse padrão em um ambiente de produção, use o código como referência e personalize-o para seu próprio ambiente.

Esse padrão ilustra o acesso entre contas com o Lambda e o DynamoDB. Você também pode usar as mesmas etapas para outros serviços da AWS, mas certifique-se de conceder e configurar as permissões apropriadas em ambas as contas. Por exemplo, se você quiser conceder acesso a um banco de dados do Amazon Relational Database Service (Amazon RDS) na Conta A, crie uma função para esse banco de dados e vincule-o a uma relação de confiança. Na Conta B, se você quiser usar o Amazon EC2 em vez do AWS Lambda, crie a respectiva política do IAM e, em seguida, anexe-as à instância do EC2.

Épicos

TarefaDescriçãoHabilidades necessárias

Crie uma tabela do DynamoDB na conta A.

Depois de configurar a AWS CLI para a Conta A, use o seguinte comando da AWS CLI para criar uma tabela do DynamoDB:

aws dynamodb create-table \ --table-name Table-Acccount-A \ --attribute-definitions \ AttributeName=category,AttributeType=S \ AttributeName=item,AttributeType=S \ --key-schema \ AttributeName=category,KeyType=HASH \ AttributeName=item,KeyType=RANGE \ --provisioned-throughput \ ReadCapacityUnits=5,WriteCapacityUnits=5

Para obter mais informações sobre criar tabelas, consulte a documentação do DynamoDB.

AWS DevOps
TarefaDescriçãoHabilidades necessárias

Crie uma função na Conta A.

Essa função será usada pela Conta B para obter permissões para acessar a Conta A. Para criar a função:

  1. Faça login na Conta A em https://<account-ID-for-Account-A>.signin.aws.amazon.com/console.

  2. Abra o console do IAM em https://console.aws.amazon.com/iam/.

  3. No painel de navegação do console, escolha Funções e, em seguida, clique em Criar função.

  4. Em Selecionar entidade confiável, escolha Conta da AWS e, na seção Uma conta da AWS, escolha Outra conta da AWS.

  5. Em ID da conta, insira o ID da conta B.

  6. Selecione Next: Permissions (Próximo: permissões).

  7. Na caixa Políticas de filtro insira DynamoDB.

  8. Na lista de políticas do DynamoDB, selecione DB. AmazonDynamo FullAccess

    Observação: esta política permite todas as ações no DynamoDB. Como uma prática recomendada de segurança, você sempre deve conceder somente as permissões necessárias. Para ver uma lista de outras políticas que você pode escolher, consulte Exemplos de políticas na documentação do IAM.

  9. Escolha Avançar: nomear, revisar e criar.

  10. Em Nome da função, insira um nome exclusivo para sua função (por exemplo, DynamoDB FullAccess - -For-Account-B) e adicione uma descrição opcional da função.

  11. Analise todas as seções e (de forma opcional) insira os metadados à função anexando etiquetas como pares de chave-valor.

  12. Selecione Criar função.

Para obter mais informações sobre a criação de funções, consulte a documentação de IAM.

AWS DevOps

Observe o ARN para a função na conta A.

  1. No painel de navegação do console do IAM, escolha Funções.

  2. Na caixa de pesquisa, insira DynamoDB FullAccess - -For-Account-B (ou o nome da função que você criou na história anterior) e escolha a função.

  3. Na página de resumo da função, copie o nome do recurso da Amazon (ARN). Você usará o ARN ao configurar o código Lambda na Conta B.

AWS DevOps
TarefaDescriçãoHabilidades necessárias

Criar uma política para acessar a Conta A.

  1. Faça login na Conta B em https://<account-ID-for-Account-B>.signin.aws.amazon.com/console.

  2. Abra o console do IAM em https://console.aws.amazon.com/iam/.

  3. No painel de navegação do console, selecione Políticas e Criar política.

  4. Selecione a guia JSON.

  5. Digite ou cole o seguinte documento JSON:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<Account-A-ID>:role/DynamoDB-FullAccess-For-Account-B" } ] }

    onde a propriedade Resource contém o ARN da função que você criou na história anterior na conta A.

  6. Escolha Próximo: etiquetas.

  7. (Opcional) Adicione metadados à política associando tags como pares de chave-valor.

  8. Selecione Next: Review (Próximo: revisar).

  9. Em Nome da política, insira um nome exclusivo para sua política (por exemplo, DynamoDB FullAccess - -Policy-in-Account-A) e adicione uma descrição opcional da política.

  10. Escolha Criar política.

Para obter mais informações sobre criação de políticas, consulte a Documentação do IAM.

AWS DevOps

Criar uma função com base nessa política.

Essa função é usada pelas funções do Lambda na Conta B para ler e gravar na tabela do DynamoDB na Conta A.

  1. Na conta B no painel de navegação do console do IAM, escolha Funções e, em seguida, Criar função.

  2. Em Select type of trusted entity (Selecionar tipo de entidade confiável), escolha AWS service (Serviço da AWS).

  3. Para caso de uso, escolha Lambda.

  4. Selecione Next: Permissions (Próximo: permissões).

  5. Na caixa Políticas de filtro insira DynamoDB.

  6. Na lista de políticas do DynamoDB, selecione DynamoDB FullAccess - -Policy-in-Account-A, que você criou na história anterior.

  7. Escolha Avançar: nomear, revisar e criar.

  8. Em Nome da função, insira um nome exclusivo para sua função (por exemplo, DynamoDB FullAccess - -in-Account-A) e adicione uma descrição opcional da função.

  9. Analise todas as seções e (de forma opcional) insira os metadados à função anexando etiquetas como pares de chave-valor.

  10. Selecione Criar função.

Agora você pode associar essa função às funções do Lambda no próximo épico.

Para obter mais informações sobre a criação de funções, consulte a documentação de IAM.

AWS DevOps
TarefaDescriçãoHabilidades necessárias

Crie uma função do Lambda para gravar dados no DynamoDB.

  1. Faça login na Conta B em https://<account-ID-for-Account-B>.signin.aws.amazon.com/console.

  2. Abra o console do Lambda em https://console.aws.amazon.com/lambda/.

  3. No painel de navegação do console, escolha Funções e, em seguida, clique em Criar função.

  4. Em Nome, insira lambda_write_function.

  5. Em Runtime, escolha Python 3.8 ou superior.

  6. Em Permissões, Alterar função de execução padrão e escolha Usar uma função existente.

  7. Em Função existente, escolha DynamoDB- FullAccess -in-account-A.

  8. Escolha a opção Criar função.

  9. Na guia Código, cole o código de exemplo da função de gravação Lambda fornecido na seção Informações adicionais desse padrão. Certifique-se de fornecer o ARN de função correto (do épico Criar uma função na Conta A) para o campo RoleArn e altere region_name para onde a tabela do DynamoDB foi criada na conta A (do épico Criar uma tabela do DynamoDB na Conta A). Não fazer isso resulta em um erro ResourceNotFoundException.

  10. Para implantar o código, escolha Implantar.

  11. Execute a função, selecione Testar. Isso solicita que você configure um evento de teste. Crie um novo evento com seu nome preferido, como MyTestEventForWrite, e salve a configuração.

  12. Execute a função novamente escolhendo Testar. Isso executa o código com o nome do evento que você forneceu.

  13. Verifique a saída da função. Ela deve ser semelhante à saída mostrada na seção Função de gravação do Lambda em Informações adicionais. Essa saída indica que a função acessou a tabela do DynamoDB na Conta A e conseguiu gravar dados nela.

Para obter mais informações sobre como criar funções do Lambda, consulte a documentação do Lambda.

AWS DevOps

Crie uma função do Lambda para ler dados do DynamoDB.

  1. No painel de navegação do console, escolha Funções e, em seguida, clique em Criar função.

  2. Em Nome, insira lambda_read_function

  3. Em Runtime, escolha Python 3.8 ou superior.

  4. Em Permissões, Alterar função de execução padrão e escolha Usar uma função existente.

  5. Em Função existente, escolha DynamoDB- FullAccess -in-account-A.

  6. Escolha a opção Criar função.

  7. Na guia Código, cole o códigos de exemplo da função de leitura do Lambda fornecido na seção Informações adicionais desse padrão. Certifique-se de fornecer o ARN de função correto (do épico Criar uma função na Conta A) para o campo RoleArn e altere region_name para onde a tabela do DynamoDB foi criada na conta A (do épico Criar uma tabela do DynamoDB na Conta A). Não fazer isso resulta em um erro ResourceNotFoundException.

  8. Para implantar o código, escolha Implantar.

  9. Execute a função, selecione Testar. Isso solicita que você configure um evento de teste. Crie um novo evento com seu nome preferido, como MyTestEventForRead, e salve a configuração.

  10. Execute a função novamente escolhendo Testar. Isso executa o código com o nome do evento que você forneceu.

  11. Verifique a saída da função. Deve ser semelhante à saída mostrada na seção Função do Lambda para leitura em Informações adicionais. Essa saída indica que a função acessou a tabela do DynamoDB na Conta A e conseguiu ler os dados que você adicionou à tabela.

Para obter mais informações sobre como criar funções do Lambda, consulte a documentação do Lambda.

AWS DevOps
TarefaDescriçãoHabilidades necessárias

Exclua os recursos que você criou.

Se você estiver executando esse padrão em um ambiente de teste ou prova de conceito (PoC), exclua os recursos que você criou para evitar custos.

  1. Na Conta B, exclua as duas funções do Lambda e outros recursos que você criou para se conectar ao DynamoDB.

  2. Na Conta A, exclua a tabela do DynamoDB que você criou.

  3. As políticas do IAM não custam nada, então você pode mantê-las como estão. No entanto, para fins de segurança, convém excluir as seguintes funções e políticas criadas para esse padrão:

    • Conta A: função DymamoDB-Full-Access-for-Account-A

    • Conta B: função do DynamoDB- FullAccess -in-Account-A

    • Conta B: política na conta A do DynamoDB FullAccess

AWS DevOps

Recursos relacionados

Mais informações

O código nesta seção é fornecido apenas para fins de ilustração e teste. Se você estiver implementando esse padrão em um ambiente de produção, use o código como referência e personalize-o para seu próprio ambiente.

Função de gravação Lambda

Código de exemplo

import boto3 from datetime import datetime sts_client = boto3.client('sts') sts_session = sts_client.assume_role(RoleArn='arn:aws:iam::<Account-A ID>:role/DynamoDB-FullAccess-For-Account-B', RoleSessionName='test-dynamodb-session') KEY_ID = sts_session['Credentials']['AccessKeyId'] ACCESS_KEY = sts_session['Credentials']['SecretAccessKey'] TOKEN = sts_session['Credentials']['SessionToken'] dynamodb_client = boto3.client('dynamodb', region_name='<DynamoDB-table-region-in-account-A', aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY, aws_session_token=TOKEN) def lambda_handler(event, context): now = datetime.now() date_time = now.strftime("%m/%d/%Y, %H:%M:%S") data = dynamodb_client.put_item(TableName='Table-Acccount-A', Item={"category": {"S": "Fruit"},"item": {"S": "Apple"},"time": {"S": date_time}}) return data

Exemplo de saída

Exemplo de saída da função de gravação Lambda

Função de leitura Lambda

Código de exemplo

import boto3 from datetime import datetime sts_client = boto3.client('sts') sts_session = sts_client.assume_role(RoleArn='arn:aws:iam::<Account-A ID>:role/DynamoDB-FullAccess-For-Account-B', RoleSessionName='test-dynamodb-session') KEY_ID = sts_session['Credentials']['AccessKeyId'] ACCESS_KEY = sts_session['Credentials']['SecretAccessKey'] TOKEN = sts_session['Credentials']['SessionToken'] dynamodb_client = boto3.client('dynamodb', region_name='<DynamoDB-table-region-in-account-A>', aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY, aws_session_token=TOKEN) def lambda_handler(event, context): response = dynamodb_client.get_item(TableName='Table-Acccount-A', Key={'category':{'S':'Fruit'}, 'item':{'S':'Apple'}}) return response

Exemplo de saída

Exemplo de saída da função de leitura Lambda