大柳です。
「AWS Lambdaの基本コード」シリーズ、第3回目はLambdaでファイルを圧縮してS3に保存してみます。
前回記事
【AWS Lambdaの基本コードその2】 S3へのファイル保存
今回の構成
Lambdaが起動されると、テキストの内容をS3にgz形式で圧縮して保存します。
ローカルの/tmpディレクトリへテキストファイルを一時保存、gz形式に圧縮してからS3にファイルを保存します。
コード
コードは以下のようになります。
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 |
# ①ライブラリのimport import boto3 from datetime import datetime import gzip import shutil print('Loading function') # ②Functionのロードをログに出力 s3 = boto3.resource('s3') # ③S3オブジェクトを取得 # ④Lambdaのメイン関数 def lambda_handler(event, context): bucket = 'kctestcb' # ⑤バケット名を指定 prefix = 'test_' + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # ⑥保存するファイルのprefixを指定 file_name = prefix + '.txt' #⑦保存するテキストファイル名 key = prefix + '.txt.gz' #⑧保存するgzファイル名 file_contents = 'Lambda test' # ⑨ファイルに保存するテキストの内容 # ⑩/tmpにtxtファイルを出力 with open('/tmp/' + file_name, 'w') as f: f.write(file_contents) # ⑪/tmpにgzファイルを作成 with open('/tmp/' + file_name, 'rb') as f_in: with gzip.open('/tmp/' + key , 'wb') as f_out: shutil.copyfileobj(f_in, f_out) obj = s3.Object(bucket,key) # ⑫バケット名とパスを指定 obj.upload_file( '/tmp/' + key ) # ⑬gzファイルをS3に出力 return |
コードの説明
コードの内容は以下の通りです。
①ライブラリのimport…今回の処理に必要なライブラリを指定してインポートする。
②Functionのロードをログに出力…Lambdaのコードがロードされたことが分かるようにログにメッセージを出力する。
③S3オブジェクトを取得…boto3ライブラリからS3にアクセスできるようにするおまじない。
④Lambdaのメイン関数…S3にファイルが格納されると、この関数が実行される。
⑤バケット名を指定…ファイルを保存するバケット名を指定する。
⑥保存するファイルのprefixを指定…ファイル名の頭に付ける文字を指定する。
⑦保存するテキストファイル名…/tmpに一時保存するファイルの名前を設定する。
⑧保存するgzファイル名…/tmpに一時保存するgzファイルの名前を設定する。
⑨ファイルに保存するテキストの内容…出力する内容です。今回はテキスト「Lambda test」を出力させます。
⑩/tmpにtxtファイルを出力…test_日時(YYYY-mm-dd-HH-MM-SS).txtに「Lambda test」を出力する。
⑪/tmpにgzファイルを作成…test_日時(YYYY-mm-dd-HH-MM-SS).txt.gzに圧縮ファイルを出力する。
⑫バケット名とパスを指定…保存先のバケットとパスを設定する。
⑬gzファイルをS3に出力…/tmpにあるgzファイルをS3にアップロードする。
実行結果
Lambdaのコードエディタの上部にある[保存してテスト]をクリックすると、テスト実行されます。
指定したS3バケットを確認すると、test_日時(YYYY-mm-dd-HH-MM-SS).txt.gz が出力されていることが確認できました。
ダウンロードしてLhaplusなどで解凍すると、「Lambda test」が保存されたテキストファイルを確認できます。
まとめ
S3上にあるファイルを圧縮して容量を節約したい、といった要件があった時に、サーバを構築しなくても今回のようにLambdaを使ってファイル圧縮することができます。今流行りのサーバレス構成を簡単に実現することができます。
次回はS3のバケット一覧、バケット内のオブジェクト一覧を取得してみます。
次回記事
【AWS Lambdaの基本コードその4】 S3のバケット、オブジェクト一覧を取得する