[アップデート] AWS BackupがWindows EC2のVSSスナップショットをサポートしました

2020.09.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

本日AWS BackupのWindows Server EC2バックアップにおいてVolume Shadow Copy Services(VSS)を使ったスナップショットがサポートされました。

公式のアナウンスは以下となります。

VSSスナップショットとは?

AWS BackupにおけるEC2のバックアップの実体はEBSスナップショットであり、EBSスナップショットは通常ストレージデバイスとしての整合性を持つクラッシュ整合性となります。
このためアプリケーションとしての整合性を担保したい場合は何らかの調整をユーザーが行う必要があります。
(一番わかりやすい調整が「スナップショットを取る前にインスタンスを停止する」ですね。)

Windows ServerではWindows Server 2003からVolume Shadow Copy Services(VSS)と呼ばれる機能が導入されており、VSSに対応したストレージデバイスとアプリケーション間でスナップショットを取る際のI/Oの調整(=整合性の担保)を行うことが可能となっています。

VSSを使うためにはストレージデバイス、アプリケーション両方がVSSに対応している必要があるのですが、AWSではOSに専用のコンポーネントを導入することでストレージデバイス側の機能を肩代わりさせVSSを使ったスナップショットを取得することが可能となっています。

VSSスナップショットの機能自体は以前からAWSに導入されている機能であり、詳細については弊社中山の記事が参考になりますのでご覧ください。

AWS Backupでの実装

詳細なドキュメントが無かったため実際の動作から確認した限りですが、AWS BackupでのVSSスナップショットの実装は単純にSSMドキュメントのAWSEC2-CreateVssSnapshotを実行してVSSスナップショットを取得し、最終的にAMIの形でバックアップとしているだけの様です。

AWSEC2-CreateVssSnapshotを実行するためには以下の前提条件を満たしていなければならないのですが、その事前準備はユーザーが行う必要があります。
残念ながらAWS Backupが全部よしなにやってくれるわけではありません。

前提条件

AWSEC2-CreateVssSnapshotを実行するための前提条件は以下となります。

1. IAMロール

SSMを使うため最低限以下の権限をもったIAMロールをバックアップ対象となるEC2にアタッチする必要があります。

  • SSMのための権限
    • 最低限 AmazonSSMManagedInstanceCore の権限が必要です。
  • VSSスナップショットのための権限
    • AWSEC2-CreateVssSnapshotドキュメント内部でAWS Tools for PowerShellの機能を使うためEC2に関わるいくつかの権限が必要です。
    • 詳細はこちらのドキュメントを参照

最低限必要な権限をまとめたCloudFormation Templateは以下となります。

AWSTemplateFormatVersion: 2010-09-09
Parameters:
  RoleName:
    Description: "Input role name."
    Type: String
    Default: "EC2RoleforSSMVSSSnapshot"
Resources:
  # IAM Role
  SSMRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName:
        Fn::Sub: "${RoleName}"
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
      Policies:
        - PolicyName:
            Fn::Sub: "${RoleName}-EBSSnapshot"
          PolicyDocument:
            Version: "2012-10-17"
            Statement: 
              - Effect: "Allow"
                Action:
                  - "ec2:CreateTags"
                Resource: 
                  - "arn:aws:ec2:*::snapshot/*"
                  - "arn:aws:ec2:*::image/*"
              - Effect: "Allow"
                Action:
                  - "ec2:DescribeInstances"
                  - "ec2:CreateSnapshot"
                  - "ec2:CreateImage"
                  - "ec2:DescribeImages"
                Resource: "*"
  # Instance Profile
  SSMRoleInstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      InstanceProfileName:
        Fn::Sub: "${RoleName}"
      Path: "/"
      Roles:
        - Ref: SSMRole

2. 専用コンポーネント(VSSコンポーネント)のインストール

