AWS再入門ブログリレー AWS Backup編

はじめに

当エントリは弊社コンサルティング部による『AWS再入門ブログリレー 2019』の11日目のエントリです。

前日はにしざわによる「AWS Systems Manager」でした。

このブログリレーの企画は、普段AWSサービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。

AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2019年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。

本日11日目のテーマは『AWS Backup』です。

目次

AWS Backupとは

AWS Backupをひとことで言うと「AWS各サービスのバックアップを一元管理するためのサービス」であり、FAQによると以下の様に定義されています。

(https://aws.amazon.com/jp/backup/faqs/より引用)

AWS Backupが登場する前は各サービスにおけるバックアップはそのサービス毎に行う必要があり、バックアップのスケジューリングや保持設定も個別に設定する必要がありました。
AWS Backupではバックアップの方式自体は原則として各サービスが提供するものを使用しつつも、スケジュール管理やバックアップの保持期間の管理、バックアップに対するアクセスポリシーの設定を一元管理することができる様になっています。

対象リージョン

2019年7月16日時点でAWS Backupを利用可能なリージョンは以下となります。

  • 北バージニア
  • オハイオ
  • オレゴン
  • 北カルフォルニア
  • モントリオール
  • アイルランド
  • フランクフルト
  • ロンドン
  • シンガポール
  • 東京
  • シドニー
  • ソウル

東京はつい先日利用可能になったばかりです。

対象サービス

2019年7月16日時点でAWS Backupでサポートされているサービスは以下となります。

基本構成

AWS Backupの基本的な構成は下図の様になっており、バックアッププランを作ってバックアップの設定を行い各種サービスのバックアップ行う形となっています。

(https://aws.amazon.com/jp/backup/より引用)

もう少し設定寄りの図はこちらになります。

以下この図にある各項目について説明していきます。

バックアッププラン

バックアップ設定をまとめる単位です。
バックアッププランは「バックアップルール」「リソース」から構成されます。

バックアップルール

バックアップスケジュールなどのバックアップに係る設定を保持する単位です。
1つのバックアッププランに複数のバックアップルールを設定できます。

スケジュール

バックアップを実行するスケジュールを設定します。
毎日、毎週、毎月といった「頻度」とバックアップの開始時間とウィンドウを指定する「バックアップウィンドウ」を指定します。

ちなみに、本記事では触れませんが一度きりの「オンデマンドバックアップ」を行うことも可能です。

ライフサイクル

作成したバックアップの有効期限を設定します。

現時点ではEFSに対するバックアップでのみ利用可能ですが、有効期限が切れる前により低単価のコールドストレージに移行させることも可能です。
(※ただし、コールドストレージは保存期間が最低90日であり、90日経過前にバックアップを削除しても90日までのストレージ料金は請求されますのでご注意ください。)

コールドストレージに移行されたバックアップの保存期間は最低で 90 日間です。90 日が経過する前にバックアップが削除された場合、その 90 日の残りのストレージ料金が日割りで請求されます。

バックアップボールト

バックアップボールト(Vault)は各バックアップを管理するための論理的なコンテナです。
各サービスのバックアップの実体はサービス毎で分散していますので、ボールトはそれを論理的にグルーピングするための器としての役割を持っています。
ボールトに対してアクセスポリシーを割り当てアクセス制御をかけることも可能です。

また、現時点ではEFSのみでサポートされていますがバックアップを暗号化する際のKMSキーの定義もここで行います。

リソース

バックアップ対象となる各サービスのリソース定義です。
各種リソースID、またはタグの値を指定することでバックアップ対象を選ぶことが可能です。

リソース定義ではバックアップの取得およびリストアのためにIAMロールをアタッチする必要があります。
デフォルトのロールはAWSBackupDefaultServiceRoleで、

  • AWSBackupServiceRolePolicyForBackup
  • AWSBackupServiceRolePolicyForRestores

の二つのマネージドポリシーがアタッチされています。
それぞれ、

AWSBackupServiceRolePolicyForBackup

JSONを展開
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:CreateBackup"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "dynamodb:DescribeBackup",
                "dynamodb:DeleteBackup"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*/backup/*",
            "Effect": "Allow"
        },
        {
            "Effect": "Allow",
            "Action": [
                "rds:AddTagsToResource",
                "rds:ListTagsForResource",
                "rds:DescribeDBSnapshots",
                "rds:CreateDBSnapshot",
                "rds:CopyDBSnapshot",
                "rds:DescribeDBInstances"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "rds:DeleteDBSnapshot"
            ],
            "Resource": [
                "arn:aws:rds:*:*:snapshot:awsbackup:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "storagegateway:CreateSnapshot",
                "storagegateway:ListTagsForResource"
            ],
            "Resource": "arn:aws:storagegateway:*:*:gateway/*/volume/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:DeleteSnapshot"
            ],
            "Resource": "arn:aws:ec2:*::snapshot/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeSnapshots",
                "ec2:DescribeTags"
            ],
            "Resource": "*"
        },
        {
            "Action": [
                "elasticfilesystem:Backup",
                "elasticfilesystem:DescribeTags"
            ],
            "Resource": "arn:aws:elasticfilesystem:*:*:file-system/*",
            "Effect": "Allow"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateSnapshot",
                "ec2:DeleteSnapshot",
                "ec2:DescribeVolumes",
                "ec2:DescribeSnapshots"
            ],
            "Resource": [
                "arn:aws:ec2:*::snapshot/*",
                "arn:aws:ec2:*:*:volume/*"
            ]
        },
        {
            "Action": "kms:DescribeKey",
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": "kms:CreateGrant",
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        },
        {
            "Action": [
                "tag:GetResources"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

AWSBackupServiceRolePolicyForRestores

JSONを展開
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem",
                "dynamodb:PutItem",
                "dynamodb:GetItem",
                "dynamodb:DeleteItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:DescribeTable"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "dynamodb:RestoreTableFromBackup"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*/backup/*",
            "Effect": "Allow"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateVolume",
                "ec2:DeleteVolume"
            ],
            "Resource": [
                "arn:aws:ec2:*::snapshot/*",
                "arn:aws:ec2:*:*:volume/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeSnapshots",
                "ec2:DescribeVolumes"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "storagegateway:DeleteVolume",
                "storagegateway:DescribeCachediSCSIVolumes",
                "storagegateway:DescribeStorediSCSIVolumes"
            ],
            "Resource": "arn:aws:storagegateway:*:*:gateway/*/volume/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "storagegateway:DescribeGatewayInformation",
                "storagegateway:CreateStorediSCSIVolume",
                "storagegateway:CreateCachediSCSIVolume"
            ],
            "Resource": "arn:aws:storagegateway:*:*:gateway/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "storagegateway:ListVolumes"
            ],
            "Resource": "arn:aws:storagegateway:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBInstances",
                "rds:DescribeDBSnapshots",
                "rds:ListTagsForResource",
                "rds:RestoreDBInstanceFromDBSnapshot",
                "rds:DeleteDBInstance",
                "rds:AddTagsToResource"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticfilesystem:Restore",
                "elasticfilesystem:CreateFilesystem",
                "elasticfilesystem:DescribeFilesystems",
                "elasticfilesystem:DeleteFilesystem"
            ],
            "Resource": "arn:aws:elasticfilesystem:*:*:file-system/*"
        },
        {
            "Action": "kms:DescribeKey",
            "Effect": "Allow",
            "Resource": "*"
        },
        {
            "Action": "kms:CreateGrant",
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}

