Перечисление всех разрешений для динамо в политике не будет работать, но подстановочный знак делает динамод:*
Поэтому я пытаюсь определить минимальные разрешения, которые кластер 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"
]
}