AZ: Application Slowdown - AWS 故障注入服務

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AZ: Application Slowdown

您可以使用 AZ:Application Slowdown 案例,在單一可用區域 (AZ) 內的資源之間引入額外的延遲。這種延遲會產生應用程式速度變慢的許多症狀,這是一種部分中斷,有時稱為灰色故障。它會為目標資源之間的網路流程增加延遲。網路流程代表運算資源之間的流量,也就是伺服器、容器和服務之間承載請求、回應和其他通訊的資料封包。此案例有助於驗證可觀測性設定、調整警示閾值、探索應用程式對變慢的敏感度,以及練習 AZ 疏散等關鍵操作決策。

根據預設,此案例會將 200 毫秒的延遲新增至所選可用區域內目標資源之間的 100% 網路流程,持續時間為 30 分鐘。您可以使用 AWS FIS 主控台中的編輯共用參數對話方塊,在案例層級調整下列參數,然後套用至基礎動作:

  • 可用區域 - 您可以選取要在案例中影響的可用區域。

  • 毫秒 (ms) 的延遲 - 根據應用程式的敏感度和需求進行調整。例如,您可以為更敏感的應用程式設定較低的延遲,或設定更高的延遲來測試逾時處理。請考慮使用目前應用程式延遲的倍數做為基準。

  • 流程百分比 - 減少以損害一部分的流量。例如,您可以新增 200 毫秒延遲,影響 25% 的網路流程,以進行更細微的測試。

  • 持續時間 - 設定實驗執行的時間長度。您可以縮短以加快測試速度,或執行更長的持續測試。例如,將持續時間設定為 2 小時,以在條件受損的情況下測試您的復原機制。

  • 資源目標 - 您可以使用標籤 (適用於 EC2 執行個體或 EC2 或 Fargate 上的 ECS 任務) 或標籤 (適用於 EC2 上的 EKS Pod),為整體案例定義目標資源。您可以指定自己的標籤和標籤,或使用案例中提供的預設值。如果您不想使用標籤或標籤,您可以透過指定其他參數,將動作編輯為目標資源。

  • 自訂 - 如果您不想將 EC2 或 ECS 資源設為目標,則可以保留具有預設標籤的動作。實驗找不到任何要鎖定的資源,而且會略過動作。不過,如果您不想將 EKS 資源設為目標,您應該從案例中完全移除 EKS 動作和目標,因為它需要提供 EKS 叢集識別符。如需更精細的自訂,您可以直接修改實驗範本中的個別動作。

動作

以下動作透過在網路流程中引入額外的延遲,然後透過應用程式傳播,共同協助在單一 AZ 中建立應用程式減速的許多症狀。這些動作會平行執行,每個動作預設會新增 200 毫秒延遲 30 分鐘。在此期間之後,延遲會回到正常層級。此案例至少需要下列其中一種資源類型才能執行:EC2 執行個體、ECS 任務或 EKS Pod。

ECS 網路延遲

AZ:Application Slowdown 包含 aws:ecs:task-network-latency,以引入 ECS 任務的延遲。動作以所選 AZ 中的任務為目標。根據預設,它會以標籤https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html名為 AZApplicationSlowdown 且值為 的任務為目標LatencyForECS。您可以使用自己的標籤取代預設標籤,或將案例標籤新增至任務。如果找不到有效的任務,則會略過此動作。在 ECS 上執行實驗之前,您應該遵循 ECS 任務動作的設定步驟

EKS 網路延遲

AZ:Application Slowdown 包含 aws:eks:pod-network-latency,以引入 EKS Pod 的延遲。動作以所選 AZ 中的 Pod 為目標。根據預設,它以具有格式 key=value 標籤的叢集內的 Pod 為目標。提供的預設標籤為 AZApplicationSlowdown=LatencyForEKS。您可以將預設標籤取代為您自己的標籤,或將此標籤新增至您的 Pod。如果找不到有效的 Pod,則會略過此動作。在 EKS 上執行實驗之前,您應該遵循 EKS Pod 動作的設定步驟

EC2 網路延遲

AZ:Application Slowdown 使用 aws:ssm:send-mand 動作來執行 AWSFIS-Run-Network-Latency-Sources 文件,以引入 EC2 執行個體的延遲。動作以所選 AZ 中的執行個體為目標。根據預設,它會以標籤https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html名為 AZApplicationSlowdown且值為 的執行個體為目標LatencyForEC2。您可以使用自己的標籤取代預設標籤,或將此標籤新增至執行個體。如果找不到有效的執行個體,則會略過此動作。在使用 SSM 在 EC2 上執行實驗之前,您應該設定 AWS Systems Manager 代理程式

限制

  • 此案例不包含停止條件。應用程式正確的停止條件應新增至實驗範本。

要求

  • 將必要的許可新增至 AWS FIS 實驗角色

  • 您需要將下列 3 種類型中的任何一種資源設為目標:EC2 執行個體、ECS 任務或 EKS Pod。

  • 案例的所有目標都必須位於相同的 VPC 中。

