DataSync タスクで S3 イベント通知をトリガー!Lambda 関数との連携を試してみた

DataSync タスクで S3 イベント通知をトリガー!Lambda 関数との連携を試してみた

Clock Icon2024.11.01

こんにちは。テクニカルサポートチームのShiinaです。

はじめに

S3 イベント通知を利用してバケットにオブジェクトが作成されたイベントをトリガーに Lambda 関数を実行して何らかの処理を行うといったケースがよくあります。
DataSync タスクを利用して S3 バケットへデータ転送した場合においても S3 イベント通知を利用できるの検証してみました。

結論

DataSync では S3 の PutObject API が利用されるため、S3 にオブジェクトが転送された場合でも、S3 イベント通知を利用できます。

やってみた

DataSync タスクを利用し、 S3 バケット間でデータを転送を行います。
送信先のバケットに S3 イベント通知の設定を行い、Lambda 関数がトリガーできるか検証してみました。

S3 バケット作成

DataSync タスクを利用してオブジェクトの転送を行うため、送信元と送信先となるバケットの作成およびテストオブジェクトを配置しておきます。

  • 送信元
    テストオブジェクト:data1.txt、data2.txt、data3.txt

datasync-s3-test-from配置

  • 送信先
    datasync-s3-test-to作成

Lambda 関数作成

S3 イベント通知の際に呼び出す Lambda 関数を用意します。
動作検証用として、S3 イベント情報を取得し、ファイルの内容をログに出力する関数を利用しました。

lambda_function.py
import json
import boto3

def lambda_handler(event, context):
    # S3イベント情報を取得
    s3_event = event['Records'][0]['s3']
    bucket_name = s3_event['bucket']['name']
    object_key = s3_event['object']['key']

    print(f"New object created in bucket: {bucket_name}, key: {object_key}")

    # S3オブジェクトの内容を取得して処理する
    s3_client = boto3.client('s3')
    response = s3_client.get_object(Bucket=bucket_name, Key=object_key)
    file_content = response['Body'].read().decode('utf-8')

    print(f"File content: {file_content}")

    return {
        'statusCode': 200,
        'body': json.dumps('Lambda executed successfully!')
    }

S3 イベント通知設定

送信先となるバケットにS3 イベント通知設定を行います。
イベントタイプ:s3:ObjectCreated:Put
送信先:Lambda 関数

イベント通知を作成1

イベント通知を作成2

Data Sync タスク作成

Data Sync サービスのコンソールのメニュー[タスク]より[タスクの作成]をクリックし、ロケーションタイプを S3 とした送信元ロケーション、送信先のロケーションを作成します。

s3datasynctask

Data Sync タスク開始

[開始]より[デフォルトから開始する]を選択し、手動でタスクを開始させます。

s3datasynctask-タスク-DataSync-ap-northeast-1-10-29-2024_03_00_PM

しばらくするとステータスが成功に変わります。

exec-0dd00e733ab0ebfd7-s3datasynctask-履歴-DataSync-ap-northeast-1-10-29-2024_02_59_PM

データ転送の確認

タスクのログ記録先の CloudWatch ロググループを確認してみます。
転送されたことを示すログメッセージが確認できます。

CloudWatch-ap-northeast-1-10-29-2024_03_15_PM

送信先となるバケットを確認してみます。
3つのファイルが作成されています。

datasync-s3-test-to-タスク実行後

S3 イベント通知による Lambda 関数呼び出し確認

Lambda 関数のメトリクスを確認してみます。
S3 イベントにより Lambda 関数が呼び出され、Invocations メトリクスが記録されていることがわかります。

DataSyncEventFunction-関数-Lambda-10-29-2024_03_16_PM

まとめ

DataSync タスクを利用して S3 バケット間でデータを転送した際、S3 イベント通知を使って Lambda 関数をトリガーできるかを検証してみました。
S3 の PutObject API を使用してデータを転送するため、S3 イベント通知が可能です。
DataSync タスクと S3 イベント通知を活用した連携の仕組みが実現できます。

本記事が誰かのお役に立てれば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/EventNotifications.html
https://docs.aws.amazon.com/datasync/latest/userguide/create-s3-location.html#create-s3-location-s3-requests-made

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.