2016-03-02 5 views
3

Я хотел бы получить некоторые метаданные, которые я добавил (используя консоль x-amz-meta-my_variable) каждый раз, когда я загружаю объект в S3.Доступ к метаданным из AWS S3 с AWS Lambda

Я настроил лямбду через консоль, чтобы вызвать каждый раз, когда объект загруженный в ведро

Я интересно, если я могу использовать что-то вроде variable = event['Records'][0]['s3']['object']['my_variable'], чтобы получить эти данные, или если я должен подключить обратно S3 с ведром и ключом, а затем вызвать некоторую функцию для ее получения?

Ниже приведен код:

from __future__ import print_function 

import json 
import urllib 
import boto3 

print('Loading function') 

s3 = boto3.client('s3') 


def lambda_handler(event, context): 

    # Get the object from the event and show its content type 
    bucket = event['Records'][0]['s3']['bucket']['name'] 
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8') 

    # variable = event['Records'][0]['s3']['object']['my_variable'] 

    try: 
     response = s3.get_object(Bucket=bucket, Key=key) 

     # Call some function here? 

     print("CONTENT TYPE: " + response['ContentType']) 
     return response['ContentType'] 

    except Exception as e: 
     print(e) 
     print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) 
     raise e 
+2

Я не нашел какое-либо авторитетное документацию на то, что включается в событиях S3, посланных к функции лямбды. Мое предложение состояло в том, чтобы зарегистрировать событие, а затем проверить журнал, чтобы узнать, включена ли информация в событие. – garnaat

+0

Документацию о том, что входит в события S3, можно найти здесь: https://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html. Жаль, что метаданные не включены :( – tramwaj29

ответ

1

Метаданные не в случае, но в объекте головы.

Операция HEAD извлекает метаданные из объекта, не возвращая сам объект. Эта операция полезна, если вас интересуют только метаданные объекта. Чтобы использовать HEAD, вы должны иметь READ-доступ к объекту.

Запрос HEAD имеет те же параметры, что и операция GET на объекте. Ответ идентичен ответу GET, за исключением того, что нет тела ответа.

s3.head_object (ведро = ведро, Key = ключ)

Ниже код сниппет, чтобы получить метаданные.

from __future__ import print_function 
import boto3, logging 

s3 = boto3.client('s3') 
logger = logging.getLogger() 
logger.setLevel(logging.INFO) 

def lambda_handler(event, context): 
    for record in event['Records'] 
    bucket = record['s3']['bucket']['name'] 
    key = record['s3']['object']['key'] 
    response = s3.head_object(Bucket=bucket, Key=key) 

    logger.info('Response: {}'.format(response)) 

    print("Author : " + response['Metadata']['author']) 
    print("Description : " + response['Metadata']['description']) 

Выход:

[INFO] 2016-05-18T01:30:47.900Z 241f0cfc-1c98-12e6-b9a7-cf406f32a0dc Response: {u'AcceptRanges': 'bytes', u'ContentType': 'binary/octet-stream', 'ResponseMetadata': {'HTTPStatusCode': 200, 'HostId': 'K8JMVbEt5xA+qXuXOedb1y5nxuv6scMXnNH/rHVtxcg=', 'RequestId': 'D05BE92E55E0'}, u'LastModified': datetime.datetime(2016, 5, 17, 22, 54, 37, tzinfo=tzutc()), u'ContentLength': 94320, u'ETag': '"0e4d457d912bce9ff81952"', u'Metadata': {'author': 'Satyajit Ray', 'description':'He was an Indian filmmaker, widely regarded as one of the greatest filmmakers of the 20th century.'}} 
Author : Satyajit Ray 
Description : He was an Indian filmmaker, widely regarded as one of the greatest filmmakers of the 20th century. 
Смежные вопросы