この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
Amazon S3ってバックアップを取る必要があるのかな?、と思っている方もいるはずです。
かく言う私も、Amazon S3のバックアップを取得するという考え方自体、頭にありませんでした。なぜなら、Amazon S3の高耐久性やバージョニング機能があるためかもしれません。
しかし、バケット自体削除してしまった場合はどうでしょうか。
今回の記事では、誤ってAmazon S3のバケットを削除してしまったときに備え、AWS Backupを利用したAmazon S3のバックアップ方法を紹介します。
Amazon S3のバックアップをしてみる
■AWS Backupとは

Amazon S3のバックアップは、AWS Backupを利用して取得されます。
AWS Backupとは、
AWS Backup はフルマネージド型のバックアップサービスであり、AWS のサービス、クラウド内、およびオンプレミス間で簡単に一元化およびデータ保護を自動化できます。(AWS公式ドキュメントより)
2023年4月現在で、以下のAWSリソースのバックアップに使用できます。
- Amazon Elastic Compute Cloud (Amazon EC2)
- Amazon Simple Storage Service (Amazon S3)
- Amazon Elastic Block Store (Amazon EBS)
- Amazon DynamoDB
- Amazon Relational Database Service (Amazon RDS)
- Amazon Aurora
- Amazon Elastic File System (Amazon EFS)
- FSx for Lustre
- FSx for Windows File Server
- NetApp ONTAP 向けAmazon FSx
- Amazon FSx for OpenZFS
- AWS Storage Gateway (ボリュームゲートウェイ)
- Amazon DocumentDB
- Amazon Neptune
- Amazon Redshift
- Amazon Timestream
- VMware™ on AWS
- VMware™ on AWS Outposts
- AWS CloudFormation
さらに詳しく知りたい方はこちらから
■構築の流れ
今回のAWS Backupを利用したAmazon S3のバックアップは以下の流れで作成していきます。
- IAMポリシー作成
 ↓
- IAMロール作成
 ↓
- KMS作成
 ↓
- AWS Backup作成
■IAMポリシー作成
Amazon S3バックアップポリシーとAmazon S3リストアポリシーを作成します。デフォルトロールも用意されていますが、S3に関する許可は記述されていません。
↓AWS IAMのコンソール画面から[ポリシー]→[ポリシーの作成]をクリックします。

↓[JSON]タブをクリックし、以下のドキュメントを貼り付けます。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3BucketBackupPermissions",
            "Action": [
                "s3:GetInventoryConfiguration",
                "s3:PutInventoryConfiguration",
                "s3:ListBucketVersions",
                "s3:ListBucket",
                "s3:GetBucketVersioning",
                "s3:GetBucketNotification",
                "s3:PutBucketNotification",
                "s3:GetBucketLocation",
                "s3:GetBucketTagging",
                "s3:GetBucketAcl"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "S3ObjectBackupPermissions",
            "Action": [
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:GetObjectVersionTagging",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectTagging",
                "s3:GetObjectVersion"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*/*"
            ]
        },
        {
            "Sid": "S3GlobalPermissions",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Effect": "Allow",
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "KMSBackupPermissions",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "kms:ViaService": "s3.*.amazonaws.com"
                }
            }
        },
        {
            "Sid": "EventsPermissions",
            "Action": [
                "events:DescribeRule",
                "events:EnableRule",
                "events:PutRule",
                "events:DeleteRule",
                "events:PutTargets",
                "events:RemoveTargets",
                "events:ListTargetsByRule",
                "events:DisableRule"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:events:*:*:rule/AwsBackupManagedRule*"
        },
        {
            "Sid": "EventsMetricsGlobalPermissions",
            "Action": [
                "cloudwatch:GetMetricData",
                "events:ListRules"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

↓貼り付けが完了したら、[次のステップ: タグ]をクリックします。

↓タグは任意で設定し、[次のステップ: 確認]をクリックします。

名前を入力し、内容に問題なければ、[ポリシーの作成]をクリックします。
saitou-backuptest-s3-policy
Amazon S3バックアップポリシー同様に、Amazon S3リストアポリシーを作成します。以下のドキュメントを利用して、IAMポリシーを作成してください。
saitou-restoretest-s3-policy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "S3BucketRestorePermissions",
            "Action": [
                "s3:CreateBucket",
                "s3:ListBucketVersions",
                "s3:ListBucket",
                "s3:GetBucketVersioning",
                "s3:GetBucketLocation",
                "s3:PutBucketVersioning"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*"
            ]
        },
        {
            "Sid": "S3ObjectRestorePermissions",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:DeleteObject",
                "s3:PutObjectVersionAcl",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectTagging",
                "s3:PutObjectTagging",
                "s3:GetObjectAcl",
                "s3:PutObjectAcl",
                "s3:PutObject",
                "s3:ListMultipartUploadParts"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::*/*"
            ]
        },
        {
            "Sid": "S3KMSPermissions",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "kms:ViaService": "s3.*.amazonaws.com"
                }
            }
        }
    ]
}
IAMポリシー作成は以上です。
■IAMロール作成
AWS Backupがバケットをバックアップする際に利用する、IAMロールを作成します。
↓AWS IAMのコンソール画面から[ロール]→[ロールを作成]をクリックします。

↓以下の設定値を選択します。
| 項目 | 設定値 | 
|---|---|
| 信頼されたエンティティタイプ | AWSのサービス | 
| 他のAWSのサービスのユースケース | AWS Backup | 

