「EC2のバックアップからファイルをリストアして」と言われたとき

# はじめに
サーバを日々バックアップ運用していると、結構な頻度で「バックアップからファイルだけ戻してほしい」という相談が来ます。
EC2でどういう風にできるのか試してみました。OSはWindowsですが、Linuxでも同様かと思います。

# 概要
この記事では、以下の２つの方法をやっています。

- バックアップしたAMIから別のVMを作成し、元ファイルをコピーする方法
- スナップショットからボリュームを作成し新しいVMにアタッチし、元ファイルをコピーする方法


:::note warn

AMIからVMを作成する場合、内部で動いているシステム・サービスが外部に影響しないよう配慮が必要です。
他環境に影響ないことが保証されている、隔離環境で起動するなどを検討してください。

また、スナップショットからボリュームを作成する場合、作成したボリュームを既存のVMにアタッチすることもできますが、稼働中のサーバの構成を変更することになり影響が心配されますので避けています。
:::

# やってみた

今回はVMをAWS Backupでバックアップし、作成されたAMIとスナップショットを用いて行います。

## 準備：VMのバックアップ

まずはVMを作成して、リストアのためのファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/78a747fd-6375-cad6-b585-06857d773502.png)

以下のようにファイルを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/520f197f-2a62-1cde-96c3-4be7ba781a10.png)

AWS Backupでオンデマンドバックアップします。念のためVMを停止した状態で行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/eebb5cff-fa76-0917-c295-144cc083c03d.png)

成功すると、AMIが作成されます。これを使っていきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a91730f7-e035-8e6a-5ed9-085fca33d25b.png)

スナップショットも作成されます。こちらも使っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f7ba8c73-dd18-251a-71dd-d2499cf214d1.png)

バックアップ後に、VMを起動してファイルを書き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/87740418-08f8-3957-5612-a9536a8ba155.png)

このファイルをリストアするシナリオでやっていきます。

## AMIから別のVMを作成し、元ファイルをコピー

まずはAWS Backupで作られたAMIを使って、ファイルをリストアします。

:::note
AWS Backupを使わないで作成されたAMIからでも、ほぼ同様にできると思われます。
:::

### AMIからリストア用VMを作成

まずAWS Backupに使わせるロールを作ります。元のインスタンスプロファイルを使ってアクセスするために、AWS Backupで利用するリストアのロールに、iam:PassRole権限を付与します。

https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/restoring-ec2.html

今回は、以下のCFnテンプレートを使いました。既にあるポリシー`AWSBackupServiceRolePolicyForRestores`に、iam:PassRole権限を付与しています。

```yaml:createSampleRoleforBackup.yaml
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  SampleRoleforBackup:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: SampleRoleforBackup
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: 
                - backup.amazonaws.com
            Action: 'sts:AssumeRole'
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSBackupServiceRolePolicyForRestores
      Policies:
        - PolicyName: AllowPassRole
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: 
                  - 'iam:PassRole'
                Resource: 
                  - !Sub 'arn:aws:iam::${AWS::AccountId}:role/*'
```

ロールが作成できたら、AWS Backupのコンソールから対象のAMIを復元します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4bfd938a-b91c-2e5b-16d1-8292113d46d3.png)

ネットワーク設定は何も変更していません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7590bd95-31d9-9127-4b00-d56d52d1de40.png)

ロールに、先ほど作ったロールを指定し、復元します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8f391cb0-76d6-ca61-a191-0ac015bee03d.png)

初期化のチェックに5分くらいかかりましたが、もう一つのVMが作られました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4e8c729c-58a1-253f-0f5e-4a2e518ffbfb.png)

作成したVMに、RDPでアクセスします。パスワードは元のVMと同じものを使ってアクセスします。

:::note warn

リストアしたVMからはパスワードを復号できません。元PCのパスワードを流用してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/10727ccd-d523-257a-e938-7ab6284e6d85.png)
:::

元のファイルが確認できました。後はこのファイルをネットワーク越しでコピーや、RDPなので一度ローカルにコピーしてから元VMにアップするなどします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/1fad90b7-0008-36cf-03b1-37b59a792184.png)

### リストア用VM削除
作ったVMは終了して削除するだけです。


## スナップショットからボリュームを作成し新しいVMにアタッチし、元ファイルをコピーする

次は、AWS Backup時に作られたスナップショットを使って、ファイルをリストアします。

https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-attaching-volume.html

https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-using-volumes.html

### スナップショットから、ボリュームを作成

EC2のコンソールから対象のスナップショットを選択し、[アクション]-[スナップショットからボリュームを作成]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/370d48c2-5ffe-205a-0167-c5641bda6b8c.png)

特に何も変更せず、ボリュームを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/7ae63d2c-a687-4194-f1d2-0be2efa60839.png)


### 新しいVMを作成

ボリュームを作成したAZに、新しいVMを作成します。サブネットの指定は同じAZになるように注意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/09e5f7b1-cc09-9568-68c1-d91856a1280b.png)


### ボリュームをアタッチ
作成したVMにボリュームをアタッチします。ボリュームから[アクション]-[ボリュームのアタッチ]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/189bbfed-50bc-f312-751b-9f31399fb6e1.png)

インスタンスとデバイス名を選択します。デバイス名は、データボリュームの場合は` xvd[f-p]`と書かれているので、それに従います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c6f5f782-d544-be5d-ac5a-b4e948b7e6ae.png)

アタッチした後、ボリュームのステータスがしばらく「データが不十分です」になっていますが、しばらくするとOKになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/cf8bad95-6856-0b4d-a0e7-a5a7ecef18b7.png)

アタッチしたVMで、ボリュームを利用できるようにします。ログインしてサーバーマネージャを起動し、コンピュータの管理を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/5a3b49bb-0d73-26d9-bebf-6b6abc6a9847.png)

ディスクの管理で、アタッチしたボリュームが見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/bebf0704-8cea-f956-4d78-a8543bb41eed.png)

[Offline]のあたりの位置を右クリックして、Onlineをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c364b2ba-5291-4b31-b435-5947ab443fc2.png)

Onlineになったら、Openすることで、エクスプローラが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/34a5005a-3512-495c-efc4-274858187a35.png)

フォルダを潜っていて、対象のファイルの更新前の状態が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d4375f90-63b9-9c0d-65da-66f2f9948aeb.png)

### VM・ボリューム削除
リストア用のVMは終了して削除します。作成したボリュームは残ったままなので、こちらも消す必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/b982bfad-0bb0-612e-022e-13831e4e6fdb.png)

# おわりに
今回は、バックアップしたEC2のVMから、ファイルだけ戻したいというケースを想定して、２つの方法を記事にしました。
専用のバックアップソフトだとファイル単位のリストア機能がありますが、EC2ではどうすればいいのか気になったので試してみました。
結構面倒なので、日常使用するファイルなどはEC2で構築したファイルサーバなどに保存せず、S3やBOXなどを使ってほしいです。
この記事がどなたかのお役に立てれば幸いです。