2022年4月10日日曜日

Lambda内部で生成したファイルをS3に圧縮して保管してみる。

課題:
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側で圧縮して保管していることが把握できる。







EFS(Dockerfile)の記載について注意

  Dockerfileにefsのマウントパス宛に、ファイルコピーを行うと ECSのサービス作成時に、コンテナのデプロイ失敗に(container run time error)になるので 別経由で、EFSにファイルをコピーした方が良い!! <Dockerfile> ...