ウサギでもできるWindows上のAWS CLIによるSnapShot取得（マルチボリューム）

前回はWindows OS上で動作するツールからVSS Snapshotの取得を実行するところまで実施してみました。
今回はVSSではなく、通常のSnapShotを取得するところを、おさらいしてみたいと思います。

また、複数のドライブ(ボリューム)にまたがってDBのデータなどを同時に保存している場合は、同時にSnapShotを取得しないと、整合性が取れないバックアップとなってしまいます。そのため、一回のAPIコールで複数のボリュームのSnapShotを取得することができる機能を利用することになります。
それは[マルチボリュームスナップショット](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ebs-creating-snapshot.html)という機能です。
Windows OSが動作するインスタンスからSnapShotを取得するには、AWS APIの操作が必要になるため、当然ですがAWS CLIを利用することになります。
AWS CLIによるスナップショットの作成は[create-snapshots](https://docs.aws.amazon.com/cli/latest/reference/ec2/create-snapshots.html)に詳しく記載がありますので、このページを参照しながら実施してみたいと思います。
その際は当然ながら、インスタンスにロールを適用し、ポリシーを当てる必要がありますので、どのようなポリシーが必要になるかも調べてみます。
#取り合ず何も考えずにSnapShotを取得してみる
おもむろにコマンドプロンプトを起動して、実行してみましょう。
まず実行するのはサンプル1つ目。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/be69e0e7-5757-1473-8ca8-138b0479cb1d.png)
以下の一行です。

```DOS
aws ec2 create-snapshots --instance-specification InstanceId=i-017d77c8973d7c953 --description "This is snapshot of a volume from my-instance"
```
えいっ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/67cccec8-4b15-59b2-9888-10ccbd27c340.png)
はい！ブッブー！怒られましたーっ！
そりゃそうですよね。
権限がないといわれました。当たり前です。
とりあえずロールを作って、それらしいポリシーを当ててみましょう。
#ポリシーを適用する
実行した文をもう一度見てみましょう。

```DOS
aws ec2 create-snapshots --instance-specification InstanceId=i-017d77c8973d7c953 --description "This is snapshot of a volume from my-instance"
```
要素を一つ一つ見ていきます。
１．「aws ec2 create-snapshots」とりあえずSnapshotを作成するので、作成の権限は絶対に必要になりますね。
２．「--instance-specification InstanceId=i-017d77c8973d7c953」ここでインスタンスIDを指定しています。特に何かを読んだりするわけではないので不要に見えます。
３．「--description "This is snapshot of a volume from my-instance"」と記載があります。これは取得するスナップショットの詳細情報を追加するものですね。スナップショットの作成と同時なので特に不要でしょうか。

そこで、CLIを実行するEC2インスタンスに以下の様なポリシーを適用したロールを設定してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/833c9d38-fa5b-108d-a9c0-12b2ca742fdc.png)
以下の2つのアクションのみを許可します。
- CreateSnapshot
- CreateSnapshots
ここで、複数形のものも指定しているのは、マルチボリュームで複数一度に取得する際には必要になるからです。

これで実行してみましょう。
#ポリシーを付けて実行

```DOS
aws ec2 create-snapshots --instance-specification InstanceId=i-017d77c8973d7c953 --description "This is snapshot of a volume from my-instance"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/5cf7ab47-56e2-ed55-1b95-97fd2250ec8f.png)
おぉ！動きましたね。
Snapshotも無事に取得できています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/b45dbfc6-b272-d4aa-d67e-1f40eb018f57.png)

#タグをボリュームからコピーしてみよう
次のサンプルです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/caa4f989-f1ba-ecd5-ebe9-31097b6cb7a6.png)
実際に動かした文はこちらです。

```DOS
aws ec2 create-snapshots --instance-specification InstanceId=i-017d77c8973d7c953 --description "This is snapshot of a volume from my-instance"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/41adcc2e-b575-6631-764e-514cd4f79824.png)
はい！また怒られましたーっ！
さて、どんな権限が不足しているのでしょうか？
さっきと異なるのは、EBSからタグをコピーしてくる部分ですね。
そのため、以下の様にポリシーを追加してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/3ec73b68-0c39-14fe-224a-7bb7fc800e34.png)
以下の2つのアクションのみを許可します。
- DescribeTags
- CreateTags
タグを読み込んで作成するので当たり前ですね。
#ポリシーを付けて実行
やってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/5d2fe6fc-1ae1-47de-d6af-74ca502f22ba.png)
おー！動きました！
次に進んでみましょう。
#さらに新規タグを付加してみよう
次のサンプルはルートボリュームを除いてコピーなのですが、特に必要性を感じないので、一つ飛ばして任意のタグをさらに付与してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/70a2cb1e-28e9-318d-804d-303629553caf.png)
実際に動かした文はこちらです。「Backupedby」タグに「AWSCLI_snapshot」という文言を付けて目印にしてみます。

```DOS
aws ec2 create-snapshots --instance-specification InstanceId=i-017d77c8973d7c953 --copy-tags-from-source volume --tag-specifications ResourceType=snapshot,Tags=[{Key=Backupedby,Value=AWSCLI_snapshot}]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/8abb87e1-8775-be8b-4be1-f513373b8306.png)
今度はそのまま問題なく動きました。タグの付与はポリシーですでに許可しているからですね。

次回は、取得したSnapshotを消す方法を模索したいと思います。