2015-11-06 15 views
5

Io uso la pipeline di elaborazione dei dati costruito conAccesso negato usando boto3 tramite AWS Lambda

S3 + SNS + Lambda

becasue S3 non può inviare notificaiton fuori della sua regione di stoccaggio così ho fatto uso di SNS per inviare Notifica S3 a Lambda in altre regioni.

La funzione lambda codificato con

from __future__ import print_function 
import boto3 


def lambda_handler (event, context): 
    input_file_bucket = event["Records"][0]["s3"]["bucket"]["name"] 
    input_file_key = event["Records"][0]["s3"]["object"]["key"] 

    input_file_name = input_file_bucket+"/"+input_file_key 

    s3=boto3.resource("s3") 
    obj = s3.Object(bucket_name=input_file_bucket, key=input_file_key) 
    response = obj.get() 

    return event #echo first key valuesdf 

quando mi sono imbattuto salvare e test, ho ottenuto il seguente errore

{ 
    "stackTrace": [ 
    [ 
     "/var/task/lambda_function.py", 
     20, 
     "lambda_handler", 
     "response = obj.get()" 
    ], 
    [ 
     "/var/runtime/boto3/resources/factory.py", 
     394, 
     "do_action", 
     "response = action(self, *args, **kwargs)" 
    ], 
    [ 
     "/var/runtime/boto3/resources/action.py", 
     77, 
     "__call__", 
     "response = getattr(parent.meta.client, operation_name)(**params)" 
    ], 
    [ 
     "/var/runtime/botocore/client.py", 
     310, 
     "_api_call", 
     "return self._make_api_call(operation_name, kwargs)" 
    ], 
    [ 
     "/var/runtime/botocore/client.py", 
     395, 
     "_make_api_call", 
     "raise ClientError(parsed_response, operation_name)" 
    ] 
    ], 
    "errorType": "ClientError", 
    "errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied" 
} 

ho configurato il ruolo lambda con

full S3 access 

e set Secchio di polizza sul mio target bucket

everyone can do anything(list, delete, etc.) 

Sembra che non abbia impostato bene la politica.

risposta

3

Possibilità dell'oggetto S3 specifico che state cercando è avere autorizzazioni limitate

+1

Questo è piuttosto vago. Potresti indicare come si potrebbe affrontare questo problema? –

+1

Due possibilità 1. Autorizzazione a livello oggetto S3 per lettura negata 2. Il ruolo associato a lambda non dispone dell'autorizzazione per ottenere/leggere oggetti S3 – omuthu

+0

Per me è stato utile l'aggiunta di 's3: GetObject' alla politica. –

10

ho avuto un problema simile, ho risolto collegando il criterio appropriato per il mio utente.

IAM -> Utenti -> Nome utente -> Autorizzazioni -> Collega criterio.

Assicurati inoltre di aggiungere la chiave di accesso corretta e la chiave di accesso segreta, puoi farlo utilizzando AmazonCLI.

1

aggiunta alla risposta di Amri, se il secchio è privato e si hanno le credenziali per accedervi è possibile utilizzare il boto3.client:

import boto3 
s3 = boto3.client('s3',aws_access_key_id='ACCESS_KEY',aws_secret_access_key='SECRET_KEY') 
response = s3.get_object(Bucket='BUCKET', Key='KEY') 

* Per questo file: S3: // secchio/a/b/c/some.text, Bucket è 'bucket' e Key è 'a/b/c/some.text'