# AWS Fault Injection Service (FIS)による動作検証

AWS Fault Injection Serviceを利用することで、導入したHULFT環境で障害が発生した際の挙動をテストすることができます。

## 動作検証済みのシナリオ

HULFT10 for Container Servicesでは以下のアクションを実施して、サービスのフェイルオーバーが実施されることを確認しています。

- 外部ALBへの接続不可（AZ単位）

- NLBへの接続不可（AZ単位）

- DBクラスターのフェイルオーバー

- CloudWatchへの接続不可（AZ単位）

HULFT10 for Container Services では以下のアクションを実施して、ゾーンシフトによるサービスの退避が行えることを確認しています。

- NAT Gatewayへの接続不可。ゾーンシフトでの退避（AZ単位）

## 動作検証時の計測データ

「動作検証済みのシナリオ」の測定データを参考値として記載します。すべての環境で同じ結果が出ることを保証するものではありません。

以下の内容を参考にして、お客様の環境に合わせて設定してください。

- ターゲットの指定をリソースタグにて実施しています。テンプレート内で指定されているタグを対象のリソースに設定するか、テンプレートをARN形式での指定に変更してください。

- ターゲット指定の条件にAZが含まれています。FISアクションの対象が存在するAZを指定してください。

- FIS実行用のロールを作成しテンプレート内のロールを変更してください。

### 外部ALBへの接続不可（AZ単位）

以下のFISの実験テンプレートは例のため、そのまま使用することができません。変更が必要な箇所は赤色で記載しています。

    {
        "description": "AZの停電時にALBに接続できない状況を近似します。",
        "targets": {
            "Subnet": {
                "resourceType": "aws:ec2:subnet",
                 "resourceTags": {
                    "AzImpairmentPower": "DisruptSubnetALB"
                },
                "filters": [
                    {
                        "path": "AvailabilityZone",
                        "values": [
                            "ap-northeast-1a"
                        ]
                    }
                ],
                "selectionMode": "ALL",
                "parameters": {}
            }
        },
        "actions": {
            "Pause-network-connectivity": {
                "actionId": "aws:network:disrupt-connectivity",
                "parameters": {
                    "duration": "PT10M",
                    "scope": "all"
                },
                "targets": {
                    "Subnets": "Subnet"
                }
            }
        },
        "stopConditions": [
            {
                "source": "none"
            }
        ],
        "roleArn": "arn:aws:iam::123456789012:role/FISActions",
        "tags": {
            "Name": "HULFT: 外部ALBへの接続不可"
        },
        "experimentOptions": {
            "accountTargeting": "single-account",
            "emptyTargetResolutionMode": "fail"
        }
    }

対象のリソース

  「PublicSubnetForExtALB1」および「PublicSubnetForExtALB2」

実施条件

  外部のHULFT10 for Container Services から検証対象のHULFTに10秒間隔で接続時プロトコルWSSでの配信を実施

結果

FISアクションの実行時間 | : | 10分
失敗した転送の数 | : | 5件
コンソールログにエラーが出力された時間 | : | 3分

### NLBへの接続不可（AZ単位）

以下のFISの実験テンプレートは例のため、そのまま使用することができません。変更が必要な箇所は赤色で記載しています。

    {
        "description": "AZの停電時にNLBに接続できない状況を近似します。",
        "targets": {
            "Subnet": {
                "resourceType": "aws:ec2:subnet",
                "resourceTags": {
                    "AzImpairmentPower": "DisruptSubnetNLB"
                },
                "filters": [
                    {
                        "path": "AvailabilityZone",
                        "values": [
                            "ap-northeast-1a"
                        ]
                    }
                ],
                "selectionMode": "ALL",
                "parameters": {}
            }
        },
        "actions": {
            "Pause-network-connectivity": {
                "actionId": "aws:network:disrupt-connectivity",
                "parameters": {
                    "duration": "PT10M",
                    "scope": "all"
                },
                "targets": {
                    "Subnets": "Subnet"
                }
            }
        },
        "stopConditions": [
            {
                "source": "none"
            }
        ],
        "roleArn": "arn:aws:iam::123456789012:role/FISActions",
        "tags": {
            "Name": "HULFT: NLBへの接続不可"
        },
        "experimentOptions": {
            "accountTargeting": "single-account",
            "emptyTargetResolutionMode": "fail"
        }
    }

対象のリソース

  「PrivateSubnetForNLB」および「PrivateSubnetForNLB2」

実施条件

  外部のHULFT10 for Container Services から検証対象のHULFTに10秒間隔で接続時プロトコルHULFTでの配信を実施

結果

FISアクションの実行時間 | : | 10分
失敗した転送の数 | : | 0件
コンソールログにエラーが出力された時間 | : | 0分

### DBクラスターのフェイルオーバー

以下のFISの実験テンプレートは例のため、そのまま使用することができません。変更が必要な箇所は赤色で記載しています。

    {
        "description": "AZの停電時にDBクラスターのフェイルオーバーが実行される状況を近似します。",
        "targets": {
            "DB-cluster": {
                "resourceType": "aws:rds:cluster",
                "resourceTags": {
                    "AzImpairmentPower": "Failover"
                },
                "selectionMode": "ALL",
                "parameters": {
                    "writerAvailabilityZoneIdentifiers": "all"
                }
            }
        },
        "actions": {
            "Failover-db-cluster": {
                "actionId": "aws:rds:failover-db-cluster",
                "parameters": {},
                "targets": {
                    "Clusters": "DB-cluster"
                }
            }
        },
        "stopConditions": [
            {
                "source": "none"
            }
        ],
        "roleArn": "arn:aws:iam::123456789012:role/FISActions",
        "tags": {
            "Name": "HULFT: DBクラスターのフェイルオーバー"
        },
        "experimentOptions": {
            "accountTargeting": "single-account",
            "emptyTargetResolutionMode": "fail"
        }
    }

