配置对 Amazon DynamoDB 的跨账户访问 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

配置对 Amazon DynamoDB 的跨账户访问

由 Shashi Dalmia (AWS)、Esteban Serna Parra () 和 Imhoertha Ojior (AWS) 创作 AWS

环境:生产

技术:数据库;安全、身份、合规

AWS服务:亚马逊 DynamoDBAWS;Identity and Access Management;Lambda AWS

Summary

此模式说明了使用基于资源的策略配置对 Amazon DynamoDB 的跨账户访问权限的步骤。对于使用 DynamoDB 的工作负载,使用工作负载隔离策略来最大限度地减少安全威胁并满足合规性要求变得越来越普遍。实施工作负载隔离策略通常需要使用 () 基于身份的策略跨账户和跨区域访问 DynamoDB 资源。 AWS Identity and Access Management IAM这包括设置IAM权限并在两者之间建立信任关系 AWS 账户。

Dynamo@@ DB 基于资源的策略极大地简化了跨账户工作负载的安全状况。此模式提供了步骤和示例代码,用于演示如何将 AWS Lambda 函数合而为一, AWS 账户 以便将数据写入其他账户的 DynamoDB 数据库表。

先决条件和限制

先决条件

  • 两个活跃 AWS 账户。此模式将这些账户称为账户 A账户 B

  • AWS Command Line Interface (AWS CLI) 已安装配置为访问账户 A,以创建 DynamoDB 表。此模式中的其他步骤提供了使用IAM、DynamoDB 和 Lambda 控制台的说明。如果您打算 AWS CLI 改用,请将其配置为同时访问两个帐户。

限制

架构

下图显示了单账户架构。 AWS Lambda、亚马逊 Elastic Compute Cloud(亚马逊EC2)和 DynamoDB 都在同一个账户中。在这种情况下,Lambda 函数和亚马逊EC2实例可以访问 DynamoDB。要授予对 DynamoDB 表的访问权限,您可以在中创建基于身份的策略,也可以在 DynamoDB IAM 中创建基于资源的策略。

使用IAM权限访问同一账户中的 DynamoDB 表。

下图显示了多账户架构。如果一个中的资源 AWS 账户 需要访问其他账户中的 DynamoDB 表,则需要在 DynamoDB 中设置基于资源的策略来授予所需的访问权限。例如,在下图中,使用基于资源的策略向账户 B 中的 Lambda 函数授予对账户 A 中的 DynamoDB 表的访问权限。

使用基于资源的策略访问其他账户中的 DynamoDB 表。

此模式描述了 Lambda 和 DynamoDB 之间的跨账户访问。 AWS 服务 如果两个账户都配置了相应的权限,则可以对其他账户使用类似的步骤。例如,如果您想向 Lambda 函数提供对账户 A 中亚马逊简单存储服务 (Amazon S3) 存储桶的访问权限,则可以在 Amazon S3 中创建基于资源的策略,并将权限添加到账户 B 中的 Lambda 执行角色。

工具

AWS 服务

  • Amazon DynamoDB 是一项完全托管的SQL无数据库服务,可提供快速、可预测和可扩展的性能。

  • AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用AWS资源,从而帮助您安全地管理对资源的访问权限。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

代码

此模式包括 “其他信息” 部分中的示例代码,用于说明如何配置账户 B 中的 Lambda 函数以写入账户 A 中的 DynamoDB 表。该代码仅用于说明和测试目的。如果您在生产环境中实现此模式,请使用该代码作为参考,并针对自己的环境对其进行自定义。

最佳实践

操作说明

任务描述所需技能

在账户 B 中创建策略。

此IAM策略允许对账户 A 中的 DynamoDB 表PutItem执行操作。

  1. 在中登录账户 A AWS Management Console。

  2. 打开控制IAM台

  3. 在导航窗格中,选择 策略,然后选择 创建策略

  4. 在 “指定权限” 页面上,为策略编辑器选择JSON

  5. 输入以下策略。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A" } ] }
  6. 用您的值替换<Region><Account-A-ID>,然后选择 “下一步”。

  7. 策略名称中,输入策略的唯一名称,例如DynamoDB-PutItem-Policy

  8. (可选)添加策略描述。

  9. 选择创建策略

将军 AWS

在账户 B 中创建角色。

