5

J'utilise le pipeline de traitement de données construit deAccès refusé à l'aide boto3 par aws Lambda

S3 + SNS + Lambda

becasue S3 ne peut pas envoyer notificaiton hors de sa zone de stockage, donc je fait usage de SNS envoyer Notification S3 à Lambda dans une autre région.

La fonction lambda codé avec

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 

quand je courais sauver et test, je suis l'erreur suivante

{ 
    "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" 
} 

J'ai configuré le lambda rôle avec

full S3 access 

et ensemble politique de seau sur mon seau cible

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

Il semble que je n'ai pas bien défini la politique.

Répondre

3

Possibilité de l'objet S3 spécifique que vous recherchez est d'avoir des autorisations limitées

+1

C'est assez vague. Pourriez-vous éventuellement indiquer comment on pourrait résoudre ce problème? –

+1

Deux possibilités 1. L'autorisation de niveau d'objet S3 pour la lecture est refusée 2. Le rôle attaché à lambda n'a pas l'autorisation d'obtenir/lire les objets S3 – omuthu

+0

Pour moi, j'ai aidé à ajouter 's3: GetObject' à la politique. –

10

J'ai eu un problème similaire, je l'ai résolu en fixant la politique appropriée à mon utilisateur.

IAM -> Utilisateurs -> Nom d'utilisateur -> Autorisations -> Attacher la stratégie.

Assurez-vous également d'avoir ajouté la clé d'accès et la clé d'accès secrètes correctes, en utilisant AmazonCLI.

1

Ajout à la réponse de Omri, si votre seau est privé et que vous avez les informations d'identification pour y accéder, vous pouvez utiliser le 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') 

* Pour ce fichier: s3: // seau/a/b/c/some.text, Bucket est 'bucket' et Key est 'a/b/c/some.text'