在策略中列出 dynamo 的所有权限将不起作用,但通配符会 dynamodb:*

Listing all permissions for dynamo in a policy won't work but wildcard does dynamodb:*

所以我试图从一个步骤中找出 EMR 集群创建配置单元 table 所需的最低权限。我发现它需要来自 dynamodb 的东西,因为它不会工作,除非策略中有 "dynamodb:*"(它确实在集群上设置了一致的视图)。我想知道它需要的特定权限,而不是通配所有权限。一种蛮力的方法是我使用一个列出所有 dynamodb 操作的策略,然后我将它们一个一个地删除并在集群上的一个步骤中再次制作 table 以查看它是否失败或不。但是当我使用通配符时它起作用了,但是把它们全部列出来却不起作用。

当我使用时:

{
"Version": "2012-10-17",
"Statement": [
...(other stuff)
    {
        "Effect": "Allow",
        "Resource": "*",
        "Action": [
            "dynamodb:*",
            "s3:PutObjectAcl",
            "s3:GetObject",
            "s3:ListBucket"
        ]
    }
  ]
}

它可以很好地创建 table。但是当我列出每个资源时(来自这里:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/api-permissions-reference.html),它无法创建 table。 看起来像这样:

...
{
        "Effect": "Allow",
        "Resource": "*",
        "Action": [
            "dynamodb:BatchGetItem",
            "dynamodb:BatchWriteItem",
            ...

table 只是一个示例 table,犯罪数据如下所示:

CREATE EXTERNAL TABLE crimes (
id string,
...
case_location string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION 's3://<path>/crimes/data';

通配符和列出所有服务应该没有区别吧?

这应该行得通 - 因为我不知道有什么区别,但是如果你不打算限制任何东西,为什么还要费心列出服务。

我强烈建议使用策略模拟器来测试 IAM 配置文件和 API 调用 - 请参阅 https://policysim.aws.amazon.com

我还建议将 S3 配置文件与 DynamoDB 配置文件分开并使用多个语句。

可能是缺少服务或未正确指定资源。从 IAM 的角度来看,来自实际 API 调用的错误消息和错误代码并不总是有用,这就是为什么我建议使用 policysim 工具。

这是一个适用于我的 DynamoDB 和限制特定资源的示例。

        {
        "Action": [
            "dynamodb:BatchGetItem",
            "dynamodb:BatchWriteItem",
            "dynamodb:DeleteItem",
            "dynamodb:DescribeTable",
            "dynamodb:GetItem",
            "dynamodb:GetRecords",
            "dynamodb:ListTables",
            "dynamodb:PutItem",
            "dynamodb:Query",
            "dynamodb:Scan",
            "dynamodb:UpdateItem",
            "dynamodb:CreateTable",
            "dynamodb:UpdateTable"
        ],
        "Effect": "Allow",
        "Resource": [
            "arn:aws:dynamodb:*:*:table/Foo",
            "arn:aws:dynamodb:*:*:table/Bar"
        ]
    }

原来是内存问题。

我们不知道到底发生了什么,但该集群是一个带有 m1.medium 的 EMR 集群,因为我们只是在测试。好吧,我不想点击错误日志输出,因为我正在更改权限,所以我假设权限错误(之前的失败是权限错误)但是在查看错误日志后,他们说 'out of memory' .

所以我不知道到底发生了什么,但听起来我们几乎用完了列出所有权限的所有内存,而不是使用通配符用完了剩余的内存。只是其中一个你意想不到的错误 = )