账户 B 中的 Lambda 函数使用此IAM角色访问账户 A 中的 DynamoDB 表

  1. 打开控制IAM台

  2. 在导航窗格中,选择 Roles(角色),然后选择 Create role(创建角色)

  3. 对于 Select trusted entity(选择受信任实体),选择 AWS 服务

  4. 用例部分,选择 Lambda

  5. 选择下一步: 权限

  6. 筛选器策略框中,输入 DynamoDB

  7. 在 DynamoDB 策略列表中,选择。DynamoDB-PutItem-Policy

  8. 清除 “筛选策略” 框,然后输入 Lambda

  9. 在 Lambda 策略列表中,选择。AWSLambdaExecute

  10. 选择下一步:名称、查看并创建

  11. 对于 Role name(角色名称),请为角色输入唯一名称,例如 DynamoDB-PutItemAccess

  12. (可选)添加角色描述。

  13. (可选)以键值对形式附加标签来向角色添加元数据。

  14. 选择 Create role(创建角色)。

有关创建角色的更多信息,请参阅IAM文档

将军 AWS

注意角色ARN。

  1. 打开控制IAM台

  2. 在导航窗格中,选择角色

  3. 在搜索框中输入DynamoDB-PutItemAccess,然后选择角色。

  4. 在该角色的摘要页面上,复制 Amazon 资源名称 (ARN)。您在设置 Lambda 函数ARN时使用。

将军 AWS
任务描述所需技能

创建 DynamoDB 表。

使用以下 AWS CLI 命令创建 DynamoDB 表。

aws dynamodb create-table \ --table-name Table-Account-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 \ --resource-policy \ '{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<Account-B-ID>:role/<Role-Name>" }, "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A" } ] }'

替换此代码示例中的以下内容:

  • <Account-B-ID>是账户 B 的 ID

  • <Role-Name>是您创建的IAM角色的名称,例如DynamoDB-PutItemAccess

  • <Region>是您创建 DynamoDB 表 AWS 区域 的地方。

  • <Account-A-ID>是账户 A 的 ID

注意:您可以使用--resource-policy标志在create-table语句中指定基于资源的策略配置。此策略指的是账户 A 中的 ARN DynamoDB 表的

有关创建表的更多信息,请参阅 DynamoDB 文档

将军 AWS
任务描述所需技能

创建一个 Lambda 函数,以向 DynamoDB 写入数据。

  1. 在中登录账户 B AWS Management Console。

  2. 打开 Lambda 控制台

  3. 在导航窗格中,选择函数,然后选择创建函数

  4. 对于名称,请输入 lambda_write_function

  5. 对于运行时系统,请选择 Python 3.8 或更高版本。

  6. 在 “更改默认执行角色” 下,选择 “使用现有角色”。

  7. 对于现有角色,请选择您创建的IAM角色,例如DynamoDB-PutItemAccess

  8. 选择 Create function (创建函数)

  9. 在 “代码” 选项卡中,粘贴此模式的 “其他信息” 部分中提供的示例代码。替换此代码示例中的以下内容:

    • <Account-A-ID>是账户 A 的 ID

    • <Region>是您创建 DynamoDB 表 AWS 区域 的地方。

  10. 选择部署

  11. 选择测试。这将提示您配置测试事件。使用您的首选名称(例如)创建新事件MyTestEventForWrite,然后保存配置。

  12. 再次选择 Test (测试)。这将使用您提供的事件名称运行 Lambda 函数。

  13. 检查函数输出。它应表明该函数访问了账户 A 中的 DynamoDB 表并能够向该表写入数据。

有关创建 Lambda 函数的更多信息,请参阅 Lambda 文档

将军 AWS
任务描述所需技能

删除资源。

为避免产生与在此模式中创建的资源相关的成本,请执行以下操作来删除这些资源:

  1. 在账户 B 中,删除您为连接 DynamoDB 而创建的 Lambda 函数。有关说明,请参阅 Lambda 文档

  2. 在账户 A 中,删除您创建的 DynamoDB 表。有关说明,请参阅 DynamoDB 文档

  3. 为了获得最佳安全实践,请在不再需要该IAM策略 (DynamoDB-PutItem-Policy) 时将其删除。有关更多信息,请参阅IAM文档

  4. 为了获得最佳安全实践,请在不再需要该IAM角色 (DynamoDB-PutItemAccess) 时将其删除。有关更多信息,请参阅IAM文档

将军 AWS

故障排除

问题解决方案

创建 Lambda 函数时,您会收到一个错误。ResourceNotFoundException

确认您已正确输入账户 A 的 AWS 区域 和 ID。这些是 DynamoDB 表的一部分。ARN

相关资源

其他信息

示例代码

import boto3 from datetime import datetime dynamodb_client = boto3.client('dynamodb') def lambda_handler(event, context): now = datetime.now().isoformat() data = dynamodb_client.put_item(TableName='arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A', Item={"category": {"S": "Fruit"},"item": {"S": "Apple"},"time": {"S": now}}) return data

注意:实例化 DynamoDB 客户端时,将ARN提供 DynamoDB 表的,而不是表名。这是必需的,这样 Lambda 函数才能在运行时连接到正确的 DynamoDB 表。