DynamoDB跨账户跨区域访问管理

Sab*_*hni 4 amazon-dynamodb amazon-iam aws-lambda aws-sts

我遇到这种情况:区域 X 帐户 A中的 dynamoDB 表和区域 Y 帐户 B中的 Lambda 函数。我想使用 lambda 函数写入 dynamoDB 表。到目前为止我做了什么:

  1. 在账户 B 中添加角色以及使用该 dynamoDB 表的策略
  2. 向账户 B 所承担的角色添加信任策略
  3. 假设账户 A 中的角色,然后将此角色附加到 lambda 函数。

但仍然不起作用,这让我很困惑AccessDeniedException。我在这里遗漏了一些东西吗?或者在这种情况下甚至可以做到这一点?

Sab*_*hni 7

以下是解决该问题所需的步骤:

\n
    \n
  • 账户A中存在Lambda_DDBTest具有 Lambda 执行角色的Lambda 函数 \xe2\x80\x93<LambdaExecutionRole>
  • \n
  • 账户BLambdaTest中存在DynamoDB 表 \xe2\x80\x93 \n此 Lambda 函数正在尝试从账户B访问 DynamoDB 表,下面是设置 IAM 配置时需要遵循的步骤。
  • \n
\n

步骤 1:在账户 B 中创建角色,以提供对 Lambda 函数的访问权限,以代入账户 B 的角色。

\n
    \n
  1. 以目标账户管理员身份登录 AWS 管理控制台,然后打开\nIAM 控制台。

    \n
  2. \n
  3. 在左侧导航窗格中,选择 \xe2\x80\x9cRoles\xe2\x80\x9d 并单击“创建新角色”按钮,\n输入角色名称并单击“下一步”

    \n
  4. \n
  5. 在下一页中,选择与“另一个 AWS 账户:属于您或第 3 方”相关的按钮

    \n
  6. \n
  7. 输入源帐户的帐户 ID,然后在选项中选择 \xe2\x80\x9c 需要外部 ID\xe2\x80\x9d 并\ng给它一个外部 ID 值(例如,我给了 \xe2\x80\x9ctestcrossaccountddb\xe2\x80\ x9d)。记下外部 ID 值以供稍后使用(我们在 lambda 函数中使用它)。

    \n
  8. \n
  9. 在下一个窗口中,单击“AmazonDynamoDBFullAccess”复选框,然后单击“下一步\n步骤”

    \n
  10. \n
  11. 检查您的设置并键入角色名称(例如 \xe2\x80\x98crossaccount-LambdaDDB\xe2\x80\x99)

    \n
  12. \n
  13. 查看角色后,选择 \xe2\x80\x9c创建角色\xe2\x80\x9d。\n创建角色后,您可以在角色列表中看到它。再次打开角色,添加内联策略\n以添加账户 A 中的 lambda 函数执行角色,以允许代入角色从账户 B 访问 DynamoDB\n表。

    \n
    {\n"Version": "2012-10-17",\n"Statement": {\n"Effect": "Allow",\n"Action": "sts:AssumeRole",\n"Resource": "arn:aws:iam::<Account A>:role/<LambdaExecutionRole>"\n}\n}\n\n
    Run Code Online (Sandbox Code Playgroud)\n
  14. \n
\n
    \n
  • 复制您的账户 A \xe2\x80\x93 Lambda 函数执行角色 ARN 并将其替换为资源中的 ARN
  • \n
\n

截屏

\n

步骤 2 \xe2\x80\x93 在账户 A 中的 Lambda 函数执行角色中进行配置

\n
    \n
  1. 转到账户 A - Lambda 函数执行角色 IAM 页面。
  2. \n
  3. 提供“AmazonDynamoDBFullAccess”,以便您的 Lambda 函数拥有\n执行 DynamoDB 操作的权限。
  4. \n
  5. 通过添加\ninline 策略,将步骤 1 中创建的账户 B\xe2\x80\x99s 角色添加到 Lambda 函数执行角色,如下所示:\n
    {\n"Version": "2012-10-17",\n"Statement": [\n{\n"Effect": "Allow",\n"Action": "sts:AssumeRole",\n"Resource": " arn:aws:iam::<Account B>:role/crossaccount-LambdaDDB\xe2\x80\x9d\n}\n]\n}\n
    Run Code Online (Sandbox Code Playgroud)\n
  6. \n
\n

\n

完成上述配置后,我在 Lambda\nfunction 中使用以下 python boto3 示例代码来访问账户 B 中的 DynamoDB 表 \xe2\x80\x98LambdaTest\xe2\x80\x99。在此示例代码中,我尝试扫描\n该表并将一个新项目插入该表中。

\n
{\n"Version": "2012-10-17",\n"Statement": {\n"Effect": "Allow",\n"Action": "sts:AssumeRole",\n"Resource": "arn:aws:iam::<Account A>:role/<LambdaExecutionRole>"\n}\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

参考:

\n

https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-assume-iam-role/

\n