概要
意図的に障害を起こすことで、事前の予防策や復旧について学ぶことが目的のサービス
カオスエンジニアリングというらしい
これをAWSサービスに対してテンプレートを組んで行えるようにしたサービス
楽しそうなので触ってみる
準備
FIS経由で各サービスを動かすので必要なポリシーをアタッチしたIAMロールを作成する
ポリシー作成
とりあえず、ドキュメントに記載がある触りたいサービスの許可ポリシーをJSON形式で作成
また、後ほど実験テンプレートのログをcloudwatchに送信するためにcloudwatchLogsへのフルアクセスも追加
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowFISExperimentRoleEC2Actions",
"Effect": "Allow",
"Action": [
"ec2:RebootInstances",
"ec2:StopInstances",
"ec2:StartInstances",
"ec2:TerminateInstances"
],
"Resource": "arn:aws:ec2:*:*:instance/*"
},
{
"Sid": "AllowFISExperimentRoleSpotInstanceActions",
"Effect": "Allow",
"Action": [
"ec2:SendSpotInstanceInterruptions"
],
"Resource": "arn:aws:ec2:*:*:instance/*"
},
{
"Sid": "AllowFISExperimentRoleECSUpdateState",
"Effect": "Allow",
"Action": [
"ecs:UpdateContainerInstancesState"
],
"Resource": "arn:aws:ecs:*:*:container-instance/*"
},
{
"Sid": "AllowFISExperimentRoleECSStopTask",
"Effect": "Allow",
"Action": [
"ecs:StopTask"
],
"Resource": "arn:aws:ecs:*:*:task/*"
},
{
"Sid": "AllowFISExperimentRoleRDSReboot",
"Effect": "Allow",
"Action": [
"rds:RebootDBInstance"
],
"Resource": "arn:aws:rds:*:*:db:*"
},
{
"Sid": "AllowFISExperimentRoleRDSFailOver",
"Effect": "Allow",
"Action": [
"rds:FailoverDBCluster"
],
"Resource": "arn:aws:rds:*:*:cluster:*"
},
{
"Action": [
"logs:*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
ロール作成
カスタム信頼ポリシーを自前で入力してロールを作成 (ポリシーはさっき作ったものをアタッチ
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"fis.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}
FISの実験テンプレートを作成
今回はRDSのフェイルオーバを試してみるので、アクションタイプは「aws:rds:failover-db-cluster」を指定
他にもEC2やECSなどに対して実行できる
実行
先ほど作成したテンプレートの「実験の開始」で即座に実行される
フェイルオーバが走り、cloudwatchに実行ログが送信されればok
雑記
他にもEC2にCPU/IO負荷をかけたり、スポットの強制回収ができたりする模様
テストしたいけど、どうやってテストしたら良いかわからないときにFISを覗いてみればうまくテストできるかもしれない
テストの終了条件にcloudwatchアラームを設定など汎用性も高いので、具体的なテストプランを構築して負荷/障害試験を行うなど色々と楽しめそう