Gremlinというカオスエンジニアリングサービスを使ってみました。
Gremlinの概要
公式ドキュメントの説明
Turn failure into resilience. Gremlin provides you with the framework to safely, securely, and simply simulate real outages with an ever-growing library of attacks. Using Chaos Engineering to improve system resilience, Gremlin’s “Failure as a Service” makes it easy to find weaknesses in your system before they cause problems for your customers. We offer several categories of attacks to inject faults into your system:
Google翻訳
障害を回復力に変えます。 Gremlinは、増え続ける攻撃のライブラリを使用して、実際の停止を安全かつ安全に簡単にシミュレートするフレームワークを提供します。 Chaos Engineeringを使用してシステムの復元力を向上させるGremlinの「サービスとしての失敗」は、顧客に問題を引き起こす前にシステムの弱点を簡単に見つけることを可能にします。 システムに障害を注入するために、いくつかのカテゴリの攻撃を提供しています。
今回の構成
Gremlinのプラン
Gremlinには、FreeプランとProプランがあります。 Freeプランだと、対象ホスト数は5台まで、できる攻撃も3種類(Shutdown、CPU、Blackhole)と機能が限定されますが、今回はFreeプランで試してみました。
https://www.gremlin.com/pricing/
Gremlinのアカウントを準備
GremlinはSaaSサービスなので、アカウントを作成する必要があります。
メールアドレス、名前の登録
サインアップページにアクセスし、メールアドレスと名前を入力します。
パスワード、Role、会社名、チーム名の設定
Gremlin管理画面
アカウント作成に成功すると、管理画面に遷移します。
Team ID、Secret Keyの確認
管理対象ホストでGremlinデーモンを起動する際にTeam IDとSecret Keyが必要になります。
Gremlinの管理画面で確認をしましょう。
まず、アカウント名のところをクリックします。
次にCompany Settingsをクリックします。
次にTeams > 作成したTeam名 > Configuration の順にクリックしていきます。
Team IDが確認できます。
Secret KeyはResetボタンをクリックして作成する必要があります。
ホストへGremlin Daemonのインストール
今回はEC2インスタンス(Amazon Linux 2)にGremlin Daemonをインストールしました。
参考にしたページ
iproute-tcのインストール
$ sudo yum install -y iproute-tc
Gremlinリポジトリのインストール
$ sudo curl https://rpm.gremlin.com/gremlin.repo -o /etc/yum.repos.d/gremlin.repo
Gremlin Daemonのインストール
$ sudo yum install -y gremlin gremlind
Gremlin Daemonの起動
ここでTeam IDとSecret Keyが必要になります。
$ sudo gremlin init Please input your Team ID: ダッシュボードで確認した自分のTeam IDを入力します。 Please input your Team Secret: ダッシュボードで確認した自分のSecret Keyを入力します。 Metadata set for [ gremlin-client-version: 2.12.25 ] Metadata set for [ os-type: Unknown ] AWS metadata may be present Metadata set for [ instance-id: i-0695731fe62dc9add ] Metadata set for [ local-hostname: ip-10-200-10-27.ap-northeast-1.compute.internal ] Metadata set for [ local-ip: 10.200.10.27 ] Metadata set for [ public-hostname: ec2-13-231-133-222.ap-northeast-1.compute.amazonaws.com ] Metadata set for [ public-ip: 13.231.133.222 ] Metadata set for [ cloud: AWS ] Metadata set for [ image-id: ami-0af1df87db7b650f4 ] Metadata set for [ instance-type: t2.micro ] Metadata set for [ region: ap-northeast-1 ] Metadata set for [ zone: ap-northeast-1a ] Azure metadata may be present Using xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx for Team Id Using 10.200.10.27 for Gremlin identifier
ホストの登録を確認
管理画面 > Clients を見ると、EC2インスタンスがClientsとして登録されているのがわかります。
なお、初期状態では2つのデモ用ホストも登録されていますが、初めてのAttackが完了すると、これらは自動的に削除されるようです。
Attackの作成
管理画面 > Attacks > New Attack をクリックします。
Choose Hosts target
攻撃対象にするEC2インスタンスを選択します。
Choose a Gremlin
どのような攻撃をするのか定義します。
Freeプランの場合は、鍵マークがある項目は選択できません。
今回は下記のように、「CPU:80%が300秒続く攻撃」を定義してみました。
- Resource > CPU
- Length(攻撃秒数): 300
- CPU Capacity(CPU Coreあたりでアクティブにするパーセンテージ): 80%
- Cores(いくつのCoreをターゲットにするか): 1
Coresは、数字だけでなく、「All Cores」 という指定も可能です。 ただ、今回の対象ホストは、t2.microでコアは1つだけなので、「1」でも「All Cores」でも結果は同じになるはずです。
Run the Attack
Attackのスケジューリングをします。
「Only Once」という、その場で1回だけ実行もありますが、今回は少し複雑なスケジュールを作成してみます。
- 攻撃する曜日は、土曜日と日曜日
- 1日あたりの攻撃回数は、20回
- 攻撃する時間帯は、16時〜20時
Unleash Gremlin
Unleash Gremlinボタンを押すと、設定が確定されます。
Unleashは「解き放つ」という意味です。
Gremlinが解き放たれました!
Gremlinが暴れるのを観察
指定した時間帯のCloudWatchは、下記のようになりました。
CPU使用率がスパイクしているのがわかります。
t2.microなので、CPUクレジットがギリギリでした。
攻撃発生中にLinuxのtopコマンドを打ってみると、gremlinがCPU消費しているのがわかります。
$ top - 07:35:03 up 1:39, 0 users, load average: 0.96, 0.29, 0.10 Tasks: 85 total, 1 running, 47 sleeping, 0 stopped, 0 zombie %Cpu(s): 96.3 us, 0.7 sy, 0.0 ni, 3.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 1006968 total, 485772 free, 86828 used, 434368 buff/cache KiB Swap: 0 total, 0 free, 0 used. 772604 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 704 gremlin 20 0 26148 6928 6604 S 49.2 0.7 0:54.44 gremlin 713 gremlin 20 0 26128 6988 6668 S 47.5 0.7 0:13.66 gremlin 1 root 20 0 125488 5436 3984 S 0.0 0.5 0:01.46 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H 6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq 7 root 20 0 0 0 0 S 0.0 0.0 0:00.15 ksoftirqd/0 8 root 20 0 0 0 0 I 0.0 0.0 0:00.22 rcu_sched
管理画面で実行ログが見れます。
感想
Gremlinの導入は、想像よりも簡単でした。
管理画面も使いやすく、完成度が高いように感じます。
今回のケースだと単純にCPU使用率でしたが、Proプランにすれば、ネットワークのLatency等いろいろできて良さげです。
渡辺 信秀(記事一覧)
2017年入社 / 地味な内容を丁寧に書きたい