とサポートされている全サービスに対するバックアップ・リストアに係る権限を保持しています。
基本的にはデフォルトのロールで問題ないかと思いますが、セキュリティ的な厳密さが要求される場合はバックアップ・リストアを許可するサービスを絞ると良いでしょう。

サービス毎のバックアップ方式

最初に触れましたがAWS Backupにおけるバックアップの方式は原則として各サービスが提供するものになります。
AWSによるバックアップ機能が提供されていなかったEFSについてはAWS Backup独自の方式によりバックアップされます。

バックアップがどの様な方式で行われているかを知ることは非常に重要です。
ここでは各サービスのバックアップ方式について基本的な部分を説明していきます。

Amazon EBS

EBSのバックアップはEBSスナップショットによって行われます。

そもそも論として「スナップショットはバックアップなのか?」という問題もあり、スナップショット内データの整合性はユーザーが担保しなければならない点はAWS Backupを使う場合でも同様です。
AWS BackupからEBSスナップショットを取得する際に整合性を担保するための特別な処理を行うといった公開情報は一切無く、おそらく、"ふつう"のEBSスナップショットを取っているだけだと予想されます。

また、クラッシュ整合性のあるスナップショットVSSを利用したスナップショットに関する公開情報も無く、これらの仕組みからの想像ですが、現時点のAWS Backupではまだ対応していないと思われます。

