Non riesco a ottenere un caricamento che funzioni con Paperclip utilizzando una politica S3 IAM. Ho persino problemi con i caricamenti jQuery diretti (senza graffetta). Il mio scenario è il seguente, ho un'applicazione che avrà molti siti. Ogni sito avrà il proprio bucket e dovrebbe essere in grado di accedere al proprio bucket, a nessun altro. La documentazione IAM Example Policies spiega esattamente cosa voglio fare in "Esempio: consenti ad ogni utente IAM di accedere a una cartella in un bucket". Ho un gruppo IAM configurato per l'applicazione e ho un utente per sito all'interno del gruppo. Questi utenti IAM appartengono al gruppo. La politica sul gruppo è la seguente:Accesso negato durante il caricamento di file su Amazon utilizzando i criteri Paperclip e IAM
{
"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}/*"
}
]
}
Qui è la mia configurazione CORS sul secchio, per dev naturalmente, si otterrà bloccato in seguito:
<?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>
Qui sono le mie impostazioni Paperclip:
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"
ero in precedenza lavorato con le politiche direttamente sul secchio, che ha funzionato, ma non era flessibile come ho bisogno di essere quando mi muovo in un ambiente di produzione con molti "siti". Per quanto posso dire, ho seguito esattamente la documentazione, ma tutto ciò che faccio risulta in "Accesso negato". A questo punto non sono nemmeno sicuro se il mio problema riguarda il mio criterio IAM o la mia configurazione di Paperclip.
modifica: chiarimento.
Edit 2: soluzione finale
Qui è la mia politica IAM finale sulla base this article:
{
"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}/*"]
}
]
}
E le mie impostazioni Paperclip aggiornamento:
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"
E 'stato importante per includere il nome utente nel percorso Paperclip. Supponevo che Amazon potesse dedurlo dalle credenziali, ma non è così.
Ho aggiornato le autorizzazioni a "Azione": "s3: *" solo per testare. Funziona se aggiorno anche a "Risorsa": "arn: aws: s3 ::: my-app/*". Nel momento in cui metto $ {aws: username} in I Access viene nuovamente negato. Grazie comunque per il suggerimento, lo assicurerò nelle autorizzazioni. modifica: in realtà appare se la mia risorsa è diversa dalla radice del bucket che non riesco a caricare. –
I criteri utente IAM sembrano corretti perché nella politica si sta già utilizzando la 'versione' corretta. Come viene effettivamente chiamato il tuo utente e qual è il percorso S3 che stai cercando di caricare? ('$ {aws: username}' si traduce nel [nome descrittivo] (http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html#Identifiers_FriendlyNames) per quell'utente). Dal tuo esempio il percorso sembra essere 'background_images' ma il tuo utente IAM ha anche chiamato' background_images'? – dcro
L'utente è localhost-estimator-app e il gruppo è estimator-app. Mi chiedo quanto [di questo articolo] (http://blogs.aws.amazon.com/security/post/Tx1P2T3LFXXCNB5/Writing-IAM-policies-Grant-access-to-user-specific-folders-in-an- Amazon-S3-bucke) si applica alla mia situazione. –