どうもSCSK齋藤です。
EC2のバックアップを取得する際に、アプリケーション整合性の観点から、EC2を停止してからバックアップを取得するユースケースは発生すると考えられます。
Lambdaなどを使って、それらの手順を自動化することはできますが、今回はSystems Manager Automation Runbookを用いてノーコードでその仕組みを作成してみました。
大まかな流れ
Systems Manager Automation Runbookで、以下の流れを自動化するランブックを作成します。
- 全EC2をディスクライブ
- 全EC2を停止
- AWS BackupのAPIを使用してバックアップの作成
- 全EC2を起動
今回のバックアップはAWS Backupを用いたいと思います。
今回解説しない箇所
今回、下記の箇所は詳しく解説致しません。
- AWS Backupで必要なIAMロールの作成方法
- バックアップテスト用のEC2インスタンスの作成方法
AWS Backupで用いるIAMロールについては、本手順で使うIAMロール(backup_role)の画面キャプチャをあらかじめ記載しておきます。
また、EC2をバックアップさせるテスト対象のインスタンスについても、2台用意して検証してみます。
やってみた
それでは、早速作成していきましょう!
Runbookの作成
SystemsManagerのコンソール画面の左のメニューから、「オートメーション」をクリックし、「Create Automation Runbook」をクリックします。
そうすると、以下のようなステートマシン作成画面に遷移します。
全EC2のディスクライブの処理の追加
まず、ディスクライブの処理を追加します。
先ほどのRunbook作成画面の左側の検索欄で、「AWS API」を選択します。
検索欄で、Describeinstancesと検索し、EC2のDescribeinstancesが出てきたら、Runbook内にドラッグ&ドロップします。
そのまま、画面右側のDescribeInstancesのメニューの中で、出力タブに切り替えます。
どのような値を次の処理に渡すかを定義するため、下記の設定を行います。
設定内容の解説は下記になります。
項目 | 設定値 | 説明 |
---|---|---|
名前 | InstanceIds | 任意の名前を入力できるので、どのような値を出力するかを定義します。
今回は、DescribeInstancesでインスタンスIDのリストを出力するので、このような名前とします。 |
セレクター | $.Reservations..Instances..InstanceId | AutoMationRunbookでは、裏でboto3が使われているので、boto3のドキュメントのレスポンス構造の中から、取得したい項目を指定します。
Responseの中身については、ここを参照してください。 |
タイプ | StringList | 今回はインスタンスIDの集合体を取得したいので、String型のリストとします。 |
全EC2を停止する処理の追加
ディスクライブしたインスタンスのリストを元に、全EC2の停止を行います。
左側の検索欄で、「アクション」を選択し、ChangeInstanceStateを検索します。
出てきたものを、ドラッグ&ドロップします。
まず、名前をわかりやすく変更します。
次にインプットを編集します。
下記の値を設定します。
項目 | 設定値 | 説明 |
---|---|---|
Instance IDs | DescribeInstances.InstanceIds | DescribeInstancesでリスト化したインスタンスIDたちが渡されます。 |
Desired state | stopped | 停止を行いたいため、stoppedとします。 |
全EC2をバックアップする処理を追加
ディスクライブしたインスタンスのリスト元に、全EC2のバックアップを行います。
今回は、Loop処理を追加し、その中でインスタンス1つ1つのバックアップ処理を含める形とします。
Loop処理の追加
左側の検索欄で、アクションを指定し、ループを選択します。そのまま、ドラッグ&ドロップで、StopInstancesの下につけます。
ステップ名を自由に設定できるので、わかりやすく「BackupLoop」と名付けます。
次に、右側のメニューのインプットを設定します。
ループタイプを今回はFor eachに選択します。
その後、イテレーターを選択しますが、前段のDescribeInstancesで出力した、InstanceIdsを選択します。
バックアップ処理の追加
ループ処理の中に、バックアップの処理を追加していきます。
左側の検索欄で、「AWS API」を選択し、StartBackupJobを検索します。
出てきたものを、ドラッグ&ドロップします。
次に、インプットタブを選択し、バックアップの条件を入力していきます。
設定内容の解説は下記になります。
項目 | 設定値 | 説明 |
---|---|---|
BackupVaultName | Default | Backupの保存コンテナであるバックアップVaultの名前を設定します。
今回は、デフォルトでアカウントに用意されているDefaultという名前のバックアップVaultを使用します。 |
IamRoleArn | arn:aws:iam::{account_id}:role/backup_role | AWSBackupが用いるIAMロールのARNを指定します。
本ブログでは、冒頭で述べたIAMロールを使用しています。 |
ResourceArn | arn:aws:ec2:{region}:{account_id}:instance/{{ BackupLoop.CurrentIteratorValue }} | バックアップ対象のリソースのARNを指定します。
今回はループ処理の中でインスタンス1つずつ処理をしていくため、EC2のARNの型を用意しておき、末尾の部分を{{ BackupLoop.CurrentIteratorValue }}とすることで、ここにインスタンスIDが入り、EC2のARNが完成する形とします。 |
※上記表の{region}と{account_id}は、それぞれご自身の環境のリージョン名とアカウントIDに置き換えてください。
全EC2を起動する処理を追加
左側の検索欄で、「アクション」を選択し、ChangeInstanceStateを検索します。
出てきたものを、ドラッグ&ドロップします。
ついでに名前も、StartInstancesに変更します。
StartInstancesのメニューで、インプットタブを選択します。
項目 | 設定値 | 説明 |
---|---|---|
Instance IDs | DescribeInstances.InstanceIds | DescribeInstancesでリスト化したインスタンスIDたちが渡されます。 |
Desired state | running | 起動したいため、runningとします。 |
保存と実行
最後に、名前を保存します。
画面左上のペンマークから編集を行い、お好きな名前で保存します。
次に、右上の「ランブックを作成」を押下します。
下記のような画面が出ますが、特に指定せず、画面下のExecuteを押下します。
そうすると、早速Runbookが走ります。
実行画面に遷移後、しばらく時間が経過した後確認すると、正しく実行されたのを確認することができました!
AWSBackupのコンソール画面に遷移し、保存したVaultを確認してみますと2つのバックアップが保存されているのを確認できました!
改めてのポイント
今回のRunbookで意識したポイントとして、AutomationRunbookに組み込まれているアクションである「ChangeInstanceState」を使ったところです。
EC2の停止と起動の際にaws:executeAwsApiのStopInstancesや、RunInstancesといったAPIを使う選択肢もありました。
しかし、これらのAPIは、一斉にEC2を停止や起動だけして状態の追跡をしません。
そのため、EC2が停止し切らない状態で次の状態に遷移(バックアップを取得)してしまうため、整合性を確保するという観点から望ましくありません。ですが、AutomationRunbookに組み込まれているアクションである「ChangeInstanceState」を使うことで、状態の追跡まで行ってくれます。
これを用いることで、インスタンスが停止し切った段階で次のワークフローに進んでくれるので、整合性を確保する観点から望ましいものとなります。
まとめ
今回は、インスタンスを停止してバックアップを行う自動化を、ノーコードにて実施してみました。
今回作ったRunbookを、EventBridgeルールで定期的にキックするようにすることで、毎日のバックアップなども容易になるかと思いますので、組み合わせてみるといいと思います。