1. はじめに
ある AWS アカウントの Amazon S3 バケットに保管されたデータを別の AWS アカウントの Amazon S3 バケットにコピーする AWS CLI の実行手順です。
今回は次のような特定の条件に向けて、AWS CLI を活用して S3 間でデータを同期する手法をご紹介します。
後続の記事では S3 間のデータ同期を定期自動実行する手法についてまとめています。
前提条件 (S3 バケット A へのアクセス制限)
- AWS アカウント A の Amazon S3 および他の AWS リソースに関する操作、変更は一切実施できない
- AWS アカウント A の S3 バケット A には、AWS アカウント B のユーザーだけがデータ取得 (List/Get) できる
異なる AWS アカウント (クロスアカウント) 環境において S3 バケットのデータを自動取得する手法は数多く存在しますが、今回は上記の条件によって実現する手法はいくつか限られます。
今回は AWS CLI を手動実行する方法でデータ同期を実現します。
パッと思いつくけど実装できない 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. 実装手順
手順は非常にシンプルです。
(1) データ送信先の AWS アカウントで S3 バケットを作成し、
(2) AWS CloudShell から AWS CLI を呼び出して S3 同期のコマンドを実行します。
2-2. データ送信先の S3 バケット作成
データ送信先の S3 バケットは、データ送信元の S3 バケットと同じリージョンで作成します。
2-3. AWS CloudShell から s3 sync を実行
AWS マネジメントコンソール左下の「CloudShell」から、次の AWS CLI コマンドを実行します。
$ aws s3 sync <source> <target>
# <source> は 送信元 S3 バケットの ARN
# <target> は 送信先 S3 バケットの ARN
オプション指定なしで実行しているので同期元の S3 バケットで差分が発生した場合には同期先に差分が上書きされますが、同期元からファイルやフォルダが削除されても同期先からは削除されません。
実際の実行イメージは下図のとおりです。バケット内のファイルがフォルダごとすべて同期されています。
3. まとめ
ある特定のアクセス環境下において、異なる AWS アカウント同士での Amazon S3 のデータ同期を AWS CLI で手動で実行する手法についてご紹介しました。
4. 関連ブログ
応用編として、Amazon S3 のデータ同期をメール通知させる手法について紹介しています。
後続の記事では、Amazon S3 間のデータ同期を定期自動実行する手法についてまとめています。