らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

AWS S3 にアップロードされたファイルをコピー/移動する Lambda 関数

AWS S3 でファイルがアップロードされた際に、自動的にコピー (または移動) する Lambda 関数をメモしておきます。 尚、権限は適切に設定されているものとします。

ファイルをコピーするサンプル

import urllib.parse
import boto3

s3 = boto3.client('s3')
FOLDER = 'DST-FOLDER'

def lambda_handler(event, context):
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    src = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    dst = FOLDER + '/' + src.split('/')[-1]
    s3.copy_object(Bucket=bucket_name, Key=dst, CopySource={'Bucket': bucket_name, 'Key': src})

ファイルを移動するサンプル

boto3 には S3 関連でファイルの作成・削除・コピーは出来るのですが、移動用の API は存在しないようです。 その為、コピー後に元ファイルを削除することで「移動」を実装しています。

import urllib.parse
import boto3

s3 = boto3.client('s3')
FOLDER = 'DST-FOLDER'

def lambda_handler(event, context):
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    src = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    dst = FOLDER + '/' + src.split('/')[-1]
    s3.copy_object(Bucket=bucket_name, Key=dst, CopySource={'Bucket': bucket_name, 'Key': src})
    s3.delete_object(Bucket=bucket_name, Key=src)

トリガーの設定

実際にこの Lambda 関数を利用するには「S3 へファイルがアップロードされた時に実行する」というトリガー設定が必要です。 Lambda 関数を表示し +トリガーを追加 をクリックし、トリガーの追加を開始します。

f:id:sig9:20200125151259p:plain:w480

トリガーを選択 から S3 をクリックします。

f:id:sig9:20200125151304p:plain:w640

必要なパラメータを入力していきます。 バケット には対象となる S3 Bucket を選択します。 イベントタイプには すべてのオブジェクト再生イベント を選択します (仮に「ファイルが削除された時に実行したい」といった場合は異なるイベントタイプを選択します)。 プレフィックス/サフィックスには「処理対象の条件」を入力します。 今回は SRC-FOLDER/ へアップロードされたファイルのみを対象とする為、プレフィックスSRC-FOLDER/ と入力しています。 必要なパラメータを入力し、トリガーの有効化 にもチェックを入れたら 追加 をクリックし、トリガーの追加を完了します。

f:id:sig9:20200125151308p:plain:w640