先述の通りVSS対応ストレージの機能を肩代わりするための専用コンポーネント(VSSコンポーネント)をインストールする必要があります。
インストール方法は様々ですが、SSMドキュメントAWS-ConfigureAWSPackageを使いインストールするのが良いでしょう。

前項のIAMロールをアタッチしておけばSSMが使えますので、SSM Run CommandからAWS-ConfigureAWSPackageを選択し、NameパラメーターにAwsVssComponentsを指定することでVSSコンポーネントをインストールできます。

Run Commandがエラー無く終了すれば完了です。

これによりOS内部のC:\Program Files\Amazon\AwsVssComponentsに必要なプログラム一式がインストールされます。

ここまでの準備をしてはじめてAWS BackupからVSSスナップショットつかったバックアップを取得することができます。

試してみた

それでは実際に試してみます。

検証環境

今回は以下の環境で試してみます。
環境構築の詳細は割愛します。

  • 適当なVPC内にSQL Server(VSS対応アプリケーション)インストール済みのEC2インスタンスを構築
    • 使用したAMIは ami-072ae74c30bf79068 (Windows_Server-2019-Japanese-Full-SQL_2017_Standard-2020.09.09)
    • SSMを使うためEC2はインターネットアクセス可能にしている
  • 当該インスタンスに前項のIAMロールをアタッチ済み
  • 当該インスタンスにVSSコンポーネントをインストール済み

VSSスナップショットの取得

今回はシンプルに「オンデマンドバックアップ」で試します。

リソースタイプにEC2を選ぶと画面下部に「アドバンストバックアップ設定」欄が表示されます。
この欄にある「Windows VSS」にチェックを入れるとVSSスナップショットを取得することが可能となっています。

今回はバックアップの有効期限や、ボールト、IAMロールはデフォルトのままとしていますが、これらの設定は実際の環境に合わせて設定してください。
あとは「オンデマンドバックアップを作成」ボタンをクリックすればOKです。

しばらく待てばバックアップが完了します。

AWS Backupからは詳細が見えませんが、SSMにはSSM Run Commandの履歴が残っており詳細を確認することができます。

ちなみにバックアップを取られたOS側ではイベントログにログが記録されます。

(EBSスナップショット取る前にVSS経由でディスクI/Oをフリーズさせた際のログ)

(VSS連動でSQL Serverがバックアップされた、正確にはVSS Writerが使用された際に発生するログ)

(スナップショット取得が完了しディスクI/Oを再開させた際のログ)

リストア

今回は試しませんが取得されたバックアップのリストア手順は通常のバックアップと同様です。
先ほどのバックアップも設定されたボールトから確認することができます。

注意点

手順としては非常に単純ですがいくつか注意事項があります。

1. EC2に対して事前に前提条件の検証はされない

AWS Backupの実行まで対象EC2が前提条件をクリアしているか否かの検証はされません。
前提条件をクリアしていない場合、バックアップを実行した際にエラーとなります。

IAMロールがアタッチされていない場合や必要な権限が不足している場合は、

WindowsVSS Backup attempt failed because either Instance or SSM Agent has invalid state or insufficient privileges.

EC2にVSSコンポーネントがインストールされていない場合は、

ec2-vss-agent.exe is not installed. To install, run command AWS-ConfigureAWSPackage with package AwsVssComponents

といったエラーとなりバックアップが中断されます。

2. EC2インスタンスは起動している必要がある

VSSスナップショットを取得するにはEC2インスタンスが起動している必要があります。
EC2インスタンスが停止している場合にバックアップを取得すると権限不足の場合と同じエラーとなってしまいます。

WindowsVSS Backup attempt failed because either Instance or SSM Agent has invalid state or insufficient privileges.

最後に

以上となります。
事前準備が必要ではありますが非常にうれしいアップデートです。

VSS対応アプリケーションは正直そこまで多くないですが、SQL ServerやOracle Databaseといったアプリケーション整合性が要求されるRDBMS製品は対応してますのでEC2インスタンスで当該製品を利用している方は積極的にこの機能を使うと良いでしょう。