2016-02-10 14 views
5

Come dovrebbe essere il criterio IAM per consentire all'utente my-user di accedere a un bucket Amazon S3 denominato my-bucket?Politica Amazon IAM semplice per s3 utilizzando Rails e Paperclip

Attualmente, ho il seguente criterio assegnato a my-user:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": ["s3:ListBucket"], 
     "Resource": ["arn:aws:s3:::my-bucket"] 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:PutObject", 
     "s3:GetObject", 
     "s3:DeleteObject" 
     ], 
     "Resource": ["arn:aws:s3:::my-bucket/*"] 
    } 
    ] 
} 

ho avuto questa politica di "Campione 1" sul link seguente:

http://blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-How-to-grant-access-to-an-Amazon-S3-bucket

Nel mio file production.rb, Ho implementato le impostazioni di configurazione per dire a paperclip di usare S3:

config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_credentials => { 
    :bucket => 'my-bucket', 
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
} 

Quando tento di utilizzare la mia app per caricare una foto, ricevo un'eccezione AWS::S3::Errors::AccessDenied.

Stranamente, se carico la console rotaie, ed eseguire il seguente codice per caricare manualmente un file, esso funziona correttamente:

s3 = AWS::S3.new(access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']) 
bucket = s3.buckets['my-bucket'] 
obj = bucket.objects['new_file'] 
obj.write(Pathname.new('/path/to/file')) 

così caricate correttamente il file nel mio secchio S3. Sono confuso perché ho chiaramente il permesso di caricare un file in questo modo, ma quando provo a farlo tramite paperclip con le stesse credenziali, ottengo l'errore di autorizzazione negato.

Ancora più confuso, quando assegno la politica AdministratorAccess a my-user, paperclip è in grado di caricare correttamente il file.

Qualche idea su come posso risolvere questo problema?

risposta

8

la soluzione è qui: https://stackoverflow.com/a/19185045/736864

Quando graffetta carica il file a S3, cerca anche di impostare il file per essere visibile pubblicamente, il che significa che l'utente deve avere accesso per impostare le autorizzazioni. L'aggiunta dell'autorizzazione s3:PutObjectAcl al criterio IAM ha risolto il problema.