2015-02-17 15 views
7

Quando provo a caricare un'immagine su un oggetto "Car", mi viene negato l'accesso a S3. Ma le immagini del sito che si trovano nel . cartella di beni hanno mostrato più che bene da quando ho aggiunto S3 L'errore specifico che ottengo è questo:.Excon :: Errori :: Vietato (Previsto (200) <=> Actual (403 Forbidden)

2015-02-17T14:40:48.459629+00:00 app[web.1]: Excon::Errors::Forbidden (Expected(200) <=> Actual(403 Forbidden) 
2015-02-17T14:40:48.459630+00:00 app[web.1]: excon.error.response 
2015-02-17T14:40:48.459635+00:00 app[web.1]:  "Connection"  => "close" 
2015-02-17T14:40:48.459637+00:00 app[web.1]:  "Content-Type"  => "application/xml" 
2015-02-17T14:40:48.459639+00:00 app[web.1]:  "Date"    => "Tue, 17 Feb 2015 14:40:48 GMT" 
2015-02-17T14:40:48.459640+00:00 app[web.1]:  "Server"   => "AmazonS3" 
2015-02-17T14:40:48.459632+00:00 app[web.1]: :body   => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>2CE306ACD51F02A1</RequestId><HostId>tKLXUAKxyDFTMExl7kE+AuVVsEJOFqXh983li6N7R2UlYDXv1Z3GJRvW5zy1XIXVs2zArp310vg=</HostId></Error>" 
2015-02-17T14:40:48.459642+00:00 app[web.1]:  "x-amz-id-2"  => ""part of secret key"=" 

Con "parte della chiave segreta" ovviamente redatta ho provato la creazione di un altro utente e l'utilizzo di nuove chiavi, ma non ha funzionato. Non è possibile andare da qui.

app/uploader/picture_uploader

class PictureUploader < CarrierWave::Uploader::Base 
    include CarrierWave::MiniMagick 
    process resize_to_limit: [400, 400] 

    if Rails.env.production? 
    storage :fog 
    else 
    storage :file 
    end 

    # Override the directory where uploaded files will be stored. 
    # This is a sensible default for uploaders that are meant to be mounted: 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

    # Add a white list of extensions which are allowed to be uploaded. 
    def extension_white_list 
    %w(jpg jpeg gif png) 
    end 
end 

carrier_wave.rb

if Rails.env.production? 
    CarrierWave.configure do |config| 
    config.fog_credentials = { 
     # Configuration for Amazon S3 
     :provider    => 'AWS', 
     :aws_access_key_id  => ENV['S3_ACCESS_KEY'], 
     :aws_secret_access_key => ENV['S3_SECRET_KEY'] 
    } 
    config.fog_directory  = ENV['S3_BUCKET'] 
    end 
end 

Credo che sia tutti i file rilevanti, fatemi sapere se c'è altro da vedere. Non sono sicuro che la specifica di una regione o di un utente esperto possa essere d'aiuto, non sembra come sarebbe.

risposta

40

[EDIT: Avrei impostato l'altra risposta a questo punto, soprattutto se ci si trova in un ambiente di produzione. Questa è stata una soluzione che ha funzionato per me mentre costruivo un giocattolo fragile qualche anno fa, ma concordo con la concessione di autorizzazioni minime quando la sicurezza è un problema.]

Ho riscontrato lo stesso errore e la soluzione era quella di allegare politiche di accesso dalla AWS Management Console:

1) Iscriviti alla console AWS Management presso http://aws.amazon.com/iam/

2) Fare clic su "politiche" dal riquadro di spostamento a sinistra del

3) Selezionare il "AdministratorAccess "politica

4) Fare clic su azioni politiche> Fissare nella parte superiore della pagina

5) Selezionare l'utente associato al mio S3_ACCESS_KEY, S3_SECRET_KEY, e S3_BUCKET

6) Fare clic su "Allega Policy"

Semplicemente la concessione di tutte le autorizzazioni dal mio bucket a https://console.aws.amazon.com/s3/home non era sufficiente.

+0

Impressionante, grazie per questa soluzione! I documenti AWS sul loro sistema rinnovato sono stati difficili da navigare. – Jadam

+0

Vorrei poterti dare più di un upvote su questo. Ho letteralmente speso 4 ore cercando di farlo funzionare. È difficile credere che S3 sia così complicato, difficile da configurare e scarsamente documentato. – IAmNaN

+3

Quindi, se seguiamo questo e generiamo un utente in amazon ... ora abbiamo 2 set di chiavi di accesso/segreto (uno generico per il tuo account AWS quando accedi alle tue "credenziali di sicurezza" -> Access Keys (ID della chiave di accesso e Secret Access Key) ... poi un altro per ogni utente che hai configurato in 'Utenti' come viene usato nei passaggi precedenti. Quale set di chiavi utilizziamo nel terminale quando esegui 'heroku config: imposta AWS_ACCESS_KEY_ID = e heroku config : set AWS_SECRET_ACCESS_ID = '??? – BB500

2

L'altra risposta che ti dice di concedere AdministratorAccess sull'utente IAM è una cattiva idea dal punto di vista della sicurezza - consentirà a chiunque abbia accesso a tali chiavi di eseguire qualsiasi azione nel tuo account, inclusa l'eliminazione di tutta l'infrastruttura.

Non ho lavorato fuori il set minimo esatto di autorizzazioni che le esigenze Carrierwave/fendinebbia, ma un insieme più piccolo che mi sono sguardi di lavoro come:

creare un criterio IAM AWS con un documento politico come:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::BUCKETNAME/*" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::BUCKETNAME" }, { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": [ "*" ] } ] }

nota, che non è un errore specificare azioni S3 sia su BUCKETNAME e BUCKETNAME/* - il primo riguarda azioni API che vengono eseguite sul secchio, e la seconda, su oggetti memorizzati all'interno del secchio.

Problemi correlati