EC2バックアップ前に停止して、バックアップ取得後に起動したい
AWSではバックアップを取得する時に何かしらの方法で静止点を取得することを推奨されています。アプリケーションの機能で静止点を取る方法もありますが、やはりインスタンスを停止することは割と一般的だと思います。今までオンプレ使っていたりバックアップジョブを自前で実装していた人たちから見ると特に。
そこで、バックアップ前のEC2インスタンス停止からバックアップ取得、そしてEC2インスタンス起動までの処理をAWSのサービスを使用して実装していきます。
検証構成
EC2インスタンスを立てて、SystemManager AutomationとAWS Backupを利用します。処理の順番は、下記の通りです。
- SystemManager Automation の機能でEC2インスタンスを停止
- SystemManager Automation の機能でBakcupAPIを呼び出し、バックアップを取得
- Backupジョブが正常に投げられたらEC2インスタンスを起動
使用するサービスについて少し説明します
AWS Backup
下記にAWSドキュメントのリンクを張っておきます。
AWS Backupでは既存のサービスで提供されているバックアップ機能を利用して各サービスのバックアップを取得し、それを一元管理してくれるサービスです。取得時間を設定することもできるので、バックアップを取得するだけであればこのサービスを使用すれば問題ありません。
例えば、EC2インスタンスであればAMI
とEBS Snapshot
の取得・管理をしてくれます。
EFSのバックアップを取得することもできます。対応サービスはリンクから確認できます。
バックアップを取得する
AWS Backupでは下記の方法を使用してバックアップを取得します。
- バックアッププランによる取得
- オンデマンドバックアップによる取得
既に書きましたが、今回はAutomationでBakcupAPIを実行します。そうすると、オンデマンドバックアップとしてジョブが投入されバックアップを取得します。
AWS System Manager Automation
Automationの機能をドキュメントから引用します。
Systems Manager オートメーションは、EC2 インスタンスおよび他の AWS リソースの一般的なメンテナンスとデプロイのタスクを簡素化します。
これだけだとわかりにくいのでもう少し見ていきます。Automationでは、ドキュメントという単位でタスクをまとめることができます。下記はAWSによって管理されているドキュメント
です。
これのAWS-StartEC2Instance
を見てみます。
このように、ドキュメントではStepという単位で実行されるアクションを指定します。このアクションはいくつか種類がありますのでリファレンスのURLを書いておきます。
Systems Manager オートメーションアクションのリファレンス
今回使用するのは下の2種類です。
- aws:changeInstanceState
- aws:executeAwsApi
では、実際に実装するところに入っていきます。
ドキュメント作成前に何をしておく必要があるか
BackupAPIを実行する時に、Roleを指定します。なので、BackupからEC2を操作できるように事前にロールを作成しておいてください。
私は、ユースケースの選択
でAWS Backup
を指定し、ポリシーとしてAmazonEC2FullAccess
を付けました。
そしたらロールARNをコピーしておいてください。
あと、対象となるインスタンスIDのメモ
をしておいてください。StringList
で指定するため複数でも問題ありません。
ドキュメントの作成しよう
AWS マネジメントコンソール画面で、AWS SystemsManager
を選択します。左側のサービス一覧の一番したにある共有リソース
のドキュメント
を選択します。
選択した画面で上の方にオートメーションを作成する
があるので選択してください。作成したドキュメントは自己所有タブ
の画面に表示されます。
ドキュメント名などを入れたらステップの作成に入ります。今回は3つのステップを作成します。
- StopInstance(指定したEC2インスタンスを停止する)
- Run_API(指定したAPIを実行する)
- StartInstance(指定したEC2インスタンスを開始する)
まずは、①から見ていきます。アクションタイプにあるChange or assert instance State
がaws:changeInstanceState
に該当します。指定したインスタンスのステータスをDesired state
で指定したステータスに変更します。今回は停止のためstopped
を指定してます。
対象のインスタンスはStringList
で指定します。これは- i-xxx
という記述になります。インスタンスIDを書くだけだとエラーで作成できません。
次に②について確認します。ここではアクションにCall and run AWS API actions
を指定します。これがaws:executeAwsApi
に該当します。Service
にはAPIを叩くサービスを指定します。今回はAWS Bakupなのでbackup
になります。APIは実行するAPIコマンドを指定します。StartBakcupJob
となります。
ここで追加の入力に引数となる値をいれます。上記リンクを読むと必須の引数は3つあります。
- BackupVaultName
- IamRoleArn
- ResourceArn
BackupVaultName
はバックアップ保存先の名前です。ここでは最初からあるDefault
を指定してます。次のIamRoleArn
はBackupからバックアップを取るサービスへのアクセス件げ付与されているロールARNを指定します。ここでさっき作成したロールARNを貼り付けます。3つ目はResourceArn
です。対象となるリソースのARNです。今回Backup対象となるEC2のIDのARNを指定してます。
③は①の逆で、インスタンスの起動です。Desired state
が変わるぐらいです。
これでドキュメントの作成は完了です。
ドキュメントの実行しよう
最後に実行する方法です。
SystemsManagerの画面の左側の真ん中あたりに自動化
という項目があるので選択してください。
オートメーションの実行を選択し、その先で作成したドキュメントを選択してください。画面の一番下にいくと次へ
というボタンがあるので選択し実行します。
以上で実行まで完了です。終わったらEC2からAMIとSnapshotを確認してもいいですし、AWS Backupにジョブが投入されていることを確認してもいいと思います。
最後に
今回Automationを使用して見ましたが、他にもLambdaを使用したりすることもできると思います。ただ、AWSのサービスかつコーディングなしで運用できるのはやはり便利なのではないかなと思います。