1. はじめに
ある AWS アカウントの Amazon S3 バケットに保管されたデータを別の AWS アカウントの Amazon S3 バケットに定期的にコピーさせるためのセットアップ例です。
前回記事では AWS CloudShell を利用して「オンデマンド (手動)」で同期する手法をご紹介していましたが、今回はその応用編となる自動化 (バッチ処理) となります。
前提条件 (S3 バケット A へのアクセス制限)
今回は次のような特定の条件に向けて、AWS CLI を活用して S3 間でデータを「定期的に自動」で同期する手法をご紹介します。
- AWS アカウント A の Amazon S3 および他の AWS リソースに関する操作、変更は一切実施できない
- AWS アカウント A の S3 バケット A には、AWS アカウント B のユーザーだけがデータ取得 (List/Get) できる
異なる AWS アカウント (クロスアカウント) 環境において S3 バケットのデータを自動取得する手法は数多く存在しますが、今回は上記の条件によって実現する手法はいくつか限られます。
パッと思いつくけど実装できない NG 例
- Amazon S3 の機能である S3 Replicaiton は送信元 (AWS アカウント A) 側での作業が必要
- AWS Data Sync によるデータ同期は送信元 (AWS アカウント A) 側での作業が必要
- etc..
AWS アカウント A の S3 バケット A のバケットポリシー (実際の例)
{
"Effect": "Allow", "Principal": {
"AWS": "arn:aws:iam::<AWS アカウント B>:root" },
"Action": [ "s3:List*","s3:Get*" ],
"Resource": ["arn:aws:s3:::<バケット A>","arn:aws:s3:::<バケット A>/*"]
}
補記しておくと「root」と指定されていますが、実際には AWS アカウント全体 (ここでは 123456789) を意味しています。
{
"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
(参考) AWS JSON ポリシーの要素: Principal
つまり AWS アカウント「ルートユーザー」である必要はなく、指定されている「AWS アカウント全て」を対象にしています。もちろん今回の場合は S3 関連の操作をする権限 (S3 Get / List) は最低限必要となります。
2. 実装手順
今回の構成はとてもシンプルで原始的です。
s3sync
という便利な Amazon S3 の同期用の AWS CLI コマンドがあり、それを cron ジョブで定期実行 (バッチ処理) させます。
今回は AWS CLI 実行環境として新規で Amazon EC2 (Amazon Linux 2023) を作成しましたが、AWS CLI さえ定期実行できれば良いので代替案はいくつもありそうです。
ほかに思いついた代替ソリューション案
いずれも今回の実装例としてご紹介はしませんが、下記のような手法がありそうです。
-
Linux OS ではなく Windows OS のタスクスケジューラー機能で AWS CLI を定期実行する
-
Amazon EC2 ではなくオンプレミスのサーバーで AWS CLI を定期実行する
-
AWS Lambda 関数として "s3sync" もしくは同様な S3 同期処理を実装し、Amazon EventBridge で定期実行する
考えてみると他にも実装手法はありそうなので、環境や要件に応じて試していただければと思います。
2-1. データ送信先の S3 バケット作成
データ送信先の S3 バケットは、データ送信元の S3 バケットと同じリージョンで作成します。
2-2. Amazon EC2 の作成
バッチジョブ実行にしか利用しないので安価な t3.nano
を選択しています。(2024 年 10 月時点でオンデマンド利用が月額約 4.9 USD、1 時間 0.0068 USD です。)
OS には Amazon Linux 2023 を選択したので、AWS CLI v2
がプリセットされています。
次のステップでは AWS CLI
から AWS アカウント (AWS IAM ユーザー
) へのアクセスのためにアクセスキー
とシークレットアクセスキー
が必要とります。未作成の場合は次を参考にしてください。
アクセスキーとシークレットアクセスキーの取得 (未取得の場合)
今回は検証ということでアクセス許可は比較的ゆるめになっています。
ただし本番環境で利用される際にはアクセス許可を必要最低限に絞ってより厳しくするなど、AWS IAM でのセキュリティのベストプラクティスに準拠することを推奨します。
未作成の場合、AWS IAM ユーザーを作成していきます。
AmazonS3FullAccess
のポリシーをアタッチします。
アクセスキーを作成
を実行します。
コマンドラインインターフェイス (CLI)
を選択します。
アクセスキー
とシークレットアクセスキー
をコピーします。
2-3. AWS CLI の初期セットアップ
AWS CLI を実行する環境 (Amazon EC2 Linux) に AWS IAM ユーザーのアクセスキー、シークレットアクセスキーを登録します。
$ sudo su
$ aws configure
AWS Access Key ID [None]: <アクセスキー>
AWS Secret Access Key [None]: <シークレットアクセスキー>
Default region name [None]: ap-northeast-1
Default output format [None]:
$ aws configure
2-4. cron ジョブのセットアップ
Amazon Linux 2023
AMI には cronie
パッケージがデフォルトでは入っていないのでインストールします。
$ sudo yum install cronie -y
...
Complete!
5 分おきに s3sync
を実行するように設定します。
$ sudo crontab -e
*/5 * * * * aws s3 sync <source> <target>
# <source> は 送信元 S3 バケットの ARN
# <target> は 送信先 S3 バケットの ARN
$ sudo crontab -l
下図は設定されている cron ジョブです。
$ sudo service crond restart
$ systemctl crond.service
Active: active (running) と表示されているので、 cron サービスは正常に実行中であると確認できます。
2-5. Amazon S3 同期の確認
いくつかのファイルとフォルダを送信元 S3 バケットにアップロードを続け、そのあと送信先 Amazon S3 バケットを確認しました。
想定通り 5 分間隔で同期されていました。これで完了です!
3. まとめ
ある特定のアクセス環境下において、異なる AWS アカウント同士での Amazon S3 のデータ同期を自動で定期実行する手法についてご紹介しました。
4. 関連ブログ
応用編として、Amazon S3 のデータ同期をメール通知させる手法について紹介しています。
AWS CLI を AWS CloudShell 経由で手動実行する方法はこちらです。