15分で始めるGremlinによるカオス実験 #reinvent

2019.12.18

こんにちは。AWS事業本部のKyoです。

re:Invent2019で出会ったカオスエンジニアリングツール、Gremlin。これのチュートリアルページを元に簡単なカオス実験を行ってみたいと思います。

How to Use and Install Gremlin on Amazon Linux

前提

  • AWSアカウント
  • Gremlinアカウント

Team IDとSecret Keyの確認

Gremlinアプリにログインし、ダッシュボード右上のHalt All Attackの右のアイコンをクリックし、Company Settingsを開きます。そこからTeamCofigurationと選択し、Team IDSecret Keyをメモします。

Secret Keyはチームに1つで、生成時以外は確認できないので、ご注意ください(リセットは可能)。

実験内容

EC2インスタンスにCPUアタックを実施し、CPU利用率の変化を確認する。

やってみる

EC2インスタンスの起動

OSはAmazon Linux2を選択します。若干セットアップの方法は異なるようですが、UbuntuやCentOSなどにも対応しているようです。

インスタンスタイプはt2.microを選択しました。

セキュリティグループ関してはSSH用の22番ポートの解放だけで十分なようでした。

エージェント等のインストール

対象のインスタンスにSSHで接続し、エージェント等をインストールします。

SSH接続

$ ssh -i <your key> ec2-user@<public ip>

iproute-tcのインストール

$ sudo yum install -y iproute-tc

レポジトリの追加

$ sudo curl https://rpm.gremlin.com/gremlin.repo -o /etc/yum.repos.d/gremlin.repo

GremlinデーモンとCLIをインストール

$ sudo yum install -y gremlin gremlind

Gremlinの初期化

Team IDSecret Keyを聞かれますので、入力してください。

$ sudo gremlin init

Gremlinアプリとの紐付け確認

ここまでの作業に問題がなければダッシュボードから対象のインスタンスが見えているはずです。

Gremlinによる障害の注入

CPU利用率の事前確認

実験を始める前に、現在のCPU利用率を確認します。

$ top

こんな感じでした。

 PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1 root      20   0   43592   5344   4012 S  0.0  0.5   0:02.23 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.08 ksoftirqd/0
    8 root      20   0       0      0      0 I  0.0  0.0   0:00.38 rcu_sched
    9 root      20   0       0      0      0 I  0.0  0.0   0:00.00 rcu_bh
   10 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
   11 root      rt   0       0      0      0 S  0.0  0.0   0:00.14 watchdog/0
   12 root      20   0       0      0      0 S  0.0  0.0   0:00.00 cpuhp/0
   14 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs
   15 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 netns
   16 root      20   0       0      0      0 I  0.0  0.0   0:00.20 kworker/u30+
   21 root      20   0       0      0      0 S  0.0  0.0   0:00.00 xenbus
   22 root      20   0       0      0      0 S  0.0  0.0   0:00.01 xenwatch
  172 root      20   0       0      0      0 S  0.0  0.0   0:00.01 khungtaskd
  173 root      20   0       0      0      0 S  0.0  0.0   0:00.00 oom_reaper
  174 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 writeback

Gremlinアプリ操作

Attacks、Infrastructureから、New Attackを選択します。

Choose Hosts to targetからExtractを選択し、チェックボックスで対象のインスタンスを選択します。

その後、Choose a Gremlinで、Resource、CPUを選択します。

画面下のUnleash Gremlinボタンでいよいよ実行です! なお、Unleashとは「解き放つ」という意味で、グレムリンを解き放って悪さをさせるイメージのようですね。

CPU利用率の確認

topコマンドで確認するとgremlinがCPUを占有していることが確認できます。

 PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 6287 gremlin   20   0   22260   8664   7128 S 99.7  0.9   0:06.31 gremlin
    1 root      20   0   43592   5344   4012 S  0.0  0.5   0:02.23 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.08 ksoftirqd/0
    8 root      20   0       0      0      0 I  0.0  0.0   0:00.38 rcu_sched
    9 root      20   0       0      0      0 I  0.0  0.0   0:00.00 rcu_bh
   10 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0
   11 root      rt   0       0      0      0 S  0.0  0.0   0:00.14 watchdog/0
   12 root      20   0       0      0      0 S  0.0  0.0   0:00.00 cpuhp/0
   14 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs
   15 root       0 -20       0      0      0 I  0.0  0.0   0:00.00 netns
   16 root      20   0       0      0      0 I  0.0  0.0   0:00.21 kworker/u30+
   21 root      20   0       0      0      0 S  0.0  0.0   0:00.00 xenbus
   22 root      20   0       0      0      0 S  0.0  0.0   0:00.01 xenwatch
  172 root      20   0       0      0      0 S  0.0  0.0   0:00.01 khungtaskd
  173 root      20   0       0      0      0 S  0.0  0.0   0:00.00 oom_reaper

なお、今回ではlengthがデフォルトの60秒なので、60秒後には元に戻ります。また、ダッシュボード右上の赤いボタンHalt All Attackから強制停止を行うことも可能です。

おわりに

まずは基本のき、という事でEC2インスタンスにCPU障害を注入してみました。作業もエージェントのインストールだけで、非常にシンプルでした。

同じ要領で、Process killerやBlackhole等も簡単に試せるので、これを期にカオスエンジニアリングに入門してみてはいかがでしょうか?

以上、何かのお役に立てれば幸いです。