ウサギでもできるAWS Systems ManagerによるVSS Snapshotの取得

さて、前回の記事から半年くらい間が空いてしまいましたが、皆様いかがお過ごしでしょうか。
この半年間、ちょうどコロナ騒動で生活リズムに変化があった方も多いのではないでしょうか。
私も毎日出勤していた生活だったのが、すっかり在宅ワークに変わってしまい、ほとんど電車に乗ることが無くなってしまいました。
さらに、飲みに行くことも全く無くなり、ランチであちこちのお店を巡る楽しみもゼロになりました。
その代わりランチはほぼ毎日自宅で自炊しているため、60分間という割と短い時間内に手早く調理できて、如何に美味しいものを作れるか、など、食材を考えたりする機会が増えました。まぁこれまで一番多かったメニューはそうめんですが(笑)

他にも、通勤時間が無くなったため、スマホに入れたアニメを見る時間もゼロになったり、幼稚園バスの朝晩の送り迎えは妻から私の担当に、毎日も掃除機も私。その代わり妻は勤務日数と時間を増やしてパートから契約社員になったり・・・と、家庭内もいろいろな変化が出始めています。
と、近況はともかく。。。

今回は、今担当している案件で必要になるかもしれない技術を検証しておこうと思います。

それは、AWS SSM(Systems Manager)を使って、VSS(Volume Shadowcopy)を使用したSnapShotを取得するというものです。
SQLのDBが動いているサーバに対して静止点をとってVSS Snapshotすることを目的としています。
DBはトランザクションが常に発生しているため、一般的に静止点を取らないと整合性の取れていないデータをバックアップすることとなってしまい、戻したときに整合性が取れていないため、矛盾のあるデータとして戻ってしまう可能性があるのです。その書き込みを一瞬止めてスナップショットを取得し、すぐにまた動かし始めるということを実行してくれるのが、WindowsのVSSの機能の一つなんです。

SSMについては勉強はしたので知識としてはあるのですが、実際に目的があって使うのは初めてなので、色々ググってみました・・・
ですが、AWSのページにもあまり丁寧に書いていない・・・そのため、色々なページを参考にして何とかできるところまでこぎつけた、という感じです。
#やったこと
やったことは以下の通り。
・Windowsのインスタンスを起動する
・既存ポリシーを適用したロールを作成する
・対象のインスタンスへロールを適用する
・SSMを開いてマネージドインスタンスを確認する
・だが、失敗する（マネージドインスタンスに出てこない）
・ロールの信頼関係にSSMを追加する
・SSMを開いてマネージドインスタンスを確認する(成功)
・SSMでRunCommandしてVSSコンポーネントをインストールする
・SSMでRunCommandしてスナップショットを作成する
・だが、失敗する
・不足していたポリシーをロールへ追加する
・やっとVSS Snapshotの取得が成功する

参考にしたのは主に以下のページです。
https://aws.amazon.com/jp/blogs/news/take-microsoft-vss-enabled-snapshots-using-amazon-ec2-systems-manager/
何をすればいいのか一覧になっていないため、あまり親切ではないですねぇ。

3～4つくらいの工程なのかな？と思っていたので、意外と結構長い道のりですね。
初めに軽く調べて実行しただけでは、まともに動きませんでした。
その理由や解決方法も含めて記載していきます。

まずは始めの一歩から行きましょう。
#準備編
##Windowsのインスタンスを起動する
今回はDBの動きも観察したいため、無料版SQLの入ったWindows2016を利用することにします。
「コミュニティAMI」の検索ワードは「2016 exp jap」としました。これで「Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Express-(日付)」というイメージが見つかります。
また、SSMの利用時はSSMサービスへの通信が発生するので、パブリックサブネットにサーバを作成します。

