У меня есть два разных профиля на 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.