AWS DataSync + Amazon EventBridgeでS3とEFSを5分置きに同期してみた

2022.09.30

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

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

今回は、AWS DataSyncとAmazon EventBridgeを使ってS3とEFSを5分置きに同期してみようと思います。

なぜAmazon EventBridgeが必要?

AWS DataSync単体でもマネージドに定期的な同期処理が可能です。

ただ、スケジュールされたタスクは最短でも1時間以上間隔を空けて実行する必要があります。

従って、1時間よりも短い間隔で実行したい場合は、今回のようなLambda + EventBridgeを利用した構成が必要になってきます。

注意点

DataSyncの各タスクにおける同時実行数は「1つ」までです。

今回、5分間隔でEventBridgeを発火させ同期処理を行います。同時実行数は1つまでのため、同期処理が5分を超える場合は、後続で実行したタスクはエラーを返します。

エラーを返したタスクは、再度実行処理は行わないためエラーを返したタスクから5分後に実行されるタスクで同期処理が行われる仕組みとなっています。

そのため、同期処理がEventBridgeで設定した間隔内に間に合うように間隔をコントロールしましょう。

S3 to S3で試してみたい場合は、次のブログを参考にしてみてください。

やってみた

今回は検証で以下の構成を作成してみました。

利用したコードは次のGithubに保管しています。

コードの大半を同僚ののんピさんのブログを参考にさせていただきました。この場を借りて感謝です。

DataSyncを確認

作成されたDataSyncを確認してみます。履歴から確認する限り5分置きに問題なく完了していることがわかります。

EC2でファイル作成

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を確認すると、EFSに作成されたランダムなファイルがDataSyncによって同期されていることが確認できます。

詰まった点

再掲になりますが、今回は2つのブログを参考にEFSとS3間の定期的な同期処理を行いました。

今回、同期を行った対象にEFSが含まれていたため、S3間同期と異なりDataSyncのタスク起動権限が不足して詰まりました。

InvalidRequestException: Invalid request made for describing ENI

対処法として次のstack overflowに記載されている通り、Lambda関数の権限に「ec2:DescribeNetworkInterfaces」を加えることで解消しました。

まとめ

以上、AWS DataSync + Amazon EventBridgeでS3とEFSを5分置きに同期してみたでした!

意外と簡単に実装できたので、DataSync便利だなと思いました。

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