Amazon RDS

RDSのバックアップはPoint-in-Time-Recoveryのための自動バックアップとユーザーが手動で取得するDBスナップショットの二種類存在しますが、AWS Backupで管理できるのはDBスナップショットになります。
DBスナップショットの整合性はRDSの基盤により担保されています。

Amazon DynamoDB

DynamoDBのバックアップはPoint-in-Time-Recoveryのための連続的なバックアップとユーザーが手動で取得するオンデマンドバックアップの二種類存在しますが、AWS Backupで管理できるのはオンデマンドバックアップになります。
オンデマンドバックアップはその仕様として項目間の因果整合性は保証されていません。

DynamoDB バックアップでは、項目間の因果整合性は保証されません。ただし、バックアップの更新間のスキューは、通常 1 秒未満です。

Amazon EFS

EFSではこれまでバックアップの仕組みは提供されておらず、EFS-to-EFS Backupといった別建てのソリューションを利用する必要がありました。

AWS Backupでは独自の仕組みでEFSのバックアップを行います。
バックアップ方式についてその実装は明らかにされていませんが、EFSのユーザーガイドにある程度情報が載っています。

こちらによるとバックアップの整合性については

バックアップの整合性

Amazon EFS は高い可用性を持つように設計されています。AWS Backup によるバックアップの実行中も、Amazon EFS ファイルシステムにアクセスしたり変更したりすることができます。
ただし、バックアップの実行中にファイルシステムに変更が加えられると、データの重複、相違、欠落などの不整合が生じる場合があります。
これらの変更には、書き込み、名前の変更、移動、削除の操作が含まれます。
バックアップの整合性を確保するため、バックアッププロセスの間は、ファイルシステムを変更するアプリケーションやプロセスを一時停止するか、またはファイルシステムが変更されていない期間にバックアップが行われるようにスケジュールすることをお勧めします。

とあり、整合性の担保はユーザーの責務となっています。

Amazon Storage Gateway

AWS BackupではAmazon Storage Gatewayで提供されている機能のうち、 Volume Gatewayのボリュームに対するバックアップが可能です。
Storage Gatewayのバックアップは従来からあるEBSスナップショットにより行われます。

やってみた

本記事は再入門ということもあり単一ボリュームに対するEBSのバックアップを試してみます。

ダッシュボード

AWS Backupのダッシュボードは以下の様な画面となっています。

バックアッププランの作成

左側の「バックアッププラン」か中央の「バックアッププランを管理」をクリックするとクリックするとバックアッププランの一覧画面になります。

「バックアッププランを作成」をクリックします。
バックアッププランの作成画面に遷移し、以下の様に3種類の作成方法を選ぶことができます。

  • 既存のプランから開始
    • 定義済みのテンプレートから新しいプランを作成する方式です
  • 新しいプランを立てる
    • プランの定義をいちから作成します
  • JSONを使用してプランを定義
    • プランをJSONの定義から作成します

今回は「新しいプランを立てる」を選び、1日1回のバックアップ、保持期限7日のプランを作成してみます。
バックアッププラン名はmy-backup-planとします。

「バックアップルールの設定」欄で適切なルール名を記入します。
今回は「daily-backup-rule」としておきます。

スケジュールの「頻度」を「毎日」にすると1日1回のバックアップ、のいわゆる日次バックアップになります。
「バックアップウィンドウ」はUTC時間で開始時間とウィンドウ時間を設定できます。

