カオスエンジニアリングをゲーム形式で体感できるデバイスを開発してみた
Author : 服部 一成
こんにちは。ソリューションアーキテクトの服部です。普段は製造業のお客様をご支援してます。
本記事では、AWS Summit 2023 内 builders.flash EXPO で「Chaos Kitty」というデモキットを出展したことに関連して (Chaos Engineering と可視化を体験できる Chaos Kitty のご紹介)、カオスエンジニアリングをご自宅でも楽しんでいただけるようにデバイスの作成手順をご紹介します。
Chaos Kitty はカオスエンジニアリングやセキュリティを学べるデモキットです。カオスエンジニアリングの原則は「カオスエンジニアリングの原則」をご覧ください。
Chaos Kitty とは、クラウド上に構築した分散システムの状態を可視化するために、IoT 電球と LTE ルーターと Raspberry Pi 4 を使ったデモキットです。
障害が挿入されるとクラウド上の Web 三層アーキテクチャの障害対象リソースを表現したレゴブロックの障害挿入箇所の IoT 電球の色が緑から赤に変更します。障害箇所を特定後、ゲームの参加者はクラウドのコンソールで障害を修正を行い、どれだけ早く修正できたかスピードを競います。
本家の Chaos Kitty は展示用に規模も大きく、展示会に出展した際でも IoT 電球との接続設定を簡略化できるよう LTE ルーターを使っていますが、今回はこの Chaos Kitty をご家庭でも楽しめるように IoT 電球や LTE ルータが不要なミニ版を作ってみたのでご紹介します。
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
1. 本デモキットの動作の流れ
本デモの動作の流れは、次の通りです。
- 緑または赤のボタンを押す。しばらくすると LED のどこかが赤く変わります。
- クラウド側に障害が挿入されたので、 LED の配置をヒントに AWS コンソールで障害を修正していきます。
- リソースが正しく修正されると LED が緑色に戻ります。
デモの様子を動画でご覧ください。
2. 注意事項
Chaos Kitty はカオスエンジニアリングを学ぶために意図的にセキュリティ的に脆弱な設定を挿入します。Chaos Kitty を実行した際は、ゲームを終えるためにセキュリティ的に脆弱な設定を必ず修正してください。正しい設定は末尾 Appendix : Chaos Kitty の答え に掲載してます。
3. LED とスイッチの配置例
AWS Summit 2023 で展示した Chaos Kitty は Web 三層アーキテクチャをレゴブロックと IoT 電球で表現してました。今回のデバイスも LED とレゴブロックで AWS のリソースを表現してます。
4. 今回作成するデバイスと AWS 環境
クラウド環境とデバイスの関係は以下の図のとおりです。
タクトスイッチを押すと、デバイスから MQTT プロトコルで Publish します。クラウド上の Chaos Kitty リソースが変更されると、Amazon Event Bridge が AWS Lambda と AWS IoT Core を経由して MQTT プロトコルで Publish し、デバイスの LED を変更します。
5. 用意するもの
- Raspberry Pi 4 Model B
- SD カード (今回 Raspberry Pi OS を利用してます)
- WIFI ネットワーク
- ブレッドボード : 2 個
- 2 色 LED (緑、赤) : 8 個
- タクトスイッチ : 3 個 (3 つの機能で使い分けるので、機能別に色が分かれていると使いやすいです)
- ジャンパー線
- 抵抗 : 11 個 (330Ω / LED 用 8 個、タクトスイッチ用 3 個)
- (オプション) レゴ等の LED を支える土台
6. 物理デバイスの設定
物理デバイスの設定を行います。 Raspberry Pi の GPIO と LED ライト、タクトスイッチの関係は以下のようになってます。
用途 | NAME | PinNo | PinNo | NAME | 用途 |
スイッチ側電源 | 3V3 | 1 | 2 | 5V | |
GPIO2 | 3 | 4 | 5V | ||
GPIO3 | 5 | 6 | GND | スイッチ側接地 | |
LED1Green | GPIO4 | 7 | 8 | GPIO14 | LED8Green |
GND | 9 | 10 | GPIO15 | LED8Red | |
LED2Green | GPIO17 | 11 | 12 | GPIO18 | LED1Red |
LED2Red | GPIO27 | 13 | 14 | GND | |
LED3Red | GPIO22 | 15 | 16 | GPIO23 | |
3V3 | 17 | 18 | GPIO24 | 赤スイッチ | |
GPIO10 | 19 | 20 | GND | ||
GPIO9 | 21 | 22 | GPIO25 | 青スイッチ | |
GPIO11 | 23 | 24 | GPIO8 | 緑スイッチ | |
GND | 25 | 26 | GPIO7 | ||
GPIO0 | 27 | 28 | GPIO1 | ||
LED3Green | GPIO5 | 29 | 30 | GND | |
LED5Green | GPIO6 | 31 | 32 | GPIO12 | LED4Green |
LED5Red | GPIO13 | 33 | 34 | GND | |
LED6Green | GPIO19 | 35 | 36 | GPIO16 | LED4Red |
LED6Red | GPIO26 | 37 | 38 | GPIO20 | LED7Green |
LED側接地 | GND | 39 | 40 | GPIO21 | LED7Red |
ブレッドボードに LED ライトとタクトスイッチを配線します。配線のサンプル図はこちらです。
各ボタンの役割は以下のようになっています。
- 緑ボタン : Easy mode 実行
- 赤ボタン : Hard mode 実行
- 青ボタン : 自動修復実行
クリックすると拡大します
7. AWS CloudFormation の実行
クラウド環境の構築は Chaos Kitty Workshop の Building your own physical Chaos Kitty の手順に則って構築します。
環境構築まで 20 分ほどかかりますので、その間にデバイスの設定を行います。
8. Raspberry Pi の設定
デバイスの設定を行うため、まずは Raspberry Pi OS をセットアップします。セットアップ方法については Raspberry Pi 公式ページ「Getting Started」を参照してください。
8-1. Node-Red のインストール
Chaos Kitty では各 LED の色を MQTT Topic を Subscribe して変更します。クラウドから MQTT メッセージを Publsih し色を変更したり、ボタンの押下で MQTT メッセージを Publish するアプリケーションを作成するために、Node-Red をインストールします。インストール手順は こちら を参考に設定します。
AWS IoT Core を設定するパレットを追加するため、node-red-contrib-aws-iot を追加します。
cd ~/.node-red
npm install node-red-contrib-aws-iot
node-red-restart
8-2. AWS IoT Core にモノを登録
クラウドと接続を行うため、 AWS IoT Core を利用します。モノの名前を「rpi4」で登録します。利用するリージョンは Chaos Kitty Workshop でリソースを作成したリージョンをご利用ください。
ダウンロードした証明書とプライベートキーは、Raspberry Pi 上の /home/pi/aws/certs などに保存します。また、ルート CA 証明書もダウンロードして同様に Raspberry Pi に保存します。
クリックすると拡大します
8-3. フローの読み込み
Chaos Kitty ではクラウド側の状態を LED で表現するため、MQTT を利用します。 AWS IoT Core の認証情報と AWS IoT Core のエンドポイントを Node-Red に設定します。
Node-Red を Raspberry Pi から開いた場合は、 http://localhost:1880 へアクセスします。他のマシンからブラウジングする場合は http://<raspberypi-ip-address>:1880 からアクセス可能です。
サンプルフローを使って Node-Red にフローを作成します。フローは こちらのサンプル をご利用ください。
1. サンプルフロー (flows.json) を保存します。
2. Node-Red 左上のハンバーガーメニューを開き、読み込みからサンプルフローファイルをロードします。
クリックすると拡大します
LEDControl 、Button 、Success の 3 つのタブが作成されます。
8-4. Node-Red に AWS IoT Core のエンドポイントと認証情報を追加
1. Node-Red のパレットの aws-iot-in から Server を開き、 Server 横の🖊️をクリックしてaws-iot-broker ノードを編集します。Connection タブから AWS IoT Core の接続先を設定します。
各アカウントのデバイスデータエンドポイントは AWS IoT Core コンソールの [Settings] (設定) ページで確認できます。
Server | <AWS IoT Core のデバイスデータエンドポイント> |
Port | 8883 |
Client ID | rpi4 |
Keep Alive Time | 60 |
クリックすると拡大します
2. Node-Red のパレットの aws-iot-broker の Security を開き、flows.json に記載された値から Raspberry Pi 上に保存した AWS IoT Core の証明書とプライベートキーとルートCA 証明書のパスへ変更します。
Key Path | < プライベートキーまでの Path> |
Cert Path | < デバイス証明書までの Path > |
CA Path | < ルート CA 証明書までの Path> |
クリックすると拡大します
3. Bulb と呼ばれる LED ライトと AWS リソースの関係を下記に掲載します。
LEDNo | AWS | BulbNo |
1 | Amazon S3 | 38 |
2 | AWS CloudTrail | 32 |
3 | Amazon EC2 Security Group | 33 |
4 | Elastic Load Balancing Security Group | 31 |
5 | Amazon EC2 IAM Role 2 | 35 |
6 | Amazon EC2 IAM Role 1 | 34 |
7 | Amazon RDS IAM database authentication | 37 |
8 | Amazon RDS Security Group | 36 |
8-5. AWS IoT Core のルールから AWS Lambda を起動する設定を追加
1. AWS コンソールにログインし、「AWS IoT Core」> 「メッセージのルーティング」> 「ルール」を開き、「ルールを作成」をクリックします。
クリックすると拡大します
2. ルール名に redButtonPressed を入力して、「次へ」をクリックします。
クリックすると拡大します
3. SQL ステートメントに SELECT * FROM 'rpi4/button/red' WHERE button_pressed_state=1 を入力して、「次へ」をクリックします。
クリックすると拡大します
4. ルールアクション 1 で「Lambda」、 Lambda 関数に「ExecuteRandomExperiments」を選択して「次に」をクリックし、確認画面で「作成」をクリックします。
クリックすると拡大します
5. 同様の手順で、以下のように設定します。
- ルール名「greenButtonPressed」
- SQL ステートメント : SELECT * FROM 'rpi4/button/green' WHERE button_pressed_state=1
- Lambda 関数 : ExecuteRandomExperiment
- ルール名「blueButtonPressed」
- SQL ステートメント : SELECT * FROM 'rpi4/button/blue' WHERE button_pressed_state=1
- Lambda 関数 : RemediationFunction
9. まとめ
AWS Summit Tokyo 2023 で展示した Chaos Kitty と比較して大幅にコンパクトで個人で楽しめるデバイスになりました。リソースの状態を物理的に可視化するという考え方は他のシステムにも応用できるので、この記事をきっかけに AWS や IoT の活用を読者の皆様にご検討いただけると幸いです。
Appendix : Chaos Kitty の答え
LEDNo | AWS リソース | 挿入される障害 | 修正方法 |
1 | Amazon S3 | パブリックアクセスのブロックがオフになる | Bucket のパブリックアクセスのブロックをオンにする |
2 | AWS CloudTrail | ログ記録がオフになる | ログ記録をオンにする |
3 | Amazon EC2 Security Group | セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 が追加される | セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 を削除する |
4 | Elastic Load Balancing Security Group | セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 が追加される | セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 を削除する |
5 | Amazon EC2 IAM Role 2 | アタッチされたロールが EC2UnSafeRoleXXX へ変更される | アタッチされたロールを EC2SafeRoleXXX へ変更する |
6 | Amazon EC2 IAM Role 1 | アタッチされたロールが EC2UnSafeRoleXXX へ変更される | アタッチされたロールを EC2SafeRoleXXX へ変更する |
7 | Amazon RDS IAM database authentication | RDS の認証設定がパスワードのみに変更される | RDS の認証設定を IAM とパスワードの設定に変更する |
8 | Amazon RDS Security Group | セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 が追加される | セキュリティグループのインバウンド設定 SSH 0.0.0.0/0 を削除する |
筆者プロフィール
服部 一成
アマゾン ウェブ サービス ジャパン合同会社 ソリューションアーキテクト
化学系のお客様を中心として、 AWS の利用をご支援してます。ビールを飲むこととポケモンのゲームが好き。
AWS を無料でお試しいただけます