はじめに
AWS上でシステムの災害対策を実施したい場合、AWS BACKUPサービスの利用は候補の一つになるかと思います。
AWS BACKUPサービスは、別リージョンへのバックアップも簡単に設定でき、とても便利なサービスですが、AWS BACKUPがサポートしていないサービスもまだまだあります。
今回は、そうしたサービスの中から、Lambdaの災害対策の実施方法について考えてみました。
前提
今回の災害対策のスコープ
今回のAWS上での災害対策に関しては、日次で別リージョンへのバックアップを定期的に実施し、災害時に復旧可能な状態とするというところをゴールにしたいと思います。
実施方法の検討
Lambdaの災害対策を実施する為に必要な項目
Lambdaに関しては、Lambdaの設定情報やLambda関数のスクリプトコードを、他リージョンへ同期するようなサービスは、現時点でなさそうです。
災害対策を実施する為に必要な項目を以下のように考えました。
1.Lambdaの設定情報を出力する
2.Lambda関数のスクリプトコードを出力する
3.上の出力した情報を別リージョンへ退避する
1.Lambdaの設定情報を出力する
Lambdaの設定の出力する方法として、3つの候補を考えました。
- AWS CLIでLambdaの設定情報をDescribeして個別に出力する
- AWS CloudFormation IaC ジェネレーターを使用してLambdaの設定情報を出力する
- Former2を使用してLambdaの設定情報を出力する
AWS CLIでの出力は、スクリプトの作りこみがかなり必要になりそうですし、他のリソースの災害対策も個別に都度作りこみが必要になりそうです。
AWS CloudFormation IaC ジェネレーターは、AWS CloudFormationでのリバースエンジニア機能が強化されたサービスのようです。
AWS管理コンソールからの利用では、リソースの関係性を可視化できる等、便利な部分がある反面、スクリプト等で定期的に出力する為には、課題がありそうです。
Former2に関しては、AWSから提供のサービスではないものの、WEBサイトでのGUI操作も、スクリプトによる出力も機能提供されており、今回の用途にマッチしそうです。
これらの理由で、今回はFormer2を選択します。
2.Lambda関数のスクリプトコードを出力する
Former2を利用しても、Lambda関数のスクリプト部分は、出力することができませんでした。
この部分に関しては、AWS CLI利用して、個別に出力する方法を選択します。
3.上の出力した情報を別リージョンへ退避する
こちらは、Lambdaの設定情報やLambda関数のスクリプトコードを日次でS3に出力し、S3の格納された情報を、AWS BACKUPサービスを利用して、別リージョンへ退避する事とします。
S3には、クロスリージョンレプリケーション機能等、別リージョンにデータを退避、同期する方法が他にも用意されていますが、今回は、日次で別リージョンへ退避する事を目的とする為、AWS BACKUPサービスを選択します。
実施
実施に関する補足説明
実施に関する以下の内容を補足していきたいと思います。
※コード出力するスクリプト及び実行環境に関しては、ここでは触れません。
(実行環境及びスクリプトコードは、各自で作成願います。)
1.Former2 CLIのセットアップ
2.Lambdaの設定情報を出力するコマンド
3.Lambda関数のスクリプトコードを出力するコマンド
4.出力結果を別リージョンへ退避する
1.Former2 CLIのセットアップ(※Amazon Linux 2023使用)
Former2は、WEBサービスとなっており、SaaSでも提供されています。
また、dockerコンテナとしても提供されており、ローカル環境にも同じWEBサービスがセットアップできます。
しかし、今回はバッチスクリプトで利用したいだけになりますので、セットアップするのはFormer2 CLI機能だけを利用します。
Former2 CLIのセットアップは以下の流れになります。
- Node.jsのセットアップ
npm install -g former2- EC2ロールにReadOnlyAccessポリシーを設定
これだけのステップでFormer2 CLIの実行環境ができました。
2.Lambdaの設定情報を出力コマンド
Former2 CLIの実行環境が整ったら、以下のコマンドで、Lambdaの設定情報を出力することができます。
今回は、--servicesオプションで、Lambdaのみ指定していますが、色々なオプションが存在します。
former2 generate --services "Lambda" --output-cloudformation "Lambda.yaml"
また、出力オプションもcloudformationテンプレート形式以外に、Terraform形式も選択できますが、cloudformationテンプレート形式が最もサービスの対応率が高くなっており、現時点で、945/1156 (81%) リソースがカバーされています。
※ 出力されたcloudformationテンプレートには、修正を必要とするものも含まれる為、環境復元時に、出力されたcloudformationテンプレートをそのまま利用する場合は、事前に出力されたテンプレートの動作確認を実施ください。
3.Lambda関数のスクリプトコードの出力コマンド
Lambda関数のスクリプトコードの出力は、AWS CLIを利用して各関数の格納場所を取得して、curlコマンド等で取得する必要があります。
aws lambda get-function --function-name $name | tee ./functioncode/$name.json | jq -r '.Code.Location' | xargs curl --output ./functioncode/$name.zip
出力した結果は、さらにS3へアップロードします。
4.出力結果を別リージョンへ退避する
S3に出力された結果は、AWS BACKUPサービスを利用して、簡単に別リージョンへ退避する事は可能です。
AWS BACKUPのクロスリージョンバックアップ手順はS3に関わらず基本同じ考え方と手順になります。
最後に
今回は、AWS BACKUPサービスでは、サポートされていないAWSサービスやリソースに関しての、災害対策の実施方法の一つとして投稿させて頂きました。(結局、他リージョンへの退避は、AWS BACKUPサービスを利用していますが。)
実現方法は、他にも沢山あるかと思いますが、同じような要件があった時の方法の一つとして参考になれば幸いです。