課題:
Lambda内部で生成したテキストファイルをS3側で圧縮して保管できるか試してみる。
■IAM
1)ポリシーを作成する。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": "arn:aws:s3:::バケット名/*”
}
]
}
################################
2)IAMロールの作成を行う。
上記で作成したIAMポリシーを選択
■S3
1)以下、バケットポリシーの編集を行う。
########## サンプルコード ################
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::アカウントID:role/”iam role名”
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:AbortMultipartUpload"
],
"Resource": "arn:aws:s3:::バケット名/*”
}
]
}
#####################################
■Lambda
1)ソースコード入力
###########サンプルコード########
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 = ‘バケット名’ # ⑤バケット名を指定
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
###############################
2)Lambda側で上記で作成したIAM Roleを選択する。
3)Lambda側で実行後、S3のバケットで確認する
結果:
Lambda内部で生成したテキストファイルをS3側で圧縮して保管していることが把握できる。