Amazon EventBridge SchedulerでEFSとS3をDataSyncで5分おきに同期してみた
こんにちは!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_)でした!