Configurar el acceso entre cuentas a Amazon DynamoDB - Recomendaciones de AWS

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

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

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

TareaDescripciónHabilidades 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:

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 obtener más información acerca de la creación de tablas, consulte la documentación de DynamoDB.

AWS DevOps
TareaDescripciónHabilidades 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:

  1. Inicie sesión en la cuenta A en https://<account-ID-for-Account-A>.signin.aws.amazon.com/console.

  2. Abra la consola de IAM en https://console.aws.amazon.com/iam/.

  3. En el panel de navegación de la consola, elija Roles y, a continuación, seleccione Create role (Crear rol).

  4. En Select trusted entity (Seleccione una entidad de confianza), elija AWS account (cuenta de AWS) y, en la sección Una cuenta de AWS, elija Another AWS account (Otra cuenta de AWS).

  5. En Account ID (ID de cuenta), escriba el ID de la cuenta B.

  6. Elija Next: Permissions (Siguiente: Permisos).

  7. En el cuadro Filter policies (Políticas de filtro), escriba DynamoDB.

  8. En la lista de políticas de DynamoDB, seleccione DB. AmazonDynamo FullAccess

    Nota: Esta política permite todas las acciones en DynamoDB. Como práctica recomendada de seguridad, siempre debe conceder únicamente los permisos necesarios. Para ver una lista de otras políticas que puede elegir en su lugar, consulte los Ejemplos de políticas en la documentación de IAM.

  9. Seleccione Siguiente: asigne un nombre, revise y cree.

  10. En Nombre del rol, introduzca un nombre exclusivo para el rol (por ejemplo, DynamoDB FullAccess - -For-Account-B) y añada una descripción del rol opcional.

  11. Revise todas las secciones y (opcionalmente) añada metadatos al rol asociando etiquetas como pares clave-valor.

  12. Elija Crear 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.

  1. En el panel de navegación de la consola de IAM, elija Roles.

  2. En el cuadro de búsqueda, escriba DynamoDB FullAccess - -For-Account-B (o el nombre del rol que creó en la historia anterior) y elija el rol.

  3. En la página de resumen del rol, copie el nombre de recurso de Amazon (ARN). Utilizará el ARN al configurar el código Lambda en la cuenta B.

AWS DevOps
TareaDescripciónHabilidades requeridas

Crear una política de acceso a la cuenta A.

  1. Inicie sesión en la cuenta B en https://<account-ID-for-Account-B>.signin.aws.amazon.com/console.

  2. Abra la consola de IAM en https://console.aws.amazon.com/iam/.

  3. En el panel de navegación de la consola, elija Policies (Políticas) y, a continuación, elija Create policy (Crear política).

  4. Seleccione la pestaña JSON.

  5. Escriba o pegue lo siguiente en el 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" } ] }

    donde la propiedad Resource contiene el ARN del rol que creaste en la historia anterior en la cuenta A.

  6. Elija Siguiente: etiquetas.

  7. (Opcional) Agregar metadatos a la política al adjuntar las etiquetas como pares de clave-valor.

  8. Elija Siguiente: Revisar.

  9. En Nombre de la política, introduzca un nombre único para la política (por ejemplo, DynamoDB FullAccess - -Policy-in-Account-A) y añada una descripción de la política opcional.

  10. Elija Crear política.

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.

  1. En la cuenta B, En el panel de navegación de la consola de IAM, seleccione Roles y, a continuación, seleccione Create role (Crear rol).

  2. En Select type of trusted entity (Seleccionar tipo de entidad de confianza), elija AWS service (Servicio de AWS).

  3. En caso de uso, elija Lambda.

  4. Elija Next: Permissions (Siguiente: Permisos).

  5. En el cuadro Filter policies (Políticas de filtro), escriba DynamoDB.

  6. En la lista de políticas de DynamoDB, seleccione DynamoDB FullAccess - -Policy-in-Account-A, que creó en la historia anterior.

  7. Seleccione Siguiente: asigne un nombre, revise y cree.

  8. En Nombre del rol, introduzca un nombre exclusivo para el rol (por ejemplo, DynamoDB FullAccess - -in-Account-A) y añada una descripción del rol opcional.

  9. Revise todas las secciones y (opcionalmente) añada metadatos al rol asociando etiquetas como pares clave-valor.

  10. Elija Crear rol.

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
TareaDescripciónHabilidades requeridas

