メインコンテンツに移動
日常で楽しむクラウドテクノロジー

カオスエンジニアリングをゲーム形式で体感できるデバイスを開発してみた

2023-10-03 | 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 ルータが不要なミニ版を作ってみたのでご紹介します。


X ポスト » | Facebook シェア » | はてブ »

A cartoon illustration featuring an orange cat with large eyes (Chaos Kitty) next to a blue server rack with sparks and ropes. The words 'Chaos Kitty' are displayed below. The image represents the concept of chaos engineering or server mishaps in a playful style.

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

builders.flash メールメンバー登録

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 
今すぐ特典を受け取る »

1. 本デモキットの動作の流れ

本デモの動作の流れは、次の通りです。

  1. 緑または赤のボタンを押す。しばらくすると LED のどこかが赤く変わります。
  2. クラウド側に障害が挿入されたので、 LED の配置をヒントに AWS コンソールで障害を修正していきます。
  3. リソースが正しく修正されると LED が緑色に戻ります。

デモの様子を動画でご覧ください。

2. 注意事項

Chaos Kitty はカオスエンジニアリングを学ぶために意図的にセキュリティ的に脆弱な設定を挿入します。Chaos Kitty を実行した際は、ゲームを終えるためにセキュリティ的に脆弱な設定を必ず修正してください。正しい設定は末尾 Appendix : Chaos Kitty の答え に掲載してます。

3. LED とスイッチの配置例

AWS Summit 2023 で展示した Chaos Kitty は Web 三層アーキテクチャをレゴブロックと IoT 電球で表現してました。今回のデバイスも LED とレゴブロックで AWS のリソースを表現してます。
A visual representation of an AWS architecture using LEGO bricks and electronic hardware controls. Components such as Application Load Balancer, Amazon EC2 IAM Role, Amazon RDS Security Group, AWS CloudTrail, Amazon S3, and EC2 Security Groups are labeled alongside LEGO sections and push buttons, illustrating the relationship between AWS services and physical hardware controls.

4. 今回作成するデバイスと AWS 環境

クラウド環境とデバイスの関係は以下の図のとおりです。

タクトスイッチを押すと、デバイスから MQTT プロトコルで Publish します。クラウド上の Chaos Kitty リソースが変更されると、Amazon Event BridgeAWS LambdaAWS IoT Core を経由して MQTT プロトコルで Publish し、デバイスの LED を変更します。

Architecture diagram illustrating an IoT solution using Raspberry Pi, Node-Red, AWS IoT Core, Lambda, EventBridge, and Chaos Kitty resources (Amazon EC2, CloudTrail, S3, Application Load Balancer, IAM Role, Amazon RDS). The diagram shows device and cloud interactions, including MQTT messaging and resource changes, with components labeled in Japanese and English.

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 実行
  • 青ボタン : 自動修復実行
A wiring diagram showing a Raspberry Pi connected to two breadboards, featuring push buttons, resistors, LEDs, and jumper wires. The diagram illustrates connections between GPIO pins and the components for prototyping electronics projects.

7. AWS CloudFormation の実行

クラウド環境の構築は Chaos Kitty WorkshopBuilding 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 をインストールします。インストール手順は こちら を参考に設定します。

node-red-contrib-aws-iot をインストール

AWS IoT Core を設定するパレットを追加するため、node-red-contrib-aws-iot を追加します。

bash
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 に保存します。

Screenshot of the AWS IoT device registration interface in Japanese, showing the steps for registering and securing a device within AWS IoT.

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 つのタブが作成されます。 

Screenshot of the Node-RED flow editor interface, showing an initial view with a warning about container volume mounts and data persistence. The interface is in Japanese, with various drag-and-drop functional elements and a side navigation menu displayed.

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
Screenshot of a Node-RED flow showing the configuration and control logic for LED devices using AWS IoT broker integration. The image displays connected nodes and a configuration panel for MQTT connection with AWS IoT Core, used for controlling LED states via a graphical interface.

Node-Red のセキュリティ設定

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>
Screenshot of the Node-RED user interface displaying the AWS IoT broker node's security settings in Japanese, showing fields for Key Path, Cert Path, and CA Path.

LEDとAWSリソースの関係

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」> 「メッセージのルーティング」> 「ルール」を開き、「ルールを作成」をクリックします。

AWS IoTコンソールのメッセージルーティングのルール管理画面を表示したスクリーンショット。複数のルール(blueButtonPressed, greenButtonPressed, redButtonPressed)がリストされている。日本語インターフェースで示されている。

ルール作成

2. ルール名に redButtonPressed を入力して、「次へ」をクリックします。

AWS IoTルール作成の際のプロパティ設定画面(日本語インターフェイス)のスクリーンショット。ルール名や説明の入力、タグ付けオプションなどが表示されています。

SQL ステートメントの設定

3. SQL ステートメントに SELECT * FROM 'rpi4/button/red' WHERE button_pressed_state=1 を入力して、「次へ」をクリックします。

Screenshot of the AWS IoT rule creation interface displaying the setup process for an SQL statement, with user interface elements and instructions in Japanese.

ルールアクションの設定

4. ルールアクション 1 で「Lambda」、 Lambda 関数に「ExecuteRandomExperiments」を選択して「次に」をクリックし、確認画面で「作成」をクリックします。

Screenshot of the AWS IoT Rule Action configuration interface in Japanese, showing how to attach a Lambda function as a rule action, with fields and options for Lambda function selection and versioning.

追加のルール設定

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 の利用をご支援してます。🍺を飲むこととポケモンのゲームが好き。

A portrait of a man wearing glasses and a plaid blazer, standing in an indoor setting with a blurred background.