Open-source failure injection on AWS #reinvent #OPN304 で聞いたことを試してみる(chaos-ssm-documents)

AWS re:Invent 2020 のセッション 「Open-source failure injection on AWS」 の中で出てきたオープンソースを使って障害注入をする方法を試してみます
2020.12.11

セッション概要

Open-source failure injection on AWS

※ re:Invent 2020 サイトにログインが必要

分散ソフトウェアシステムは、いくつかの個別のサブシステム(CDN、ロードバランサー、データベースなど)とそれらの相互作用で構成されています。これらの相互作用は、予期しない乱流イベント(ネットワーク障害など)によって引き起こされる予測できない動作をすることがあり、良性の問題を壊滅的な障害に変える可能性があります。このようなイベントは、システムの障害に対する回復力に自信を持たせるのに役立つ分野であるカオスエンジニアリングによって最小限に抑えることができます。 このセッションでは、AWS SystemsManagerを使用したAmazonEC2およびAmazonECSでの障害注入へのオープンソースアプローチを紹介し、PrimeVideoがこのアプローチをより高いレベルの復元力のための負荷テストと組み合わせる方法について説明します。

試してみる

セッションの中で紹介されていたオープンソースは以下のようなものがありました。

AWS SystemsManagerのRun Commandを利用して何らかのアクションを行うツールとなってます。

※ 概要図

本記事では、chaos-ssm-documents を使って障害を注入してみます。

chaos-ssm-documentsのセットアップ

レポジトリからcloneします。

$ git clone git@github.com:adhorn/chaos-ssm-documents.git

SSM Agentが入ったインスタンスを起動

Amazon Linux, Amazon Linux 2, Amazon Linux 2ECSに最適化されたAMI, Ubuntu Server 16.04、18.04、および20.04にプリインストールされているので、どれかのAMIを使ってEC2を起動します。

障害注入のドキュメントをアップロード

SystemsManagerのドキュメントにchaos-ssm-documentsをアップロードします。

内包されているドキュメントは画像の通りです。

ここではCPUの負荷を上げる cpu-stress.yml をアップロードしてみます。

$ cd chaos-ssm-documents/run-command

## cpu-stressをかけるドキュメントのアップロード
$ aws ssm create-document --content file://cpu-stress.yml --name "cpu-stress" --document-type "Command" --document-format YAML

マネージメントコンソールのドキュメント一覧からアップロードしたものがあるか確認できます。

コマンドを実行する

アップロードしたcpu-stress.ymlを実行してみます。

内容ですが、以下のリンクから確認できます.

cpu-stress.yml

内部で stress-ng --cpu {{ cpu }} --cpu-method matrixprod -t {{ duration }}s というコマンドを実行していますね。

マネージメントコンソールからcpu-stressを検索し、実行します。

このコマンドには、以下のパラメーターが設定できます

  • Duration: 攻撃時間(デフォルトは60秒)
  • Cpu: Cpuの数(デフォルトは全て)
  • Install Dependencies: コマンド実行に必要なパッケージをインストールするかどうか(デフォルトはtrue)

今回は全てデフォルトで行いました。

※ Install Dependenciesは stress-ng, tc, jq です。

実行対象のインスタンスを選択します。。

その他のオプションで レート制御, 出力オプション, SNS 通知 がありますが、今回は出力オプションを無効にし、あとはデフォルトにしておきました。

あとは実行ボタンを押して実行するだけです。

ちなみに、コマンドラインからも実行できます。

※ 今回の設定のコマンドは以下

aws ssm send-command --document-name "cpu-stress" --document-version "1" --targets '[{"Key":"InstanceIds","Values":["<<インスタンスID>>"]}]' --parameters '{"duration":["60"],"cpu":["0"],"InstallDependencies":["True"]}' --timeout-seconds 600 --max-concurrency "50" --max-errors "0" --region ap-northeast-1

実行中の状況確認

htopコマンドを利用して実行中のCPU使用率を見ていきます。

実行前: 1%以下

実行中: 100%に

コマンド内容通り、60秒間CPUに対して負荷をかけれていることがわかりました。

コマンドのステータス確認

成功になっていました。

まとめ

オープンソースライブラリのchaos-ssm-documentsをSSM Run commandを使用してCPUに対して攻撃をかけました。

CPUの他にもMemoryやネットワークレイテンシー、ブラックホール、IO、プロセスキルなどが行えますので、カオスエンジニアリングを行う上で使えるツールだと思います。 オープンソースとして用意されている点も大きいですね。

セッションではAmazonプライムビデオでもSSMを使用して様々なカオス実験を行なっていると説明されていますので、興味のある方はぜひ視聴してみてください(来週にはアーカイブが配信されるはず)。

ECSに対しても実行できますが、EC2ベースだけでFargateは未対応となっています。 今後できるようになるといいなー。