web-dev-qa-db-ja.com

AWSLambdaを使用してAWSS3からメタデータにアクセスする

オブジェクトをS3にアップロードするたびに、(コンソールx-amz-meta-my_variableを使用して)追加したメタデータを取得したいと思います。

オブジェクトがバケットにアップロードされるたびにトリガーするようにコンソールからラムダを設定しました

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
7
Y Anderson

メタデータはイベントではなく、headオブジェクトにあります。

HEAD操作は、オブジェクト自体を返さずにオブジェクトからメタデータを取得します。この操作は、オブジェクトのメタデータのみに関心がある場合に役立ちます。HEADを使用するには、オブジェクトへのREADアクセス権が必要です。

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.
6
Amit

バケットとキーを含むオブジェクトを渡す必要があるheadオブジェクトからメタデータを取得できます。-例:以下は、メタデータを取得するために使用する必要のあるコード(NodeJ内)です。 aws-sdkから生成するときに、pre-signedUrlに添付されます。

//for generating pre-signed url with meta data
exports.getSignedUrl = async (myKey, metadata) => {
  const signedUrlExpireSeconds = 20000;
  const params = {
    Bucket: BUCKET,
    Key: myKey,
    Expires: signedUrlExpireSeconds,
    /* ACL: 'bucket-owner-full-control', ContentType:'image/jpeg', */
    ContentType: 'image/jpeg',
    ACL: 'public-read',
    Metadata: metadata,
  };
  const url = await s3.getSignedUrl('putObject', params);
  return url;
};
//for obtainig the meta data for the bucket and key
    const s3Object = reqBody.Records[0].s3;
    const bucketName = s3Object.bucket.name;
    const objectKey = s3Object.object.key;

    const params = {
      Bucket: bucketName,
      Key: objectKey,
    };
    const data = await s3.headObject(params).promise();
    const metadata = (!data) ? null : data.Metadata;```
1
Nishant Dwivedi