もしプライベートサブネットで利用する場合には、別途SSMへのアクセスが可能なように、SSM用のVPCエンドポイントを作成したり、名前解決を可能にするなどの作業が別途必要だったりするそうですが、今回はとりあえずパブリックサブネットで行こうと思います。
##既存ポリシーを適用したロールを作成する
今度はロールの作成です。あまり慣れていないので、ポリシーとロールがごっちゃになってわけがわからなくなりますが、今回は作成したインスタンスに適用するロールを作成します。うん。ロールです。ロールケーキ食べたい。
ロールにはポリシーを適用する必要がありますが、今回必要になるポリシーは標準で用意されている「AmazonEC2RoleforSSM」というポリシーです。
IAMの画面の左ペインにあるロールをクリックし、「ロールの作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/221b018f-7ff7-3633-29dc-dde9ee6e2b32.png)
次に「一般的なユースケース」の下にある「EC2」をクリックしてから右下の「次のステップ: アクセス権限」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/1e35e12c-4d74-f39d-42a9-b726254b5005.png)
検索窓に「SSM」と入れると出てくる「AmazonEC2RoleforSSM」にチェックを入れてから右下の「次のステップ: タグ」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/a304e5ff-1c6e-faed-a9e4-97532e2479af.png)
タグを入れたい場合には適当に入れて、右下の「次のステップ: 確認」を押します。
次のページではロールの名前をこちらも適当に入れて「ロールの作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/ef1f6348-423e-76cc-8289-d63fbcdd091b.png)
はい！できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/a84cc488-fe0b-1b48-c0b5-9c965dbef35b.png)
既にロールが適用されているインスタンスの場合には、そのロールに、上記のポリシーを追加して上げればOKです。
##対象のインスタンスへロールを適用する
ロールを適用しましょう。
インスタンスを選択し、「アクション」→「インスタンスの設定」→「IAMロールの割り当て/置換」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/4a1718c1-d295-43e6-615c-02c1c2733be7.png)
次の画面で、今作成したロールを選択し、右下の「適用」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/520beec5-9448-3e81-6673-4f303c3fb4ba.png)
出来ました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/28aa6a9e-a372-54ed-f53f-4077162e9310.png)
##SSMを開く
さて、ここでSSMを開いて、左ペインから「マネージドインスタンス」を選択すると。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/4adf577e-4e69-68b2-ef76-e47e5d91443d.png)
あ…あれれ？？？　はい。インスタンスがない場合にはこの画面が出ます(冷や汗)
そういえば、一つやることを忘れていました。
##ロールの信頼関係にSSMを追加する
もう一度ロールの設定に戻ります。
ロール名を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/3fbd5bfa-0ab6-82e5-bb14-71382070efa3.png)
「信頼関係」タブを押し、「信頼関係の編集」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/063a7e0e-890c-7b3e-939d-78ff506e85f3.png)
でたー！コードの編集！
これ苦手なんですよねぇ。。。
でも今回は簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/d8940b37-5504-db4d-5ed3-3b3b2d60cc72.png)
下記の黄色いところにカーソルを持ってきて、以下のソースをペーストすればOKです。(カンマから二行丸ごと)
```,
"Service": "ssm.amazonaws.com"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/3465551f-ebf0-fbc2-3ca4-2b6a64b62922.png)
以下のようになればOKです。右下の「信頼ポリシーの更新」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/000b9e8e-d8bd-624a-e369-985a0dd04304.png)
このように、信頼されたエンティティにSSMも出てくればOKです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/5905e2e4-b5ba-f3f0-1fb7-9efef69e9925.png)
これで、もう一度、SSMのコンソールでマネージドインスタンスを見てみましょう。
これでも出てこなかったら、一度インスタンスを再起動したら出てくることもあるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/21957148-01d6-5996-db02-c42b3f1c1fe0.png)
おー！再起動したら出てきました！
やったー！
#実行編
##SSMでRunCommandしてVSSコンポーネントをインストールする
さて、これで目的のインスタンスをマネージメントとできるようになったので、次はVSS Snapshotを取得できるように「AwsVssComponents」というコンポーネントを追加インストールします。
この作業は早速SSMで実行します。
SSMのコンソールから「Run Command」を開いて、右上にある「Run Command」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/ae098fab-2f07-9d45-0dff-c3d9fe4e1ff0.png)
次の画面で「AWS-ConfigureAWSPackage」の左にある〇を押して選択します。
すると、画面の下に実行オプションが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/3b13ad32-3d7e-cc50-3acb-45108fc17d92.png)
色々とコマンドのパラメーターはありますが、以下の様にコンポーネントの「Name」欄に「AwsVssComponents」とだけ記入しておけば、あとは空欄のままというか触らずにOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/7600cd51-7b31-9148-5d22-801cd614c234.png)
次に、目的のインスタンスを指定しますが、これはもう「手動で選択する」で、今のところ一つしかないマネージドインスタンスにチェックを入れればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/a6b2ce51-8ed3-6ea7-1aab-948239a3eb58.png)

ここまでできれば、あとは右下の「実行」を押すだけです。ポチッ！と。
このように、「進行中」表示になり、しばらくしてリロードをすると、完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/432fe169-1820-45e1-09a0-33802eb7786f.png)
はい！完了しました！成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/064ec5c5-a61e-8c35-d1ec-c7af56fc9834.png)
これで、VSS Snapshotの準備が整いました。
##SSMでRunCommandしてスナップショットを作成する
ついに準備が整ったので、VSS Snapshotの取得を実行してみます。
コンポーネントの追加と同じようにRun Commandから実施します。
画面右の「＞」を押してページをめくると「AWSEC2-CreateVssSnapshot」が見つかりますので、その右のチェックを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/0103bc92-6678-2ec8-dd21-8570600e8c46.png)
このパラメーターは特に必要な項目はありません。
紛らわしくなりそうなときは、Tagなどは入れたほうが良いかもしれませんね。
「Create AMI」で「True」を選択することで、AMIを作成することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/f4f7cd25-4ff0-d2a6-7dbb-aaa974bcaf09.png)
インスタンスの指定も先ほどと同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/77cd28f9-9ee8-86de-40bd-e46334911e40.png)
さあ！実行してみましょう！

ガーン！！！失敗！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/8205b379-efcf-f2cf-4e6c-9d0b2964a1fc.png)
うーん・・・いったいなぜでしょう？

##必要なポリシーをロールに追加する
とりあえず落ち着いてもう一度AWSのドキュメントを見てみます。
https://aws.amazon.com/jp/blogs/news/take-microsoft-vss-enabled-snapshots-using-amazon-ec2-systems-manager/
そういえばこの(↓)部分、スナップショットの実行を許可したりということはしていなかったですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/1a9b78a5-b283-c21e-8a2a-a974b3a951e5.png)
もう一度ポリシーに戻って設定を追加してみましょう。
先ほど作成したロールに不足しているポリシーを追加すればいいのですが、既存のポリシーはディフォルトで存在している編集できないポリシーなので、新規で作成したポリシーを追加でアタッチすることにします。

まずはIAMからポリシーを選択し、「ポリシーの作成」、と。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/99f4eb46-3026-3e78-c355-10b3688872ff.png)
EC2を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/d1d5e566-e352-979a-e395-507c81362fc2.png)
ここで、AWSのドキュメントにあった以下の3つを選択します。
>DescribeInstances
>CreateTags
>CreateSnapshot

上記の3つを順番に検索窓へペーストして、チェックを入れていきます。
まずは「DescribeInstances」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/5a0ddd2a-6d51-214c-f870-a592c9fcf629.png)
次は「CreateTags」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/35f1a97e-422e-57e7-ca3c-9aaaa3582165.png)
最後は「CreateSnapshot」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/f272f9ab-ff6a-a3ed-18f8-1aed7efc5ebd.png)
（↑これ、複数形の方を選んだら動作にどう影響が出るのかめちゃくちゃ気になりますが、今はとりあえず無視して進めましょうか）
次は「リソース」を押して、「すべてのリソース」を選択し、右下の「ポリシーの確認」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/317037a7-e505-080e-e3aa-7feaff5f41d3.png)
適切な名前を付けて、右下の「ポリシーの作成」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/2bc38416-7769-9122-c94d-586e5541b109.png)
出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/9844b56e-18a5-0117-070c-63497d9ad793.png)
さて、これを先ほどのロールへアタッチします。
作成したポリシーを選択し、「ポリシーの使用状況」タブを選択し、「アタッチ」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/1602bea5-d8b3-34bd-6767-af70db6b8855.png)
ポリシーのアタッチ画面になるので、先ほどのロール「TEST-SSM-ROLE」を検索してチャックを付け、右下の「ポリシーのアタッチ」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/555e20e4-5541-40c3-0dbe-742f09f72bbc.png)
はい、アタッチできました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/ad1e3700-79f0-8f9f-5c35-bee35b538362.png)
さぁ、これでVSS Snapshotの実行権限はそろったはずです。もう一度トライ！
##再度SSMでRunCommandしてスナップショットを作成する
先ほどのSSMの画面を別のタブで開いていると、あらなんと便利なことでしょうか！「コマンドの再実行」とかいうボタンがあるじゃあ～りませんか！
さすがAWS、神ですね～
早速ポチッ！と。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/090f2e8c-b51e-79ec-2e66-9997d536d97b.png)
「コマンドの再実行」！！！エイッ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/37927196-e410-4827-1a6f-7daf1b1cd34c.png)
ドキドキ・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/367fd8af-f4d3-fc5e-8643-c061f0eb04ad.png)
ドキドキ・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/b8afa747-17ec-6f86-e73e-95012374116f.png)
やったー！
取得出来ました！
EC2のSnapShotも確認してみたら、取得開始しています！成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/99768d90-5aa9-1208-8775-46c67c872868.png)
#動作検証編
##OSのログで動作を確認する
念のため、Windowsのイベントログも見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/c5ed6b34-c94c-70f2-439b-410819e129fe.png)
なるほど、SnapShotの命令が出された直後にVSSサービスが「実行中」となっていますね。
さらに、Applicationも見てみると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/99b7b9a5-2a16-facf-a89d-f7fc3f17b62f.png)
なるほど、「EC2VssSoftwareProvider」というイベントが発生して、SnapShotを取得している様子がわかりました。
さらに・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316614/0736c2aa-c4e3-9b82-29a9-7902743d09a3.png)
上のイベントから2秒後に「Snapshot successful」と来ています！
その間にMSSQLが「書き込みできません」というイベントも出ていますので、きちんと書き込みを抑制し、数秒以内にSnapShotを取得し終えていることがわかりました。