今回はPM 03:00(JSTだと00:00)開始1時間のウィンドウとしています。
ライフサイクルは「有効期限切れ」欄を7日後に設定します。

バックアップボールトはデフォルトのものではなく新しく作成します。
「新しいバックアップボールトを作成」ボタンをクリックします。

新しいバックアップボールトの作成画面がポップアップされますので必要事項を記入します。
今回は名前だけ設定しその他の項目はデフォルトのままとしました。

新しく作成したバックアップボールトを選択します。

画面でも案内されていますがバックアップ対象であるリソースの定義はこの後行いますので、「プランを作成」をクリックします。

これでバックアッププランが作成されました。

リソースの割り当て

バックアッププランの画面下部にある「リソースを割り当てる」ボタンをクリックします。

リソースの割り当て画面に遷移しますので、適切なリソース割り当て名を付けます。
今回はIAMロールはデフォルトのままとし、画面下部の「リソース割り当てる」欄にバックアップ対象のEBSボリュームIDを指定します。

(ボリュームIDの指定時は入力補完が利きますが、正直わかりにくいので事前に対象となるボリュームIDを控えておくと良いでしょう)

これでバックアップ対象の設定が完了し、すべての設定が完了となります。

結果の確認

バックアップの実行結果は「ジョブ」欄から確認することができます。

ジョブの詳細は以下の様な感じです。

バックアップの実体は「保護されたリソース」から確認することができます。

詳細画面を開くと個々のバックアップが「復旧ポイント」という形で記録され、この画面からバックアップのリストアを行うことができます。

今回は試しませんが、「復元」ボタンをクリックするとスナップショットからEBSボリュームを復元するための設定画面に遷移します。

ちなみにEBSのスナップショット一欄からもこのスナップショットを確認することができます。

(説明に「This snapshot is created by the AWS Backup service.」とあるのがAWS Backupにより作成されたバックアップで、aws:backup:source-resourceタグが付与されています)

このAWS Backupで作成されたスナップショットはEBSのコンソール画面から削除しようとしても下図の様にエラーとなります。

バックアップ(スナップショット)の削除はAWS Backupから行う必要があります。
こういう部分がAWS Backupでバックアップが一元管理されるメリットの一つとなります。

その他のやってみた

その他のAWSサービスに対するバックアップについては以前に弊社社員が「やってみた」記事がありますのでこちらもぜひご覧ください。

料金

AWS Backupの料金は以下に記載されています。

重要な点として、

AWS バックアップでは、その月に使用したバックアップストレージ量および復元したバックアップデータの量に対してのみ料金をお支払いいただきます。最低料金および初期費用は発生しません。

とある様に料金はストレージ量に依存し、バックアップを1回実行するごとにいくら、といった請求はされません。
基本的に各サービスごとのバックアップ(EBSスナップショット、DBスナップショットなど)にかかる費用がそのままAWS Backupの料金となります。
ただし、これまでAWSによるバックアップ機能が提供されていないEFSについてはGBあたりの独自の費用がかかります。

例えば本日(2019年7月16日)時点の東京リージョンの場合

タイプ ウォームストレージ コールドストレージ 特記事項
Amazon EFS File System Backup $0.06 per GB-Month $0.012 per GB-Month 独自の料金体系
Amazon EBS Volume Snapshot $0.05 per GB-Month - Amazon S3 に対する Amazon EBS スナップショットの金額
Amazon RDS Database Snapshot $0.095 per GB-Month - DBスナップショットは一律この金額
Amazon DynamoDB Table Backup $0.114 per GB-Month - オンデマンドバックアップの料金
AWS Storage Gateway Volume Backup $0.05 per GB-Month - Amazon S3 に対する Amazon EBS スナップショットの金額

という金額になります。

最後に

以上、『AWS再入門ブログリレー 2019』の 11日目のエントリ『AWS Backup 編』でした。
AWS Backupは新しいサービスですのでぶっちゃけた話をしてしまうと「"再"入門ではないなぁ。」と思いつつもサービス全体を俯瞰した記事があまり無い現状だったのでこのブログリレーでまとめておきたいと思い筆を執りました。

明日(7/17)はShirotaによる「AWS Batch」の予定です。お楽しみに!