AWS Lambda возвращает запрещенное разрешение на попытку получить GetObject из корзины S3 - PullRequest
0 голосов
/ 14 февраля 2019

Я создал лямбда-функцию, которая должна загружать данные в DynamoDB, когда файл загружается в корзину S3.Тем не менее, я получаю «Операция GetObject: разрешение отказано» в CloudWatch, когда файл загружается в корзину.К лямбда-функции прикреплена роль IAM с такими политиками: AmazonlambdaFullAccess, AmazonS3FullAccess, AmazonCloudWatchLogsFullAccess, AmazonDynamoDBFullAccess.Он имеет lambda.amazonaws.com в качестве доверенных лиц.К корзине не прикреплены политики.

 import boto3
 import json
 import urllib

 dynamodb = boto3.resource('dynamodb')
 table = dynamodb.Table('wireshark')
 s3 = boto3.client('s3')
 tests3 = boto3.resource(u's3')

 def lambda_handler(event, context):

     source_bucket = event['Records'][0]['s3']['bucket']['name']
     key = urllib.parse.quote_plus(event['Records'][0]['s3']['object']['key'])
    copy_source = {'Bucket':source_bucket , 'Key':key}
    print(event)
    print("Log stream name : ", context.log_stream_name)
    print("Log group name : ", context.log_group_name)
    print("Request Id:", context.aws_request_id)
    print("Mem. limit(MB): ", context.memory_limit_in_mb)

    #just print function
    print("Log stream name : ", context.log_stream_name)
    print("Log group name : ", context.log_group_name)
    print("Request Id:", context.aws_request_id)
    print("Mem. limit(MB): ", context.memory_limit_in_mb)

    try:
        print("Using waiter to waiting for object to persist thru s3 service")
        waiter = s3.get_waiter('object_exists')
        waiter.wait(Bucket=source_bucket, Key=key)
        print("Accessing the receied file and reading the same")
        bucket = tests3.Bucket(u'awslambdas3test2')
        obj = bucket.Object(key=key)
        response = obj.get()
        print("response from file object")
        print(response)

В Cloudwatch: при вызове операции GetObject произошла ошибка (AccessDenied): Access Denied.Я прошел через «симулятор политик» от AWS.Эта роль IAM должна быть в состоянии получить GetObject из любой корзины S3.Спасибо за вашу помощь.

Код в основном из GitHub .

1 Ответ

0 голосов
/ 23 февраля 2019

Вот лямбда-функция AWS, которая будет печатать содержимое файла:

import boto3
import os

def lambda_handler(event, context):

    s3_client = boto3.client('s3')

    # For each record

    for record in event['Records']:

        # Get Bucket and Key
        bucket = record['s3']['bucket']['name']
        key    = record['s3']['object']['key']

        # Print the bucket & key to the logs
        print(bucket, key)

        # Download object
        local_filename = '/tmp/' + key
        s3_client.download_file(bucket, key, local_filename)

        # Print contents to log (just to demonstrate concept)
        for line in open(local_filename):
            print(line)

        # Delete file when done, to clear space for future execution
        os.remove(local_filename)

Создайте событие Amazon S3 в корзине, чтобы активировать эту лямбда-функцию, и она напечатает имя файла и содержимоефайл в журналы CloudWatch.Это должно быть хорошим тестом, чтобы определить, соответствует ли программа вашему коду или разрешениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...