↓以下の4つのIAMポリシーを追加します。
- AWSBackupServiceRolePolicyForBackup
- AWSBackupServiceRolePolicyForRestores
- saitou-backuptest-s3-policy(任意の名前)
- saitou-restoretest-s3-policy(任意の名前)

↓ロール名を入力し、内容に問題なければ[ロールを作成]をクリックします。
saitou-backuptest-s3-iamrole

↓内容に問題なければ、[ロールを作成]をクリックします。

IAMロール作成は以上です。
■KMS作成
Amazon S3をバックアップするときは、バックアップボールトに関連付けられたKMSによって暗号化されます。バックアップボールトを作成する際にKMSを選択しますので、事前に作成しておきます。
↓Key Management Serviceコンソール画面に行きます。

↓[カスタマー管理型のキー]→[キーの作成]をクリックします。

↓以下の設定値を選択し、[次へ]をクリックします。
| 項目 | 設定値 | 
|---|---|
| キーのタイプ | 対称 | 
| キーの使用 | 暗号化および復号化 | 

↓以下の設定値を入力し、作成します。
| 項目 | 設定値 | 
|---|---|
| エイリアス | saitou-backuptest-s3-kms | 
| 説明 | 任意 | 
| タグ | 任意 | 
| キー管理者 | IAMユーザー(自身) | 
| キーの管理者がこのキーを削除できるようにします。 | ☑ | 
| キーユーザー | IAMユーザー(自身) | 

↓

↓

↓内容に問題なければ、[完了]をクリックします。

KMSキー作成は以上です。
■AWS Backup作成
■バックアップボールト作成
AWS Backupを利用するためには、一つ以上のバックアップボールトが必要になります。vaultには"金庫"という意味があるので、バックアップの保管庫的な意味だと思います。
↓AWS Backupコンソール画面に移動し、[バックアップボールト]→[バックアップボールトを作成]をクリックします。

↓

↓

↓設定値は以下の通りです。入力が完了したら、[バックアップボールトを作成]をクリックします。
| 項目 | 設定値 | 
|---|---|
| バックアップボールト名 | saitou-backuptest-s3-backupvault | 
| 暗号化キー | :作成したKMSを選択 | 
| タグ | 任意 | 

■バックアッププラン作成
バックアッププランではバックアップの頻度や保持期間、などのルールを設定できます。
↓[バックアッププラン]→[バックアッププランを作成]をクリックします。

↓以下の設定値を入力してください。いくつかの設定は要件に合わせて選択しましょう。
| 項目 | 設定値 | 
|---|---|
| バックアッププランのオプション | 新しいプランを立てる | 
| バックアッププラン名 | saitou-backuptest-s3-backupplan | 
| バックアップルール名 | saitou-backuptest-s3-backuprules | 
| バックアップボールト | saitou-backuptest-s3-backupvault | 
| バックアップ頻度 | 毎日 | 
| ポイントインタイムリカバリ(PITR)のために継続的なバックアップを有効化 | ☑ | 
| バックアップ期間 | バックアップ期間のデフォルトを使用 | 
| コールドストレージへの移行 | しない | 
| 保持期間 | 日数(4) | 
| コピー先にコピー | 選択しない | 

↓

↓入力が完了したら、[プランを作成]をクリックします。すぐに"リソースの割り当て"作成画面に移ります。

↓[リソース割り当て]作成に関しては、設定値は以下の通りです。
| 項目 | 設定値 | 
|---|---|
| リソース割り当て名 | saitou-backuptest-s3-resources | 
| IAMロール | 作成したIAMロール | 
| リソース選択を定義 | 特定のリソースタイプを含める | 
| バケット名 | バックアップを取得したいバケット | 
| 特定のリソースタイプを選択 | S3 | 
| 選択したリソースタイプから特定のリソースIDを除外する | 選択しない | 
| タグを使用して選択を絞り込む | 選択しない | 

↓

↓

↓[リソースの割り当て]をクリックします。

構築は以上です。
■動作確認
設定が完了しましたので、バックアップされているか確認しましょう。
バックアップの[頻度]を"毎日"に設定し、[バックアップ期間]を"デフォルト"に設定しましたので、日本時間で14時から始まります。
↓AWS Backupコンソール画面から[ジョブ]→[バックアップジョブ]をクリックします。

↓バックアップを指定したS3バケットと同じリソース名のジョブステータスが"完了"になっています。

↓バックアップしたS3のスナップショットに関しては、[バックアップボールト]→[作成したバックアップボールト]→[復旧ポイント]、

↓

↓もしくは、[保護されたリソース]→[バックアップ指定したS3バケットと同様の名前のリソースID]で確認できます。

↓

動作確認は以上です。
まとめ:AWS Backupを利用して、Amazon S3のバックアップをしてみる
Amazon S3は高耐久であり、バージョニング機能があるため、バックアップをしない場合があるかもしれません。
Amazon S3バケットはバケット自体を削除する際にも、誤って削除してしまわないように、バケットが空の状態でないと削除できません。しかし、なにが起こるかわかりませんので、Amazon S3のバックアップを検討してみてください。
"復元"に関しては、後日投稿させていただきます。
参考リンク:AWS公式ドキュメント
↓ほかの協栄情報メンバーもAWS Backupに関する記事を公開しています。ぜひ参考にしてみてください。
■AWS Backup で EC2のバックアップを実際に取得してみた。(kudou.m)
https://cloud5.jp/aws-backup-forec2/
■AWS Backup構築ハンズオン(INAMURA)
https://cloud5.jp/aws-backup/



