Lambda无权执行:dynamodb:查询资源 - 但扫描工作正常

时间:2017-09-04 01:25:31

标签: amazon-web-services amazon-dynamodb aws-lambda amazon-iam

我是Lambda的新手,我正在玩AWS中提供的lambda样本。

在nodeJS 6.10运行时,

dynamo.query({ TableName: 'my_table', KeyConditionExpression: 'id = :id',ExpressionAttributeValues: {':id': '123'} }, done);错误地显示xxxxLambda is not authorized to perform: dynamodb:Query on resource

但是dynamo.scan({ TableName: 'my_table'}, done);工作正常,PUT操作dynamo.putItem(JSON.parse(event.body), done);也没有修改我的IAM政策。

BTW,done变量的定义是

const done = (err, res) => callback(null, {
        statusCode: err ? '400' : '200',
        body: err ? err.message : JSON.stringify(res),
        headers: {
            'Content-Type': 'application/json',
        },
    });

修改

我的Lambda-IAM原始角色:

  1. AWSLambdaMicroserviceExecutionRole-XXXX
  2. AWSLambdaBasicExecutionRole-XXXX-XXXX-XXXX-XX
  3. 当我附加“AmazonDynamoDBFullAccess”政策时,'查询'也开始正常工作。 但我想知道的是扫描和放置是如何工作但不是查询?

    修改-2

    亲爱的downvoter,请添加评论,以便我可以改进我的问题。

2 个答案:

答案 0 :(得分:2)

这似乎是一个许可问题。

仔细检查附加到Lambda函数的IAM角色内的IAM策略,无论是具有AmazonDynamoDBFullAccess还是包含“查询”操作的自定义策略。

  "Effect": "Allow",
  "Action" [
        dynamodb:Query
   ]

答案 1 :(得分:0)

我遇到了同样的问题,但是仅接受的解决方案对我来说不起作用。如果我没有在权限中提供表arn,那么一切都会正常进行,而只是使它适用于所有表。当然可以,但是那不是一个安全的解决方案。

我发现我必须在IAM权限中为要查询的GSI指定arn。因此,我没有为表指定arn,而是为要查询的特定索引指定了arn。然后它起作用了。也许有一个更优雅的解决方案,但这对我有用。