Cree una función de Lambda para escribir datos en DynamoDB.

  1. Inicie sesión en la cuenta B en https://<account-ID-for-Account-B>.signin.aws.amazon.com/console.

  2. Abra la consola en https://console.aws.amazon.com/lambda/.

  3. En el panel de navegación de la consola de IAM, seleccione Funciones y, a continuación, seleccione Create function (Crear función).

  4. En Nombre, escriba lambda_write_function.

  5. En Runtime (Tiempo de ejecución), elija Python 3.8 o una versión más reciente.

  6. En Permissions (Permisos), Change default execution role (Cambiar rol de ejecución predeterminado), elija Use an existing role (Utilizar un rol existente).

  7. En Función existente, elija DynamoDB- FullAccess -in-Account-A.

  8. Elija Crear función.

  9. En la pestaña Código, pegue el código de ejemplo de la función de escritura Lambda que se proporciona en la sección Información adicional en este patrón. Asegúrese de proporcionar el ARN de rol correcto (de la epopeya Crear un rol en la cuenta A) para el campo RoleArn y cambie region_name al lugar donde se crea la tabla de DynamoDB en la cuenta A (de la epopeya Crear una tabla de DynamoDB en la cuenta A). Si no lo hace, se producirá un error ResourceNotFoundException.

  10. Para implementar el código, seleccione Implementar.

  11. Para ejecutar la función, elija Test (Prueba). Esto le pide que configure un evento de prueba. Cree un nuevo evento con el nombre que prefiera, por ejemplo, y guarde la configuración MyTestEventForWrite.

  12. Para ejecutar la función nuevamente, elija Test (Prueba). Esto ejecuta el código con el nombre del evento que ha proporcionado.

  13. Compruebe el resultado de la función. Debe ser similar al resultado que se muestra en la sección sobre la función de escritura de Lambda de Información adicional. Este resultado indica que la función accedió a la tabla de DynamoDB en la cuenta A y pudo escribir datos en ella.

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.

  1. En el panel de navegación de la consola de Lambda, elija Functions (Funciones) y, a continuación, elija Create function (Crear una función).

  2. En Nombre, escriba lambda_read_function.

  3. En Runtime (Tiempo de ejecución), elija Python 3.8 o una versión más reciente.

  4. En Permissions (Permisos), Change default execution role (Cambiar rol de ejecución predeterminado), elija Use an existing role (Utilizar un rol existente).

  5. En Función existente, elija DynamoDB- FullAccess -in-Account-A.

  6. Elija Crear función.

  7. En la pestaña Code (Código), pegue el código de ejemplo de la función de lectura de Lambda que se proporciona en la sección Additional information (Información adicional) en este patrón. Asegúrese de proporcionar el ARN de rol correcto (de la epopeya Crear un rol en la cuenta A) para el campo RoleArn y cambie region_name al lugar donde se crea la tabla de DynamoDB en la cuenta A (de la epopeya Crear una tabla de DynamoDB en la cuenta A). Si no lo hace, se producirá un error ResourceNotFoundException.

  8. Para implementar el código, seleccione Implementar.

  9. Para ejecutar la función, elija Test (Prueba). Esto le pide que configure un evento de prueba. Cree un nuevo evento con el nombre que prefiera, por ejemplo, y guarde la configuración MyTestEventForRead.

  10. Para ejecutar la función nuevamente, elija Test (Prueba). Esto ejecuta el código con el nombre del evento que ha proporcionado.

  11. Compruebe el resultado de la función. Debe ser similar al resultado que se muestra en la sección sobre la función de lectura de Lambda de Información adicional. Este resultado indica que la función accedió a la tabla de DynamoDB en la cuenta A y pudo escribir leer que se añadieron a la tabla.

Para obtener más información sobre la creación de funciones de Lambda, consulte la documentación de Lambda.

AWS DevOps
TareaDescripciónHabilidades 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.

  1. En la cuenta B, elimine las dos funciones de Lambda y otros recursos que haya creado para conectarse a DynamoDB.

  2. En la cuenta A, elimine la tabla de DynamoDB que creó.

  3. Las políticas de IAM no tienen ningún coste, por lo que puede mantenerlas como están. Sin embargo, por motivos de seguridad, le recomendamos que elimine las funciones y políticas siguientes que creó para este patrón:

    • Cuenta A: rol de DymamoDB-Full-Access-for-Account-A

    • Cuenta B: función en la cuenta A de DynamoDB FullAccess

    • Cuenta B: Política de DynamoDB en la cuenta A FullAccess

AWS DevOps

Recursos relacionados

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

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