Перечисление всех разрешений для динамо в политике не будет работать, но подстановочный знак делает динамод:*

Поэтому я пытаюсь определить минимальные разрешения, которые кластер EMR должен создать для создания таблицы кустов, начиная с шага. Я обнаружил, что ему нужно что-то от DynamodB, потому что оно не будет работать, если в политике нет "DynamodB:*" (у него есть согласованное представление в кластере). Я хочу знать, какие именно разрешения нужны, а не подстановочные знаки для всех. Грубый способ сделать это состоит в том, что я использую политику, которая перечисляет все действия DynamodB, а затем я удаляю их одно за другим и снова создаю таблицу на шаге в кластере, чтобы увидеть, если он потерпит неудачу или нет. Но когда я использую подстановочный знак, это работает, а перечисление их всех - нет.

Когда я использую:

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

Это может создать таблицу просто отлично. Но когда я перечисляю каждый ресурс (отсюда: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/api-permissions-reference.html), он не может создать таблицу. Который будет выглядеть так:

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

Таблица является просто примером таблицы с данными о преступности, которая выглядит следующим образом:

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

Не должно быть разницы между подстановочным знаком и списком всех сервисов, верно?

2 ответа

Решение

Оказывается, это была проблема с памятью.

Мы не знаем точно, что произошло, но кластер был кластером EMR с m1.medium, так как мы только что тестировали. Ну, я не думал нажимать на выходы журнала ошибок, так как я менял разрешения, поэтому я допустил ошибку разрешения (а предыдущие ошибки были ошибками разрешения), но после просмотра журналов ошибок они говорили "недостаточно памяти",

Так что я не знаю точно, что происходило, но похоже, что мы были так близки к использованию всей памяти, что список всех разрешений и использование подстановочного знака израсходовали то, что осталось от памяти. Просто одна из тех ошибок, которые вы никогда не ожидаете =)

Это должно сработать - как я не знаю никакой разницы, но зачем беспокоиться о перечислении услуг, если вы не собираетесь ничего ограничивать.

Я настоятельно рекомендую использовать симулятор политики для тестирования профилей IAM и вызовов API - см. https://policysim.aws.amazon.com/.

Я также рекомендовал бы разделить профиль S3 от профиля DynamoDB и использовать несколько операторов.

Это может быть отсутствующий сервис или ресурс, который не указан должным образом. Сообщения об ошибках и коды ошибок от реальных вызовов API не всегда полезны с точки зрения IAM, поэтому я рекомендую использовать инструмент 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"
        ]
    }
Другие вопросы по тегам