1

我正在使用 AWS Lambda(Python) 和 DynamoDB。我想让我的 DynamoDB 连接采用细粒度访问策略。我按照本文档作为指南

我遇到的问题是假设策略,它使用 STS 并提到 RoleArn

assumed_role = sts_client.assume_role(
    RoleArn="arn:aws:iam::<account-id>:role/AccessDynamoWithTenantContext",
    RoleSessionName="tenant-aware-product",
    Policy=tenantPolicy,
)

我不明白这RoleArn是从哪里来的。我试过使用 lambda 的角色,但后来我遇到了错误:

"An error occurred (AccessDenied) when calling the AssumeRole operation: User: 
arn:aws:sts::1234567890:assumed-role/my_lambda_role/my_lambda_role
is not authorized to perform: sts:AssumeRole 
on resource: arn:aws:iam::1234567890:role/my_lambda_role"

我应该寻找什么角色?以及如何让我的 lambda 假设它,因为我不确定您是否可以在它的 JSON 中自我引用策略。

任何帮助是极大的赞赏。

编辑

我确实发现这行得通,但从我的角度来看,AWS 委托人过于宽容。我不确定主要领域会发生什么

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
4

1 回答 1

0

TL;博士:

Lambda 函数的 Assumed Role ARN 构造如下:

arn:aws:sts::{AccountID}:assumed-role/{RoleName}/{FunctionName}

细节:

因此,在您的情况下,“角色会话名称”是 lambda 函数名称。您可以通过尝试从您没有权限的 Lambda(例如 DynamoDB ListTables)调用 API 来轻松验证这一点。回调中的错误消息还将包含假定的角色 ARN(请注意,当操作被拒绝时,某些服务(例如 S3)不会提供详细的错误消息。DynamoDB、Lambda 以及大多数最近启动的服务都会提供。)

我不确定您为什么需要 NotPrincipal,因为可能有更好的方法来处理您描述的场景:) 更多信息将有助于提供更准确的答案。
来自AWS IAM 文档

重要提示:很少有场景需要使用 NotPrincipal,我们建议您在决定使用 NotPrincipal 之前探索其他授权选项。

参考:https ://stackoverflow.com/a/48649661/11758843

于 2021-06-20T11:11:43.687 回答