やりたいこと
Lambda(python)で事前にS3バケットへアップロードしたファイルを取得し、ファイルの各メタデータであるマジックナンバーとMIMEを取り、ファイル形式を判定したい
構築
・S3バケット
・Lambda
・IAMポリシー
・IAMロール
やり方
Lambda→S3のポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": "arn:aws:s3:::*"
}
]
}
Lambdaソース
import boto3
def lambda_handler(event, context):
# S3バケットとファイルキーを指定
bucket_name = "バケット名"
object_key = "ファイル名"
# S3リソースの作成
s3 = boto3.resource('s3')
# バケットオブジェクトの取得
bucket = s3.Bucket(bucket_name)
# オブジェクトの取得
obj = bucket.Object(object_key)
# オブジェクトのメタデータを取得
mime_type = obj.content_type
print(f"MIME type: {mime_type}")
# コンテンツを取得
file_content = obj.get()['Body'].read()
print("Finished fetching object")
# ファイルの最初の100バイトを読み込む(マジックナンバーをチェックするため)
file_content = obj.get()['Body'].read(100) # 最初の100バイトを読み取る
# バイナリデータを16進数の文字列に変換
file_content_hex = file_content.hex()
# マジックナンバーに基づいてファイル形式をチェック
file_type = None
if file_content_hex.startswith('ffd8ff'):
file_type = 'JPEG'
elif file_content_hex.startswith('89504e47'):
file_type = 'PNG'
elif file_content_hex.startswith('474946'):
file_type = 'GIF'
elif file_content_hex.startswith('424d'):
file_type = 'BMP'
elif file_content_hex.startswith('66747970', 8): # HEICのマジックナンバーは9桁目から
file_type = 'HEIC'
else:
file_type = 'Unknown'
return {
'statusCode': 200,
'body': f"MIME type from S3: {mime_type}, File type detected:{file_type}, {file_content_hex}"
}