我的 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 服务?
我遇到了类似的问题。我设法通过向该角色添加显式策略来解决此问题
<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*"
}
]
}
对我来说问题已经解决了。 希望对你有帮助。
就我而言,我有两天的名字不一致。我的代码中的表是 一些表 在AWS中 一些_表