Amazon EventBridge SchedulerでEFSとS3をDataSyncで5分おきに同期してみた

2022.11.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!AWS事業本部コンサルティング部のたかくに(@takakuni_)です。

今回は、Amazon EventBridge SchedulerでEFSとS3をDataSyncで5分おきに同期してみようと思います。

DataSyncでEventBridgeを利用する理由などは以下のブログに記載しています。本エントリをご覧いただく前に、ご一読いただけると背景が理解しやすいと思います。

どのように変わったの?

Amazon EventBridge Scheduler登場前は、EventBridgeからLambdaを発火させDataSyncタスクを作成する構成でした。

Amazon EventBridge Schedulerの登場後、直接DataSync APIを実行できるようになったため、DataSyncを実行するLambdaが必要なくなりました。(シンプルにLambdaの運用コストがなくなりました。)

やってみた

実際にどのように作成するのかイメージつけるために検証してみます。

EventBridge Scheduler以外の部分の作成

まずは、EventBridge Scheduler以外の部分を作成します。

コードは以下になります。5-6分くらいで作成が完了します。

AWS CDKでcdk deployを実行します。

git clone https://github.com/takakuni-classmethod/transfer-files-from-efs-to-s3-with-datasync-and-eventscheduler.git
cd transfer-files-from-efs-to-s3-with-datasync-and-eventscheduler
npm install
cdk deploy

EventBridge Schedulerの作成

EventBridge Scheduler作成画面から、Schedulerの作成を行います。5分おきに設定するため、rate式を今回は採用しました。

検索窓から「DataSync」、「StartTaskExecution」を入力しターゲットを選択します。

「TaskArn」パラメータは、CloudFormationの出力タブに表示されたARNを利用します。

アクセス許可で指定するロールは、AWS CDKで作成されたロールを指定します。

IAMロールについて補足

信頼関係は「scheduler.amazonaws.com」を許可する必要があります。

従来のEventBridge用のロールと異なるのが特徴です。(EventBridgeルールの場合は、events.amazonaws.com

改修する場合は、別途ロールの作成または、信頼関係ポリシーを変更する必要があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "scheduler.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

動作確認

EC2でファイル作成

EventBridge Schedulerの設定が完了したため、動作確認を行います。

EFSをマウントしたEC2でEFS内にランダムなファイルを作成してみます。

# EFSをマウントしていることを確認
df -hT
# ランダムなバイナリファイルを100個作成
for i in {1..100}; do
sudo dd if=/dev/urandom of=/mnt/efs/random_block_file_"${i}" bs=1M count=128
done
# ファイルが作成されたことを確認
ls -lrt /mnt/efs/

S3バケットを確認

数分待ちS3バケットを確認すると、EC2で作成したファイルが同期されていることが確認できました。

EventBridge SchedulerのIAMポリシーについて

同期先にEFSを指定するためdatasync:StartTaskExecution以外に、ec2:DescribeNetworkInterfaces権限も必要でした。

Lambdaから実行する際も同じケースに遭遇したためdatasync:StartTaskExecutionの裏でec2:DescribeNetworkInterfacesが動いているのではないかと思います。

S3間の同期の場合は必要ないため、ロケーションごとに適切に権限を設定しましょう!

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "datasync:StartTaskExecution",
            "Resource": "タスクARN",
            "Effect": "Allow"
        },
        {
            "Action": "ec2:DescribeNetworkInterfaces",
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

まとめ

以上、Amazon EventBridge SchedulerでEFSとS3をDataSyncで5分おきに同期してみたでした。

単一API呼び出しのために利用しているLambda等は、Amazon EventBridge Schedulerにかなり置き換えれそうな印象でした。(他のユースケースも発掘していこうと思いました。)

以上、AWS事業本部コンサルティング部のたかくに(@takakuni_)でした!