Как получить файловый ключ из SNS, подключенного к S3 Bucket - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть два разных профиля на AWS. Корзина s3 и SNS находятся в профиле A, а моя лямбда-функция находится в профиле B. Когда новый файл добавляется в корзину s3, SNS запускает лямбда-функцию.

Затем лямбда-функция должна получить доступ к новому файлу и обработать его, используя pandas. Вот что я делаю сейчас:

    sts_connection = boto3.client('sts')
acct_b = sts_connection.assume_role(
    RoleArn="arn:aws:iam::**************:role/AllowS3AccessFromAccountB",
    RoleSessionName="cross_acct_lambda"
)

ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
SESSION_TOKEN = acct_b['Credentials']['SessionToken']

s3 = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, aws_session_token=SESSION_TOKEN)

path = get_file_path(event)
obj = s3.get_object(Bucket='my-bucket-name', Key=path)
csv_string = io.BytesIO(obj['Body'].read())

# Read a csv file and turn it into a DataFrame
df = pd.read_json(csv_string, delimiter=';', engine ='c', encoding= 'unicode_escape')

def get_file_path(event_body):
"""Function to get manifest path anc check if it is manifest"""
try:
    # Get message for first SNS record
    sns_message = json.loads(event_body["Records"][0]["Sns"]["Message"])
    path = sns_message["Records"][0]["s3"]["object"]["key"]
except TypeError as ex:
    logging.error("Unable to parse event: " + str(event_body))
    raise ex
return path

Все работает нормально до части s3.get_object (). Я получаю следующую ошибку:

botocore.errorfactory.NoSuchKey: An error occurred (NoSuchKey) when calling the GetObject operation: The specified key does not exist.

Может быть, я неправильно читаю ключ файла?

Редактировать: Вот как выглядит путь при отладке.

svv/sensor%3D11219V22151/year%3D2020/month%3D03/day%3D02/test.csv

И структура файла s3 такая:

sensor-data/sensor=*******/year=2020/month=03/day=02

Похоже, мне нужно использовать регулярное выражение для знаков равенства. Но должно быть более общее решение c.

1 Ответ

1 голос
/ 02 апреля 2020

Вот фрагмент кода Lambda, который напрямую запускается Amazon S3 (не через Amazon SNS):

import urllib

key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])

Вы можете попробовать подобный анализ, чтобы увидеть, он исправляет ключ.

...