御成門プログラマーの技術日記

Microsoft AzureやAngularなどの技術情報を発信します。

Azure Chaos Studio でAzure Key Vault に意図的に障害を発生させてみた

Azure Chaos Studio(Preview)にAzure Key Vaultが対応していたので実際に試してみました。

Azure Chaos Studio で Azure Key Vault の障害が起こせるように(Public Preview)

2022年3月9日のAzure更新通知に下記のような情報が上がっていました。
パブリック プレビュー:Azure Chaos Studio Key Vault と Classic Cloud Services のフォールト | Azure の更新情報 | Microsoft Azure

Azure Chaos Studio に、Azure Key Vault と Classic Cloud Services 用のフォールトが追加されました。Key Vault Deny Access フォールトは、Key Vault のネットワーク ルールを一時的に変更することで、Key Vault へのすべてのネットワーク アクセスをブロックします。これにより、Key Vault に依存するアプリケーションがシークレット、キー、証明書 (またはそのすべて) にアクセスできないようにすることができます。Classic Cloud Services Shutdown フォールトは、サービス障害をシミュレートして、デプロイを停止します。フォールトの詳細は、フォールト ライブラリで入手できます。また、これらのフォールトは、Azure Resource Manager テンプレートまたは REST API を介して作成された実験で使用することができます。今後数週間のうちに、Azure portal の実験デザイナーを使用してこれらのフォールトを実験に追加できるようになる予定です。

Azure Chaos Studio の障害ライブラリにも追加されていますね。内部的にはKey Vaultのネットワークルールを変更して Key Vaultへのネットワークアクセスをすべて拒否させることで障害を再現してるみたいです。
Chaos Studio の障害およびアクション ライブラリ | Microsoft Docs
今回はそんな Azure Chaos Studio の Azure Key Vault 障害を実際に試してみようと思います。

実際にAzure Chaos Studio で Azure Key Vault の障害を起こしてみた

KeyVault 障害実験 セットアップ編

Azure Chaos Studio の使い方を説明しつつ、セットアップを行っていきます。

Azure Portal で Azure Chaos Studio を選択し、左のブレードで「対象」を選択するとAzure Chaos Studio で障害の対象にすることができるリソースの一覧が表示されます。まずはこちらの画面で対象リソースのターゲットを有効にする必要があります。
対象のリソース(今回は○○-KVと書いてあるkeyvaultのリソース)のチェックボックスをONにして、左上のターゲットを有効にするの中にある「サービス直接ターゲット(すべてのリソース)を有効にする」を選択します。
ちなみに「サービス直接」と「エージェントベース」の2種類がありますが、「サービス直接」はPaaSリソースなどを Azure Chaos Studio から直接操作して障害を起こす方法で、「エージェントベース」はサービスを直接操作するのではなく、VMなどにエージェントを入れて障害を起こす方法です。そのため、Azure Key Vault の場合はサービス直接の方法で障害を起こしますので「サービス直接」が選択されます。
対象のリソースが有効になると上記赤枠の部分が「有効」に変わります。私がためしたときは有効になるまで少し時間がかかり、もう一回有効にする操作をしたら有効に変わりましたが、ただ反映が遅かっただけかもしれません。
リソースが有効になりましたら、続いて左のブレードで「実験」を選択し、「カオス実験(Experiments)」の作成を行います。「作成ボタン」を押すと。「実験作成」画面が開きます。
「基本」タブでは実行するサブスクリプション、リソースグループ、実験の名前、リージョンを入力します。このときリソースグループやリージョンは実験を行うリソースと違う場所にあっても問題ありません。
続いて「実験デザイナー」タブの入力です。こちらでは実際に起こす障害を設定することができます。また、障害は単一で起こすだけではなく、ステップやブランチなどを使ってストーリーベースに設定できます。「アクションの追加」で障害(フォールト)を追加できます。
「フォールト」の欄で発生させたい障害を選択します。今回は「Key Vault Deny Access」です。現状、Azure KeyVaultではこちらの障害のみ対応となりますが、リソースの種類によっては様々な障害の種類を選択できます。パラメーターは障害ごとに異なりますが、今回は「Duration」ということで障害を発生させ続ける時間を入力します。
「ターゲットリソース」には先ほど有効にしたリソースの中で今回選択した障害「Key Vault Deny Access」に対応しているリソースの一覧が表示されます。今回対象にしたいリソースを選択しましょう。
先ほど追加した「Key Vault Deny Access」が反映されてますね。ステップやブランチの設定もできますが、今回は単純に障害を起こしたいだけなのでそのままで作成します。
ここまできたら「確認および作成」に移動し、「作成」をクリックします。これで実験の作成は完了です。続いて作成した「実験」に対象サービスのロールを付与する必要があります。このロールを付与しないと「実験」が各サービスを操作できないため障害を起こすことができません。リソースごとにどの権限を割り振る必要があるかは下記ページに書かれているので確認しましょう。
Chaos Studio でサポートされているリソースの種類とロールの割り当て | Microsoft Docs
Key Vaultの場合は「Key Vault Contributor」の権限が必要そうです。

障害を起こす対象リソースのロールの割り当て画面に移動し、「Key Vault Contributor」を追加します。
メンバーの選択肢に先ほど作成した実験の名前を入力すると、候補に出てくるので追加します。 これで実行の準備は完了です。

KeyVault 障害実験 実行編

「実験」を作成し、ロールの割り振りが完了したら、後は実行するだけです。 まずは Chaos Studio のページから作成した「実験」を選択します。

実行する実験のページを開いたら、左上にある「開始」ボタンをクリックします。
履歴に新しい行が増え実験が動き出します。
ターゲットのAzure Key Vaultのページに向かってみるとシークレットの一覧が表示されなくなっていることが確認できます。

Azure Key Vault のネットワーク設定を見てみると一時的にすべてのネットワークアクセスが無効にされているようです。この間は停止している Azure Key Vault を使ったアプリケーションが動かなくなるため、Azure Key Vaultの障害を疑似的に再現できます。Azure Key Vault はApp Serviceでのアプリケーション設定と連携した接続文字列の格納や、シークレットを格納したり証明書を保存したりと核となる部分ですのでそういったときにどういった影響がでるのかをシミュレーションできますね。

実行が終わるとターゲットとなったAzureリソースは元通りアクセスできるようになってました。お見せした通り、 Azure Chaos Studio は実際にAzureリソースに疑似的な障害を簡単に起こせるので実際にAzure環境でためして、アプリケーションの回復性を向上させていきましょう。

Azure Chaos Studio を使用してみて

Azure Chaos Studio を使わないで障害を再現しようとした場合、全く別のツールを使用したり、購入したりする必要があるため、導入費用や学習コストが発生します。そういった意味でも Azure PaaS リソースを使う身としてはできる限り、マネージドレベルの高い Azure Chaos Studio は求めていた機能が来たなという実感があります。ぜひ、AppServiceやSQL DatabaseなどのPaaSサービスの対応拡充を楽しみにしてます。懸念事項としては現状プレビュー版で無料で使用できるため、費用感が気になるところではありますが、継続的に実行するCIなどにも組み込めたら面白いと思います。

Azure Chaos Studio を実際に動かしてみたデモ動画

以前私が Jazug Night でLT登壇した際に Azure Chaos Studio について紹介した動画です。よろしければこちらもご覧ください。Azure Chaos Studio を使用して Azure VM に障害を起こしてAzure Traffic Manager によるルート変更が行われるかを試しています。

www.youtube.com

登壇時の資料です。

www.slideshare.net

参考URL

docs.microsoft.com

docs.microsoft.com