Odmowa dostępu podczas przesyłania plików do Amazon za pomocą zasad Paperclip i IAM
Nie mogę pobrać pliku przy użyciu spinacza do papieru przy użyciu zasad S3 IAM. Mam nawet problemy z bezpośrednim przesyłaniem jQuery (bez spinacza). Mój scenariusz jest następujący: mam aplikację, która będzie miała wiele witryn. Każda witryna będzie miała własne wiadro i powinna mieć dostęp tylko do własnego kubła, nikt inny. TheIAM Example Policy dokumentacja wyjaśnia dokładnie, co chcę zrobić w „Przykład: Zezwól każdemu użytkownikowi IAM na dostęp do folderu w wiadrze”. Mam grupę IAM skonfigurowaną dla aplikacji i jednego użytkownika na stronę w grupie. Ci użytkownicy IAM należą do grupy. Zasady dotyczące grupy są następujące:
{
"Version":"2012-10-17",
"Statement":[{
"Effect":"Allow",
"Action":[
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectVersion",
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource":"arn:aws:s3:::my-app/${aws:username}/*"
}
]
}
Oto moja konfiguracja CORS na wiadrze, oczywiście dla dev zostanie zablokowana później:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Oto moje ustawienia spinacza:
has_attached_file :background_image,
storage: :s3,
s3_credentials: {
access_key_id: "xxx",
secret_access_key: "xxx"
},
bucket: "my-app",
s3_permissions: "public-read",
path: "/background_images/:id/:filename"
Wcześniej pracowałem z politykami bezpośrednio na wiaderku, co działało, ale nie było tak elastyczne, jak potrzebuję, kiedy przechodzę do środowiska produkcyjnego z wieloma „witrynami”. O ile wiem, dokładnie śledziłem dokumentację, ale wszystko, co robię, skutkuje „odmową dostępu”. W tym momencie nie jestem nawet pewien, czy mój problem dotyczy mojej polityki IAM lub mojej konfiguracji spinacza.
edytuj: wyjaśnienie.
edycja 2: ROZWIĄZANIE KOŃCOWE
Oto moja ostateczna polityka IAM oparta naTen artykuł:
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowUserToSeeBucketListInTheConsole",
"Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
},
{
"Sid": "AllowRootAndHomeListingOfCompanyBucket",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::my-app"],
"Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}}
},
{
"Sid": "AllowListingOfUserFolder",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::estimator-app"],
"Condition":{"StringLike":{"s3:prefix":["home/${aws:username}/*"]}}
},
{
"Sid": "AllowAllS3ActionsInUserFolder",
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": ["arn:aws:s3:::my-app/home/${aws:username}/*"]
}
]
}
A moje zaktualizowane ustawienia spinacza:
has_attached_file :background_image,
storage: :s3,
s3_credentials: {
access_key_id: "xxx",
secret_access_key: "xxx"
},
bucket: "estimator-app",
s3_permissions: "public-read",
path: "/home/my_s3_username/background_images/:id/:filename"
Ważne było dołączenie nazwy użytkownika do ścieżki spinacza. Zakładałem, że Amazon wywnioskuje to z poświadczeń, ale tak nie jest.