Failure as a Service!カオスエンジニアリングのセッションで紹介されていたGremlinのドキュメントを読んでみた #reinvent

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

re:Invent2018のカオスエンジニアリングについてのセッション、AWSのモダンアプリケーションに対するカオスエンジニアリングにて、Gremilinというサービスについての紹介とデモがありました。 サービスについて気になったので、本記事ではドキュメントをみながらGremlinについてまとめてみます。

Gremlinの概要

Gremlinはシステムの弱点を見つけるためにシステムに障害を注入するためのサービスです。 インフラもしくはアプリケーションレベルでの障害を注入することができます。 Gremlinは、システムの弾性を得るためのカオスエンジニアリングの実践を、安全、シンプル、セキュアに提供します。

Gremlinでどんな障害を起こせるのか?

大きく以下の3つのカテゴリがあります。

  • Resource Gremlins
  • Network Gremlins
  • State Gremlins

各攻撃のドキュメントはこちらです。

Resource Gremlins

  • CPU
    • 1つまたは複数のコアの利用率を高めることができます
  • Memory
    • 指定した量のRAMをアロケートできます
  • IO
    • ハードディスクのようなデバイスにread/writeの負荷をかけられます
  • Disk
    • 指定した割合までディスクを占有できます

Network Gremlins

  • Blackhole
    • マッチした全てのネットワークトラフィックを落とすことができます
  • Latency
    • アウトバウンドのトラフィックでマッチしたものにレイテンシーを注入できます
  • Packet loss
    • アウトバウンドのトラフィックでマッチしたものをパケットロスさせられます
  • DNS
    • DNSサーバへのアクセスをブロックできます

State Gremlins

  • Shutdown
    • ホストOSをシャットダウン、リブートできます
    • 例えば、クラスタのマシンをロスした際のシステムの挙動をテストできます
  • Time travel
    • ホストのシステム時間を変更できます
    • 夏時間や、その他の時間に関連するイベントをシミュレートできます
  • Process killer
    • プロセスをkillできます
    • アプリケーションや依存のクラッシュをシミュレートできます

アプリケーションレイヤでのシミュレート

上記の機能でもリクエストレベルでのマッチングパターンをコントロールすることで、アプリケーションレイヤでの特定の機能に対する障害のシミュレートができますが、サーバレスの環境ではこのやり方ができません。

ALFI(Gremlinの障害シミュレートの機構?)はJVMでライブラリとして実行されるので、アプリケーションに直接統合することができます。 こちらでは、アプリケーションレベルでのJavaとGremlinの統合方法について紹介しています。

アプリケーションレイヤでのシミュレートのユースケースとして、以下のような例が紹介されています。

  • 自分用のIDでのアクセスに対する障害をシミュレートすることで、他のユーザに障害を見せずに問題の兆候を確認できる
  • 特定のエンドポイントのみの障害をシミュレートすることで、部分的な障害に対するシステムの挙動を確認できる

統合について

上述のアプリケーションレイヤでの統合は性質上環境によらない気がしますが、インフラレイヤでの利用についてはECS、K8S、Ubuntu、CentOSなどの環境でのチュートリアルが準備されています。 詳細はドキュメントを参照ください。

ワークフローについて

障害を発生させるトリガーとして、WebUIとAPIが用意されています。 このうちWebUIでは、いわゆるGUIでの設定と障害発生の実行以外に、スケジュールを設定して定期的に障害を発生させることができます。

いわゆるカオスエンジニアリングとして本番環境で実行させる場合にはスケジュール実行が利用できるとのことでした。 また、APIでの実行はカオスエンジニアリングとしてだけではなく、純粋に障害発生時の挙動を自動テストする場合にも便利だとのことです。

re:Inventセッションでのデモについて

デモではパケットロスを起こしながらWebアプリケーションの挙動を観察し、エラーメッセージの改善タスクを上げたり、

レイテンシーを上げた状態でWebアプリケーションの挙動を観察し、ブラウザでのキャッシュ実装のタスクを上げたり

Redisのコンテナを落としてWebアプリケーションの挙動を観察し、レプリケーションの設定を見直すタスクを上げたりする様子のデモがありました。

改善案のIssueを出すところまで込みで考えると導入の実感が湧きます。

まとめ

Gremlinはシステムの弱点を見つけるためにシステムに障害を注入するためのサービスです。 インフラもしくはアプリケーションレベルでの障害を注入することができます。 Gremlinは、システムの弾性を得るためのカオスエンジニアリングの実践を、安全、シンプル、セキュアに提供しています。

このようなテストはアプリケーション開発において本来やらなければいけないことだと思うのですが、「やりづらい」という理由でないがしろにされることが多いように思います。 シミュレートを簡単に行うプラットフォームは、この辺りの問題の解決に繋がるのではないでしょうか。