0
0

S3バケットのファイル内容をLambdaで書き換えて別バケットにアップロードする

Last updated at Posted at 2024-09-10

はじめに

本記事では、S3バケットにファイルがアップロードされたときにLambdaを使用でそのファイル内容を修正し、別のバケットにファイルをアップロードする方法について実装します。

ゴール

image.png

S3バケットにファイルをアップロードした際に、LambdaでS3バケットからファイルを取得し、内容を修正したファイルを別のS3バケットにアップロードする

前提

下記2つのS3バケットは事前に作成しておきます。

  • ファイルダウンロード元のバケット(本記事では変数 source_bucket
  • 修正されたファイルのアップロード先となるバケット(本記事では変数 upload_bucket

また、LambdaにはS3へのIAM設定をしておきます。

環境

Python 3.12

Lambda関数の作成

コンソール画面から任意の名前でLambda関数を作成します。
ダウンロード元のS3バケットからファイルをダウンロードしファイルにフルーツの名前を追加した後、別のS3バケットにアップロードします。

import boto3
import os

def lambda_handler(event, context):
    s3 = boto3.client('s3')
    # ダウンロード元のS3バケット
    source_bucket = os.environ['SOURCE_BUCKET']
    file_key = event['Records'][0]['s3']['object']['key']
    # アップロード先のバケット名
    upload_bucket = os.environ['UPLOAD_BUCKET']
    # 追加するフルーツのリスト
    fruits = ['Apple', 'Banana', 'Date', 'Elderberry', 'Fig', 'Grape']
    
    try:
        # ダウンロード元のバケットからファイルを取得
        response = s3.get_object(Bucket=source_bucket, Key=file_key)
        content = response['Body'].read().decode('utf-8')
        
        # ファイルの内容を修正(フルーツ名を追加)
        modified_content = content + "\n\nAdded fruits:\n" + "\n".join(fruits)
        
        # 修正したファイルをS3バケットにアップロード
        s3.put_object(Bucket=upload_bucket, Key=file_key, Body=modified_content)
        print('アップロード完了')
        
        return {
            'statusCode': 200,
            'body':f'ファイル {file_key} のアップロードが成功しました。'
        }
    except Exception as e:
        print(e)
        return {
            'statusCode': 500,
            'body': f'ファイル {file_key} の処理中にエラーが発生しました: {str(e)}'
        }

S3側の準備

ファイルダウンロード元のS3バケット > プロパティを選択。

image.png

下にスクロールし「イベント通知の作成」をクリックします。

image.png

イベント名を任意の名前で設定し、イベントタイプはputチェックをいれておきます。

image.png

S3のイベント通知の設定において、イベントタイプは put の場合はファイルの新規アップロードの場合でもイベントは実行されます。

対象のLambda関数まで選択できたら 変更の保存 を押下して保存します。

image.png

動作確認

ファイルの初回アップロードと更新アップロードで動作確認を確認します。

ファイルの初回アップロード時

下記内容のsample.txtファイルをダウンロード元のバケットにアップロードして、Lambdaが動くかどうか確認します。

sample.txt
サンプルほげほげ

S3にファイルをアップロードすると、CloudWatchにログがはかれてアップロード先のS3バケットにもファイルがアップロードされてる事が確認できました。

image.png

アップロードされたファイル
サンプルほげほげ

Added fruits:
Apple
Banana
Date
Elderberry
Fig
Grape

ファイルの更新アップロード時

ファイル更新時にLambdaが動き対象のS3バケットにファイルがアップロードされるか確認します。
一度アップロード先のS3バケットのファイルを削除し、再度 sample.txtファイルをダウンロード元のバケットにアップロードしてみると初回アップロードと同様の結果を確認できました。

image.png

アップロードされたファイル
サンプルほげほげ

Added fruits:
Apple
Banana
Date
Elderberry
Fig
Grape
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0