2016-05-01 16 views
5

Chcę użyć boto3 do skonfigurowania wiadra s3 do wywołania lambda AWS za każdym razem, gdy obiekt zostanie utworzony w tym segmencie. Tu jest mój kodu:Nie można dodać powiadomienia s3 dla lambda przy użyciu boto3

s3 = ..boto3 resource 
bucket_notification = s3.BucketNotification(bucket_name) 
lambda_arn = .. arn for lambda 

response = bucket_notification.put(
    NotificationConfiguration={'LambdaFunctionConfigurations': [ 
     { 
       'LambdaFunctionArn': lambda_arn, 
       'Events': [ 
        's3:ObjectCreated:*' 
       ], 

     }, 
]}) 

pojawia się błąd:

botocore.exceptions.ClientError: An error occurred (InvalidArgument) when calling the PutBucketNotificationConfiguration operation: Unable to validate the following destination configurations

Odpowiedz

4

trzeba dodać uprawnienia na koniec lambda aby umożliwić S3 do wywołania funkcji lambda. Uważaj, jeśli ręcznie utworzysz mapowanie źródła zdarzeń przy użyciu graficznego interfejsu użytkownika AWS Lambda, a następnie usuniesz mapowanie źródła zdarzeń, uprawnienia nadal istnieją! Więc nie dostaniesz powyższego błędu.

Jeśli jednak zaczniesz od zera, a następnie spróbujesz dodać powiadomienie, pojawi się powyższy błąd.

Uprawnienia są dodawane przez:

client = ...boto3 lambda client 
response = client.add_permission(
    FunctionName=lambda_name, 
    StatementId='1', 
    Action='lambda:InvokeFunction', 
    Principal='s3.amazonaws.com', 
    SourceArn=s3_arn, 
    SourceAccount='66666666666' 
) 
+0

Dzięki. To zaoszczędziło mi wielu bólów głowy. Ponadto, jeśli używasz CloudFormation do wdrożenia funkcji lambda, możesz dodać wymagane uprawnienie bezpośrednio z szablonu: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-permission .html –

+0

+1 za to. Przeszedł do tego samego problemu próbując dodać powiadomienie s3 dla kolejki SQS; zaczęło działać po dodaniu odpowiednich uprawnień/zasad na końcu SQS. – 3cheesewheel