2016-03-02 267 views
3

我想每次将对象上传到S3时检索一些我添加的元数据(使用控制台x-amz-meta-my_variable)。使用AWS Lambda从AWS S3访问元数据

我已经建立了拉姆达通过控制台来触发每一个对象被上传到我的桶

我想知道如果我可以使用类似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

我还没有找到什么被包括在发送给lambda函数S3事件的任何权威的文档。我的建议是记录事件,然后检查日志,看看你想要的信息是否包含在事件中。 – garnaat

+0

有关S3事件包含的文档可以在这里找到:https://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html。这是一个耻辱,元数据不包括:( – tramwaj29

回答

1

元数据是未在事件,但在头对象。

HEAD操作从对象中检索元数据而不返回对象本身。如果您只对对象的元数据感兴趣,此操作很有用。要使用HEAD,您必须具有对该对象的读取权限。

HEAD请求与对象的GET操作具有相同的选项。响应与GET响应相同,只是没有响应主体。

s3.head_object(桶=斗,关键=键)

下面的代码片段获得的元数据。

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.