5

Я использую конвейер обработки данных, выполненный изAccess Denied с помощью boto3 через AWS Lambda

S3 + SNS + Lambda

еще потому S3 не может отправить notificaiton из своего региона хранения, так что я использовал SNS для отправки S3 для Лямбды в другом регионе.

Функция лямбда закодированы с

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 

, когда я пытался сохранить и тест, я получил следующее сообщение об ошибке

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

Я настроил лямбда роль с

full S3 access 

и набор ведро на моем целевом ковше

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

Кажется, что я не установил политику хорошо.

ответ

3

Возможность конкретного объекта S3, который вы ищете, имеющих ограниченные разрешения

+1

Это довольно расплывчато. Не могли бы вы указать, как можно решить эту проблему? –

+1

Две возможности 1. Разрешение на уровне объекта S3 для чтения отрицается 2. Роль, связанная с лямбдой, не имеет разрешения на получение/чтение объектов S3. – omuthu

+0

Для меня это помогло добавить в политику политику 's3: GetObject'. –

10

У меня была аналогичная проблема, я ее решил, прилагая соответствующую политику моему пользователю.

IAM -> Users -> Username -> Permissions -> Attach policy.

Также убедитесь, что вы добавили правильный ключ доступа и секретный ключ доступа, вы можете сделать это с помощью AmazonCLI.

1

Добавление ответа АМРИ в, если ведро приватным и у вас есть учетные данные для доступа к нему можно использовать 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') 

* Для этого файла: s3: // ведро/а/b/c/some.text, Ведро - это «ведро», а ключ «a/b/c/some.text»

Смежные вопросы