Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Configurar el acceso entre cuentas a Amazon DynamoDB
Creado por Shashi Dalmia (AWS) y Jay Enjamoori (AWS)
Entorno: producción | Tecnologías: bases de datos DevOps; seguridad, identidad y cumplimiento | Servicios de AWS: Amazon DynamoDB; AWS Identity and Access Management; AWS Lambda |
Resumen
Este patrón explica los pasos para configurar el acceso entre cuentas a Amazon DynamoDB. Los servicios de Amazon Web Services (AWS) pueden acceder a las tablas de DynamoDB que se encuentran en la misma cuenta de AWS si el servicio tiene los permisos de AWS Identity and Access Management (IAM) adecuados configurados en la base de datos. Sin embargo, el acceso desde una cuenta de AWS diferente requiere configurar los permisos de IAM y establecer una relación de confianza entre las dos cuentas.
Este patrón proporciona pasos y código de muestra para demostrar cómo puede configurar las funciones de Lambda de AWS en una cuenta para leer y escribir en una tabla DynamoDB de otra cuenta.
Requisitos previos y limitaciones
Dos cuentas de AWS activas. Este patrón hace referencia a estas cuentas como Cuenta A y Cuenta B.
Interfaz de la línea de comandos de AWS (AWS CLI) instalada y configurada para acceder a la cuenta A y crear la base de datos de DynamoDB. Los demás pasos de este patrón proporcionan instrucciones para usar las consolas IAM, DynamoDB y Lambda. Si planea usar AWS CLI en su lugar, configúrela para acceder a ambas cuentas.
Arquitectura
En el siguiente diagrama, AWS Lambda, Amazon EC2 y DynamoDB están todos en la misma cuenta. En este escenario, las funciones de Lambda y las instancias de Amazon Elastic Compute Cloud (Amazon EC2) pueden acceder a DynamoDB.
![Acceso a DynamoDB desde la misma cuenta](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/4cd75ed4-98d8-4398-abaf-20d982477ec4.png)
Si los recursos de una cuenta de AWS diferente intentan acceder a DynamoDB, es necesario configurar el acceso entre cuentas y una relación de confianza. Por ejemplo, en el siguiente diagrama, para habilitar el acceso entre DynamoDB en la cuenta A y la función de Lambda en la cuenta B, debe crear una relación de confianza entre las cuentas y conceder el acceso adecuado al servicio Lambda y a los usuarios, tal y como se describe en la sección Epics.
![Acceso a DynamoDB desde una cuenta diferente](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/28331655-18a6-4da1-a5ad-9831e040b7f8.png)
Herramientas
Servicios de AWS
Amazon DynamoDB es un servicio de base de datos NoSQL totalmente administrado que ofrece un rendimiento rápido y predecible, así como una perfecta escalabilidad.
AWS Lambda es un servicio informático que permite ejecutar código sin aprovisionar ni administrar servidores. Lambda ejecuta su código solo cuando es necesario y escala de manera automática, desde unas pocas solicitudes por día hasta miles por segundo. Solo pagará por el tiempo de computación que consuma, no se aplican cargos cuando el código no se está ejecutando.
AWS Identity and Access Management (IAM) le permite administrar de forma segura el acceso a los recursos de AWS mediante el control de quién está autenticado y autorizado a utilizarlos.
Código
Este patrón incluye código de muestra en la sección de Additional information (Información adicional) para ilustrar cómo se puede configurar una función de Lambda en la cuenta B para escribir y leer desde la tabla de DynamoDB de la cuenta A. El código se proporciona únicamente con fines ilustrativos y de prueba. Si va a implementar este patrón en un entorno de producción, utilice el código como referencia y personalícelo para su propio entorno.
Este patrón ilustra el acceso entre cuentas con Lambda y DynamoDB. También puede seguir los mismos pasos para otros servicios de AWS, pero asegúrese de conceder y configurar los permisos adecuados en ambas cuentas. Por ejemplo, si desea conceder acceso a una base de datos del Amazon Relational Database Service (Amazon RDS) en la cuenta A, cree un rol para esa base de datos y vincúlelo a una relación de confianza. En la cuenta B, si desea utilizar Amazon EC2 en lugar de AWS Lambda, cree la política y el rol de IAM correspondientes y, a continuación, adjúntelos a la instancia de EC2.
Epics
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Crear una tabla en DynamoDB en la cuenta A | Tras configurar la CLI de AWS para la cuenta A, utilice el siguiente comando de la CLI de AWS para crear una tabla de DynamoDB:
Para obtener más información acerca de la creación de tablas, consulte la documentación de DynamoDB. | AWS DevOps |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Crear un rol en la cuenta A | La cuenta B utilizará este rol para obtener permisos de acceso a la cuenta A. Para crear el rol:
Para obtener más información sobre los usuarios de IAM, consulte la documentación de IAM. | AWS DevOps |
Anote el ARN para el rol en la cuenta A. |
| AWS DevOps |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Crear una política de acceso a la cuenta A. |
Para obtener más información sobre la creación de políticas, consulte la documentación de IAM. | AWS DevOps |
Crear un rol basado en esta política. | Las funciones de Lambda de la cuenta B utilizan esta función para leer y escribir en la tabla de DynamoDB de la cuenta A.
Ahora puede asignar esta función a las funciones de Lambda en la próxima epopeya. Para obtener más información sobre los usuarios de IAM, consulte la documentación de IAM. | AWS DevOps |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Cree una función de Lambda para escribir datos en DynamoDB. |
Para obtener más información sobre la creación de funciones de Lambda, consulte la documentación de Lambda. | AWS DevOps |
Crear una función de Lambda para leer datos en DynamoDB. |
Para obtener más información sobre la creación de funciones de Lambda, consulte la documentación de Lambda. | AWS DevOps |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Elimine los recursos que creó. | Si ejecuta este patrón en un entorno de pruebas o de prueba de concepto (PoC), elimine los recursos que creó para evitar incurrir en costos.
| AWS DevOps |
Recursos relacionados
Introducción a la CLI de AWS (documentación de la CLI de AWS)
Configuración de la CLI de AWS (documentación de la CLI de AWS)
Introducción a DynamoDB (documentación de DynamoDB)
Introducción a Lambda (documentación de AWS Lambda)
Creación de un rol para delegar permisos a un usuario de IAM (documentación de IAM)
Creación de políticas de IAM (documentación de IAM)
Lógica de evaluación de políticas entre cuentas (documentación de IAM)
Referencia de los elementos de las políticas de JSON de IAM (documentación de IAM)
Información adicional
El código de esta sección se proporciona únicamente con fines ilustrativos y de prueba. Si va a implementar este patrón en un entorno de producción, utilice el código como referencia y personalícelo para su propio entorno.
La función de escritura Lambda
Código de muestra
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
Resultados de ejemplo:
![Ejemplo de salida de la función de escritura Lambda](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/880a9f04-7e38-46dd-8ce3-91e562259420.png)
Función de lectura Lambda
Código de muestra
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
Resultados de ejemplo:
![Ejemplo de salida de la función de lectura Lambda](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/38ff890e-1d4c-4b14-9aa2-a2da4304a73b.png)