こんにちは、オカザキです。
今回はAWSのLambdaを使ってS3にアップロードされたファイルを圧縮(zip化)したいと思います。
処理の流れ
・処理の流れは以下のとおりです
Lambda 関数作成
さっそくLambdaの関数を作っていきたいと思います
関数の基本情報
関数名:s3_zip_function1(なんでもOKです)
ランタイム:Python 3.7
アクセス権限の実行ロールとして「AmazonS3FullAccess」を付与したロールを使用しています
トリガーの設定
今回はS3バケットの「input」フォルダ内にアップロードされたファイルのzip化を行いますので、
プレフィックスに「input/」を指定しています
※注意点※
すでに同一バケットにファイルアップロードを検知するLambda関数が作成されている場合、トリガーとして設定できないため注意が必要です
サンプルソース
inputフォルダにアップロードされたファイルをzip化してoutputフォルダにアップロードしています
※注意点※
/tmp フォルダ内に格納するファイルは起動のたびに異なるファイル名とする必要があります。
LambdaではAWSのコンテナで動作して同一関数でそのコンテナを使い回す場合があるため、毎回同一ファイル名だとエラーが発生してしまう可能性があります
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
import urllib.parse
import datetime
import boto3
import zipfile
import os.path
print('Loading function...')
s3 = boto3.resource('s3')
s3_cli = boto3.client('s3')
def lambda_handler(event, context):
now = datetime.datetime.now()
fileNameDateTime = now.strftime('%Y%m%d_%H%M%S')
zipFileName = '/tmp/zipfile_' + fileNameDateTime + '.zip'
try:
# Get bucket name and uploaded file path
print('Getting bucket name and uploaded file path...')
input_bucket = event['Records'][0]['s3']['bucket']['name']
input_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
# Get file name and extension
print('Getting file name and extension...')
root, ext = os.path.splitext(input_key.replace("input/",""))
uploadZipFileName = 'output/' + root + '_' + fileNameDateTime + '.zip'
file_path = '/tmp/originalFile_' + fileNameDateTime + ext
# Get bucket object
print('Getting bucket object...')
bucket = s3.Bucket(input_bucket)
# Download s3 file
print('Downloading s3 file...')
bucket.download_file(input_key, file_path)
# Zip uploaded file
print('Zipping uploaded file...')
with zipfile.ZipFile( zipFileName, "w", zipfile.ZIP_DEFLATED) as zf:
zf.write(file_path, root + ext)
# Upload ziped file
print('Uploading ziped file...')
bucket.upload_file( zipFileName, uploadZipFileName)
except Exception as e:
print(e)
print('Opps, Error happened')
raise e
print('Finish function!')
|
動作確認
・S3にファイルをinputフォルダにアップロードしてみましょう
アップロードされました
・outputフォルダを確認してみましょう
zipファイルが格納されました
zipファイル名に使われている現在時刻がJSTでなくUTCとなっていますが、今回は見なかったことにしておきます(汗
・CloudWatchのログを確認してみましょう
ダウンロードして展開すると問題なくアップロードしたファイルが格納されています
(S3上では見た目上はサイズが変わっていませんが、ダウンロードすると少しだけ圧縮されていることが確認できますね)
おわりに
「圧縮してからアップロードしろよ!」と言われるかもしれませんが、要件によってはできないこともあるかもしれませんので記事を書きました。
使い道がないかもしれないプログラムに時間が割けるのはプライベートでの開発ならではですね。
実際に実装してみてLambdaのコード編集はAWSのコンソールのみで完結できるため改めて便利だなぁと感じました。
ぜひ皆様もLambdaを活用してみてください!!
以上です。