0
0

More than 3 years have passed since last update.

クロスアカウントで s3 バケットを非同期コピーするコンテナを定時実行する

Last updated at Posted at 2020-04-09

1. はじめに

2. 構成図

20200409-01.png

3. 概要

3.1. バックアップ元側の AWS アカウント

  • AWSアカウント

  • example-1

  • アカウントID

  • 111111111111

  • バックアップ元S3バケット

  • バケット名: original-111111111111

  • 「パブリックアクセスを全てブロックする」設定をチェックする。

  • バージョニング設定は任意(停止でもよい)。

  • Role

  • Containerに割り当てる。

  • バックアップ元S3バケット original-111111111111 に対して、 「s3:ListBucket」 と 「s3:GetObject」 を許可する。

  • バックアック先S3バケット backup-222222222222 に対して、 「s3:ListBucket」 と 「s3:PutObject」 を許可する。

  • ECR

  • リポジトリ名: infra-batch-repository

  • 作業PCで作成したバックアップバッチ用のコンテナイメージを登録する。

  • ECS

  • ECSクラスター名: infra-batch

  • 起動タイプ: Fargate

  • Fargate, Container

  • CloudWatchイベントのトリガで ECR からイメージを取得して、パブリックサブネット内にコンテナを作成して、s3 sync を実行する。

  • s3 sync を実行する Container は外部ネットワークへ出ていける環境で起動する。

    • パブリックサブネット
    • Security group の アウトバウンド はすべてを許可する
    • パブリック IP の自動割り当ては 「ENABLED」 にする

3.2. バックアップ先側の AWS アカウント

  • AWSアカウント名

  • example-2

  • アカウントID

  • 222222222222

  • バックアップ先S3バケット

  • バケット名: backup-222222222222

  • 「パブリックアクセスを全てブロックする」設定をチェックする

  • バージョニング設定は任意(停止でもよい)

  • バケットポリシーで、AWSアカウント example-1(111111111111) の Role にアクセス権限を付与する。

  • バックアップオブジェクトは S3 スタンダード-IA クラスに保存する(s3 sycn 実行時に 「--storage-class STANDARD_IA」 を指定)。

4. 設定

4.1. Container に割り当てる Role を作成 (バックアップ元側の AWS アカウントでの作業)

  • IAMポリシー作成
  • 名前: s3-sync-backup
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::original-111111111111",
                "arn:aws:s3:::original-111111111111/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::backup-222222222222",
                "arn:aws:s3:::backup-222222222222/*"
            ]
        }
    ]
}
  • IAMロール作成
  • 名前: s3-sync-backup
  • 信頼されたエンティティ: ecs-tasks.amazonaws.com
  • アタッチするポリシー: s3-sync-backup

4.2. バックアップ先 S3 バケットの バケットポリシー (バックアップ先側の AWS アカウントでの作業)

  • AWSアカウント example-2 (222222222222) の S3 バケット backup-222222222222 への 「s3:ListBucket」 と 「s3:PutObject」 の許可権限を、AWSアカウント example-1 (111111111111) の Role s3-sync-backup に付与する。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:role/s3-sync-backup"
            },
            "Action": [
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::backup-222222222222",
                "arn:aws:s3:::backup-222222222222/*"
            ]
        }
    ]
}

4.3. ECR リポジトリ作成 (バックアップ元側の AWS アカウントでの作業)

  • 詳しい設定方法は割愛。
  • ここでは、「infra-batch-repository」というリポジトリを作成して利用する。

4.4. コンテナイメージを作成して、ECRへプッシュする (作業PCでの実施)

FROM amazon/aws-cli:latest
ENTRYPOINT ["aws"]
CMD ["s3","sync","--dryrun","--storage-class STANDARD_IA","s3://original-111111111111","s3://backup-222222222222"]
  • タグを付けてビルドする
$ docker build -t infra-batch-repository:s3-sync-backup .
  • ECRにプッシュするためのタグを付ける
$ docker tag infra-batch-repository:s3-sync-backup 111111111111.dkr.ecr.ap-northeast-1.amazonaws.com/infra-batch-repository:s3-sync-backup
  • AWS ECR レジストリ用の docker login 認証コマンド文字列(12時間有効な認証トークン)を取得する
$ aws ecr get-login --no-include-email
$ docker login -u AWS -p 認証トークン
  • イメージを ECR へ プッシュする
$ docker push 111111111111.dkr.ecr.ap-northeast-1.amazonaws.com/infra-batch-repository:s3-sync-backup

4.5. ECSクラスター作成 (バックアップ元側の AWS アカウントでの作業)

  • 「AWS Fargate を使用」 を利用する。
  • クラスター名
  • infra-batch

4.6. タスク定義を作成

20200409-02.png

20200409-03.png

20200409-04.png

20200409-05.png

20200409-06.png

20200409-07.png

確認
20200409-08.png

4.7. タスクスケジュールを作成

20200408-09.png

20200409-09.png
20200409-10.png
20200409-11.png
Cron式の設定は UTC なので、 cron(0 19 * * ? *) は日本時間で 毎日04:00
サブネットは、任意のパブリックサブネットを指定する
セキュリティグループは、アウトバウンドをすべて許可の設定になっている任意のものを指定する。
パブリック IP の自動割り当ては「ENABLED」にする。

確認
20200409-12.png
※CloudWatch のイベントルールや、Amazon EventBridge のイベントルールにも設定が反映される。

5. タスク実行のログ

  • 実行ログは CloudWatch のロググループの /ecs/s3-sync-backup に出力される
  • ログの例

    20200409-13.png

6. 注意点

  • s3 sync の動作確認は、--dryrun オプションを付けて実行し、実行ログから挙動が正しいか確認する。

  • --dryrun: Displays the operations that would be performed using the specified command without actually running them.

  • バックアップ元のS3バケットのオブジェクト数やサイズが多い場合は、最初の s3 sync (フルサイズバックアップ)は作業PC上から s3 sync を実行した方がよい。

$ s3 sync --dryrun --storage-class STANDARD_IA s3://original-111111111111 s3://backup-222222222222
<ログ確認>
$ s3 sync --storage-class STANDARD_IA s3://original-111111111111 s3://backup-222222222222
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0