Help us understand the problem. What is going on with this article?

[AWS] boto3でLambdaとS3を連携させる

More than 3 years have passed since last update.

はじめに

AWS Lambdaでテンポラリファイルを作成し、それをS3にアップロード。さらに、S3にアップロードしたファイルを元の場所にダウンロード、というグルグルをやってみます。

システム構成

        Lambda_S3.png

  1. /tmp/log/sess/ にファイルを作成し、ディレクトリを /tmp/sess-info.tar にアーカイブします。
  2. S3<bucket>に sess-info.tar をアップロードします。
  3. /tmp/sess-info.tar を削除し、S3<bucket>のsess-info.tar/tmp/sess-info.tarにダウンロードします。
  4. /tmp/log/sess/ が存在すれば削除し、sess-info.tar/tmp/log/sess/ に展開します。

Lambda Code

import boto3
import os
import os.path
import tarfile
import shutil

def lambda_handler(event, context):
    bucket_name = 'bucket_name'
    tmp_dir = '/tmp/'
    log_dir = '/tmp/log/sess/'
    file_name = 'sess-info.tar'

    key = file_name
    file_path = tmp_dir + file_name

    # === Step 1
    # create log dir
    if os.path.exists(log_dir) == False:
        os.makedirs(log_dir)

    # write log
    with open(log_dir + 'log1.txt', 'w') as file:
        file.write('hoge\n')
    with open(log_dir + 'log2.txt', 'w') as file:
        file.write('fuga\n')

    # create log archive
    with tarfile.open(file_path, mode='w:gz') as archive:
        archive.add(log_dir)

    # === Step 2
    # create s3 resource
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(bucket_name)

    # upload log archive
    bucket.upload_file(file_path, key)

    # === Step 3
    # delete log archive
    if os.path.exists(file_path):
        os.remove(file_path)

    # download log archive
    bucket.download_file(key, file_path)

    # === Step 4
    # delete log dir
    if os.path.exists(log_dir):
        shutil.rmtree(log_dir)

    # extract log archive
    with tarfile.open(file_path, mode='r:gz') as archive:
        archive.extractall('/')

bucket_name は適宜、設定してください。

Lambda Configuration

  • Runtime: Python 2.7
  • Handler: lambda_function.lambda_handler
  • Role: Choose an existing role
  • Existing role: AmazonS3FullAccess
  • Memory(MB): 128
  • Timeout: 0 min 10 sec

※ LambdaとS3を連携させる場合、Lambdaにroleを設定するだけで連携可能でした。SessionにAccess Key Id,Secret Access Keyを指定したり、S3のアクセス許可を設定したりする必要はありませんでした。

S3 Bucket

Lambda Codeのbucket_nameと同じ名前のBucketを作成します。

おわりに

Lambdaは、ステートレスに設計するのが基本ですが、ステートフルなデータにアクセスしたくなるケースもあります。
そんな場合は、下記をうまく利用して対応します。

  • Lambdaの/tmp ディレクトリに 500 MBまでのテンポラリファイルを作成可能
  • Amazon S3と連携
  • Amazon DynamoDBと連携

今回は、Lambdaの/tmpディレクトリとS3を利用する例でした。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away