Ответ 1
Чтобы развернуть статью и фрагменты, написанные на Bob Kinney (+1), я хотел бы объяснить, что я считаю вероятной причиной вашей проблемы, что на самом деле не связанный с использованием службы маркеров безопасности AWS (STS), но включает в себя несколько тонкостей, часто встречающихся с Политика Amazon S3 IAM в целом:
Примеры политик для Amazon S3 охватывают различные варианты использования, похожие или связанные с вашими - в частности ваши примеры использования, по-видимому, включают пример 2: разрешить группе, чтобы иметь общую папку в Amazon S3 - вы эффективно реализовали это в первой политике первого фрагмента уже (modulo GetObjectVersion
, DeleteObjectVersion
, которые применимы только при использовании Версии объектов).
Теперь отсутствует ListBucket - обратите внимание на следующие тонкости:
- Это относится к "Операции на ковшиках" , то есть операции, которые вы можете выполнять на Amazon S3 ведра, тогда как, например, GetObject относится к Операции над объектами, т.е. операции, которые вы можете выполнить на объектах Amazon S3 (кроме того, Операции в службе, в настоящее время только ListAllMyBuckets, который, скорее всего, не применим к вашему прецеденту).
- Параметр
prefix
Ограничивает ответ на клавиши, начинающиеся с указанного префикса. Вы можете использовать префиксы для разделения ведра на разные наборы ключей способом, похожим на то, как файловая система использует папки. Это означает, что префикс не может содержать подстановочные знаки, или, скорее,*
просто рассматривается как часть имени, см. Какие символы разрешены в ведре или имени объекта?.- Это один из аспектов моделирования папок/каталогов, на котором многие из пользователей натыкаются сначала, потому что S3 на самом деле является плоской архитектурой хранения, состоящей только из ковшей и объектов/ключей (см. мой ответ на Как указать префикс срока действия объекта, который не соответствует каталогу? для получения более подробной информации об этом).
Для многих случаев, подобных вашим, требуется два разных фрагмента политики для отдельного адреса объекта и операций, связанных с ведром, поэтому вам, вероятно, понадобится следующее:
AWS::STS::Policy.new do |policy|
policy.allow(
actions: ["s3:GetObject*", "s3:PutObject*", "s3:DeleteObject*"],
resources: "arn:aws:s3:::#{ENV['PROJECT_BUCKET']}/#{folder_path}/*"
)
policy.allow(
actions: ["s3:ListBucket"],
resources: ["arn:aws:s3:::#{ENV['PROJECT_BUCKET']}"]
).where(:s3_prefix).like("#{folder_path}/")
end