許可

若要執行此案例,您需要具有信任政策的 IAM 角色,允許 FIS 擔任您在實驗中目標資源類型的角色和受管政策:EC2、ECS 和 EKS。當您從 AZ:Application Slowdown 案例建立實驗範本時,FIS 會使用信任政策和下列 AWS 受管政策為您建立 角色:

如果您使用現有的 IAM 角色來執行 AZ:Application Slowdown 案例,您可以連接下列政策來授予 AWS FIS 必要的許可:

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DescribeTasks", "Effect": "Allow", "Action": "ecs:DescribeTasks", "Resource": "*" }, { "Sid": "DescribeContainerInstances", "Effect": "Allow", "Action": "ecs:DescribeContainerInstances", "Resource": "arn:aws:ecs:*:*:container-instance/*/*" }, { "Sid": "DescribeInstances", "Effect": "Allow", "Action": "ec2:DescribeInstances", "Resource": "*" }, { "Sid": "DescribeSubnets", "Effect": "Allow", "Action": "ec2:DescribeSubnets", "Resource": "*" }, { "Sid": "DescribeCluster", "Effect": "Allow", "Action": "eks:DescribeCluster", "Resource": "arn:aws:eks:*:*:cluster/*" }, { "Sid": "TargetResolutionByTags", "Effect": "Allow", "Action": "tag:GetResources", "Resource": "*" }, { "Sid": "SendCommand", "Effect": "Allow", "Action": [ "ssm:SendCommand" ], "Resource": [ "arn:aws:ec2:*:*:instance/*", "arn:aws:ssm:*:*:managed-instance/*", "arn:aws:ssm:*:*:document/*" ] }, { "Sid": "ListCommands", "Effect": "Allow", "Action": [ "ssm:ListCommands" ], "Resource": "*" }, { "Sid": "CancelCommand", "Effect": "Allow", "Action": [ "ssm:CancelCommand" ], "Resource": "*" } ] }

案例內容

下列內容會定義案例。此 JSON 可用來儲存,並使用 AWS Command Line Interface (AWS CLI) 中的 create-experiment-template 命令來建立實驗範本。如需最新版本的案例,請造訪 FIS 主控台中的案例程式庫,並前往內容索引標籤。

{ "tags": { "Name": "AZ: Application Slowdown" }, "description": "Add latency between resources within a single AZ.", "actions": { "LatencyForEKS": { "actionId": "aws:eks:pod-network-latency", "parameters": { "delayMilliseconds": "200", "duration": "PT30M", "flowsPercent": "100", "interface": "DEFAULT", "kubernetesServiceAccount": "fis-service-account", "sources": "us-east-1a" }, "targets": { "Pods": "TargetsForEKS" } }, "LatencyForEC2": { "actionId": "aws:ssm:send-command", "parameters": { "duration": "PT30M", "documentArn": "arn:aws:ssm:us-east-1::document/AWSFIS-Run-Network-Latency-Sources", "documentParameters": "{\"DelayMilliseconds\":\"200\",\"Sources\":\"us-east-1a\",\"Interface\":\"DEFAULT\",\"TrafficType\":\"egress\",\"DurationSeconds\":\"1800\",\"FlowsPercent\":\"100\",\"InstallDependencies\":\"True\"}" }, "targets": { "Instances": "TargetsForEC2" } }, "LatencyForECS": { "actionId": "aws:ecs:task-network-latency", "parameters": { "delayMilliseconds": "200", "duration": "PT30M", "flowsPercent": "100", "installDependencies": "true", "sources": "us-east-1a", "useEcsFaultInjectionEndpoints": "true" }, "targets": { "Tasks": "TargetsForECS" }, "startAfter": [] } }, "targets": { "TargetsForEKS": { "parameters": { "availabilityZoneIdentifier": "us-east-1a", "clusterIdentifier": "", "namespace": "default", "selectorType": "labelSelector", "selectorValue": "AZApplicationSlowdown=LatencyForEKS" }, "resourceType": "aws:eks:pod", "selectionMode": "ALL" }, "TargetsForEC2": { "filters": [ { "path": "Placement.AvailabilityZone", "values": [ "us-east-1a" ] } ], "resourceTags": { "AZApplicationSlowdown": "LatencyForEC2" }, "resourceType": "aws:ec2:instance", "selectionMode": "ALL" }, "TargetsForECS": { "filters": [ { "path": "AvailabilityZone", "values": [ "us-east-1a" ] } ], "resourceTags": { "AZApplicationSlowdown": "LatencyForECS" }, "resourceType": "aws:ecs:task", "selectionMode": "ALL" } }, "experimentOptions": { "accountTargeting": "single-account", "emptyTargetResolutionMode": "skip" }, "stopConditions": [ { "source": "none" } ] }