мы используем s3 bucket для обмена файлами между двумя компаниями. Мы создали частный S3 bucket и у нас есть выделенный пользователь для приложения, которое использует этот bucket (используя его aws_key и aws_secret). Мы выяснили, что у нас нет доступа к getObject, но мы успешно помещаем PutObject в bucket.
Я также создал роль с разрешениями на этот контейнер и назначил ее пользователю application_user, но это не решило проблему.
Итак, главная цель — иметь доступ на чтение, список, размещение из внешней учетной записи и внутреннего пользователя IAM к одному и тому же контейнеру S3. Я укажу, что внешняя компания имеет к нему доступ, прямо сейчас с этой политикой. У меня нет доступа к внешней учетной записи aws.
Ниже представлена политика ресурсов для s3.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SharedS3Bucket",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::199999999999:root", <--- external account
"arn:aws:iam::111111111111:user/application_user" <-- our application user
]
},
"Action": [
"s3:ListBucket",
"s3:GetBucketAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::shared-bucket",
"arn:aws:s3:::shared-bucket/*"
]
}
]
}
решение1
Разрешения S3 немного сложны, потому что у вас есть не толькоРазрешения для ведрабеспокоиться о но и каждыйОбъектзагружаемый вами файл имеет свои собственные разрешения.
ТвойПолитика ведравыше разрешает обеим компаниям загружать объекты, и это работает, как вы можете видеть. Однако, когда внешняя компания загружает объект, это разрешения по умолчаниюразрешить чтение только создателю, то есть внешней компанией. Даже если это втвойведро по умолчаниютыНе могу прочитать, если это было загружено кем-то другим. Это несколько нелогично.
Решение состоит в том, чтобы убедиться, что загруженные объекты имеют ACL, разрешающий чтение обеими учетными записями.
s3:PutObjectAcl
Для работы этого вам также потребуется добавить в список разрешений Bucket Policy.
Аналогично, если вы загружаете из командной строки, вы можете изменить acl объекта после загрузки с помощью aws s3api put-object-acl
.
Надеюсь, это поможет :)