使用AWS Lambda从AWS S3访问元数据 [英] Accessing Meta Data from AWS S3 with AWS Lambda

查看:245
本文介绍了使用AWS Lambda从AWS S3访问元数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每次将对象上载到S3时,我想检索添加的一些元数据(使用控制台x-amz-meta-my_variable).

I would like to retrieve some meta data I added (using the console x-amz-meta-my_variable) every time I upload an object to S3.

我已经通过控制台设置了lambda,以在每次将对象上传到存储桶时触发

I have set up lambda through the console to trigger every time an object is uploaded to my bucket

我想知道是否可以使用variable = event['Records'][0]['s3']['object']['my_variable']之类的东西来检索此数据,或者是否必须使用存储桶和键将其连接回S3,然后调用某些函数来检索它?

I am wondering if I can use something like variable = event['Records'][0]['s3']['object']['my_variable'] to retrieve this data or if I have to connect back to S3 with the bucket and key and then call some function to retrieve it?

下面是代码:

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

推荐答案

元数据不是在事件中,而是在头对象中.

The metadata is not in the event but in the head object.

HEAD操作从对象检索元数据,而不返回对象本身.如果您仅对对象的元数据感兴趣,则此操作很有用.要使用HEAD,您必须具有对该对象的READ访问权限.

The HEAD operation retrieves metadata from an object without returning the object itself. This operation is useful if you are interested only in an object's metadata. To use HEAD, you must have READ access to the object.

HEAD请求与对象的GET操作具有相同的选项.除了没有响应主体之外,该响应与GET响应相同.

A HEAD request has the same options as a GET operation on an object. The response is identical to the GET response except that there is no response body.

s3.head_object(Bucket = bucket,Key = key)

下面的代码是获取元数据的代码段.

Below code is a snippet to get the metadata.

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.

这篇关于使用AWS Lambda从AWS S3访问元数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