🐈

AWS BakcupとSystemsManager AutomationでEC2バックアップを運用する方法

2020/11/06に公開

EC2バックアップ前に停止して、バックアップ取得後に起動したい

AWSではバックアップを取得する時に何かしらの方法で静止点を取得することを推奨されています。アプリケーションの機能で静止点を取る方法もありますが、やはりインスタンスを停止することは割と一般的だと思います。今までオンプレ使っていたりバックアップジョブを自前で実装していた人たちから見ると特に。

そこで、バックアップ前のEC2インスタンス停止からバックアップ取得、そしてEC2インスタンス起動までの処理をAWSのサービスを使用して実装していきます。

検証構成

EC2インスタンスを立てて、SystemManager AutomationとAWS Backupを利用します。処理の順番は、下記の通りです。

  1. SystemManager Automation の機能でEC2インスタンスを停止
  2. SystemManager Automation の機能でBakcupAPIを呼び出し、バックアップを取得
  3. Backupジョブが正常に投げられたらEC2インスタンスを起動

使用するサービスについて少し説明します

AWS Backup

下記にAWSドキュメントのリンクを張っておきます。

AWS Backup とは

AWS Backupでは既存のサービスで提供されているバックアップ機能を利用して各サービスのバックアップを取得し、それを一元管理してくれるサービスです。取得時間を設定することもできるので、バックアップを取得するだけであればこのサービスを使用すれば問題ありません。

例えば、EC2インスタンスであればAMIEBS Snapshotの取得・管理をしてくれます。

バックアップを取得する

AWS Backupでは下記の方法を使用してバックアップを取得します。

  • バックアッププランによる取得
  • オンデマンドバックアップによる取得

既に書きましたが、今回はAutomationでBakcupAPIを実行します。そうすると、オンデマンドバックアップとしてジョブが投入されバックアップを取得します。

AWS System Manager Automation

Automationの機能をドキュメントから引用します。

Systems Manager オートメーションは、EC2 インスタンスおよび他の AWS リソースの一般的なメンテナンスとデプロイのタスクを簡素化します。

AWS Systems Manager オートメーション

これだけだとわかりにくいのでもう少し見ていきます。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つのステップを作成します。

  1. StopInstance(指定したEC2インスタンスを停止する)
  2. Run_API(指定したAPIを実行する)
  3. StartInstance(指定したEC2インスタンスを開始する)

まずは、①から見ていきます。アクションタイプにあるChange or assert instance Stateaws:changeInstanceStateに該当します。指定したインスタンスのステータスをDesired stateで指定したステータスに変更します。今回は停止のためstoppedを指定してます。

対象のインスタンスはStringListで指定します。これは- i-xxxという記述になります。インスタンスIDを書くだけだとエラーで作成できません。

次に②について確認します。ここではアクションにCall and run AWS API actionsを指定します。これがaws:executeAwsApi に該当します。ServiceにはAPIを叩くサービスを指定します。今回はAWS Bakupなのでbackupになります。APIは実行するAPIコマンドを指定します。StartBakcupJobとなります。

StartBackupJob

ここで追加の入力に引数となる値をいれます。上記リンクを読むと必須の引数は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のサービスかつコーディングなしで運用できるのはやはり便利なのではないかなと思います。

Discussion