対象のリソース

  「DB1」－「RDSDBCluster」

実施条件

  外部のHULFT10 for Container Services から検証対象のHULFTに10秒間隔で接続時プロトコルWSSでの配信を実施

結果

FISアクションの実行時間 | : | 1分
失敗した転送の数 | : | 0件
コンソールログにエラーが出力された時間 | : | 1分

### CloudWatchへの接続不可（AZ単位）

以下のFISの実験テンプレートは例のため、そのまま使用することができません。変更が必要な箇所は赤色で記載しています。

    {
        "description": "AZの停電時にCloudWatchに接続できない状況を近似します。",
        "targets": {
            "Subnet": {
                "resourceType": "aws:ec2:subnet",
                "resourceTags": {
                    "AzImpairmentPower": "DisruptSubnetCloudWatch"
                },
                "filters": [
                    {
                        "path": "AvailabilityZone",
                        "values": [
                            "ap-northeast-1a"
                        ]
                    }
                ],
                "selectionMode": "ALL"
            }
        },
        "actions": {
            "Pause-network-connectivity": {
                "actionId": "aws:network:disrupt-connectivity",
                "parameters": {
                    "duration": "PT10M",
                    "scope": "all"
                },
                "targets": {
                    "Subnets": "Subnet"
                }
            }
        },
        "stopConditions": [
            {
                "source": "none"
            }
        ],
        "roleArn": "arn:aws:iam::123456789012:role/FISActions",
        "tags": {
            "Name": "HULFT: Cloud Watchへの接続不可"
        },
        "experimentOptions": {
            "accountTargeting": "single-account",
            "emptyTargetResolutionMode": "fail"
        }
    }

対象のリソース

  「PrivateSubnetForVPCEndpoint」および「PrivateSubnetForVPCEndpoint2」

実施条件

  外部のHULFT10 for Container Services から検証対象のHULFTに10秒間隔で接続時プロトコルWSSでの配信を実施

結果

FISアクションの実行時間 | : | 10分
失敗した転送の数 | : | 0件
コンソールログにエラーが出力された時間 | : | 0分（ログの欠落無し）

### NAT Gatewayへの接続不可。ゾーンシフトでの退避（AZ単位）

以下のFISの実験テンプレートは例のため、そのまま使用することができません。変更が必要な箇所は赤色で記載しています。

    {
        "description": "AZの停電時にNAT Gatewayに接続できない状況を近似します。",
        "targets": {
            "LoadBalancer": {
                "resourceType": "aws:arc:zonal-shift-managed-resource",
                "resourceTags": {
                    "AzImpairmentPower": "ZonalShiftLoadBalancer"
                },
                "selectionMode": "ALL",
                "parameters": {
                    "managedResourceTypes": "ALB,NLB",
                    "zonalAutoshiftStatus": "ANY"
                }
            },
            "Subnet": {
                "resourceType": "aws:ec2:subnet",
                "resourceTags": {
                    "AzImpairmentPower": "DisruptSubnetNAT"
                },
                "filters": [
                    {
                        "path": "AvailabilityZone",
                        "values": [
                            "ap-northeast-1c"
                        ]
                    }
                ],
                "selectionMode": "ALL"
            }
        },
        "actions": {
            "Pause-network-connectivity": {
                "actionId": "aws:network:disrupt-connectivity",
                "parameters": {
                    "duration": "PT10M",
                    "scope": "all"
                },
                "targets": {
                    "Subnets": "Subnet"
                }
            },
            "Start-zonal-shift": {
                "actionId": "aws:arc:start-zonal-autoshift",
                "parameters": {
                    "availabilityZoneIdentifier": "ap-northeast-1c",
                    "duration": "PT8M"
                },
                "targets": {
                    "ManagedResources": "LoadBalancer"
                },
                "startAfter": [
                    "Wait"
                ]
            },
            "Wait": {
                "actionId": "aws:fis:wait",
                "parameters": {
                    "duration": "PT2M"
                }
            }
        },
        "stopConditions": [
            {
                "source": "none"
            }
        ],
        "roleArn": "arn:aws:iam::123456789012:role/FISActions",
        "tags": {
            "Name": "HULFT: NAT Gatewayへの接続不可"
        },
        "experimentOptions": {
            "accountTargeting": "single-account",
            "emptyTargetResolutionMode": "fail"
        }
    }

対象のリソース

  LoadBalancer:「ECSSummary1」－「FargateELB」－「PublicALB」、「PrivateALB」および「NLB」

  Subnet:「PublicSubnetForNATGW」および「PublicSubnetForNATGW2」

実施条件

  外部のHULFT10 for Container Services から検証対象のHULFTに10秒間隔で接続時プロトコルWSSでの配信を実施。後続ジョブで外部リソースにアクセス。

結果

FISアクションの実行時間 | : | 10分
失敗した転送の数 | : | 3件
コンソールログにエラーが出力された時間 | : | 2分