尝试执行 dynamodb:PutItem 操作时出现 AccessDeniedException

问题描述 投票:0回答:2

我的 AWS Lambda 函数正在尝试写入 dynamodb。 从客户端应用程序登录的用户调用 AWS API-Gateway 终端节点,该终端节点进一步调用 AWS Lambda 函数。 这些用户是在 AWS Cognito 用户池中创建的。登录是使用身份池(联合身份)完成的。这意味着,首次使用用户名和密码登录时会得到 Id_token,该 Id_token 与临时 IAM 凭证和会话令牌交换。 用户所在的组已关联允许写入 dynamodb 表的角色。

AWS Lambda 函数看起来像这样 -

def create_profile(event, context):
    profile = json.loads(event["body"])

    session = boto3.Session(region_name='eu-west-2')
    ddb_client = session.client('dynamodb')
    row_id = str(uuid.uuid4())
    item = {
        'RowID': {
            'S': row_id
        },
        'first_name': {
            'S': profile['first_name']
        },
        'last_name': {
            'S': profile['last_name']
        }
    }

    ddb_client.put_item(TableName='Persons', Item=item)

(这只是一个测试代码。所以没有验证等,请忽略该部分)

我收到此错误

[ERROR] ClientError: An error occurred (AccessDeniedException) when calling the PutItem operation: User: arn:aws:sts::<ACCOUNT_ID>:assumed-role/<PREFIX>-CreateProfileFunctionRole-1VOW05TI1WR20/<PREFIX>-CreateProfileFunction-gqmkkzOP1Ro7 **is not authorized to perform:** dynamodb:PutItem on resource: arn:aws:dynamodb:eu-west-2:<ACCOUNT_ID>:table/Persons **because no identity-based policy allows** the dynamodb:PutItem action
    Traceback (most recent call last):
      File "/var/task/app.py", line 23, in create_profile
        ddb_client.put_item(TableName='Persons', Item=item)
      File "/var/runtime/botocore/client.py", line 391, in _api_call
        return self._make_api_call(operation_name, kwargs)
      File "/var/runtime/botocore/client.py", line 719, in _make_api_call
        raise error_class(parsed_response, operation_name)

我的问题是,既然我已经添加了 AdministratorAccess 托管策略,为什么它说“因为没有基于身份的策略允许”。 我认为上面编写的Python代码不是在联合身份下运行以对更多服务进行进一步操作。

我已检查与 Cognito 组关联的角色是否已“假定”,因为当在 jwt.io 中看到该角色时,可以在 Id_token 中看到该角色。

我的Python代码有问题吗?我是否需要做一些明确的事情来在假定的身份下运行它,以进一步调用更多 aws 服务?

amazon-web-services amazon-dynamodb amazon-cognito federated-identity
2个回答
3
投票

我遇到了类似的问题。我设法通过向该角色添加显式策略来解决此问题

<PREFIX>-CreateProfileFunctionRole-1VOW05TI1WR20

在角色上添加以下策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "dynamodb:PutItem",
            "Resource": "arn:aws:dynamodb:eu-west-2:<ACCOUNT_ID>:table/Persons*"
        }
    ]
}

对我来说问题已经解决了。 希望对你有帮助。


0
投票

就我而言,我有两天的名字不一致。我的代码中的表是 一些表 在AWS中 一些_表

© www.soinside.com 2019 - 2024. All rights reserved.