AWS FIS 的目標 - AWS 故障注入服務

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

AWS FIS 的目標

目標是在實驗期間由 Fault Injection Service (AWS FIS) AWS 執行動作的一或多個 AWS 資源。目標可以位於與實驗相同的 AWS 帳戶中,也可以位於使用多帳戶實驗的不同帳戶中。若要進一步了解如何鎖定不同帳戶中的資源,請參閱使用 的多帳戶實驗 AWS FIS

您可以在建立實驗範本時定義目標。您可以在實驗範本中針對多個動作使用相同的目標。

AWS FIS 會在實驗開始時識別所有目標,再啟動動作集中的任何動作。 AWS FIS 會使用其為整個實驗選取的目標資源。如果找不到目標,實驗會失敗。

目標語法

以下是目標的語法。

{ "targets": { "target_name": { "resourceType": "resource-type", "resourceArns": [ "resource-arn" ], "resourceTags": { "tag-key": "tag-value" }, "parameters": { "parameter-name": "parameter-value" }, "filters": [ { "path": "path-string", "values": ["value-string"] } ], "selectionMode": "value" } } }

當您定義目標時,請提供下列項目:

target_name

目標的名稱。

resourceType

資源類型

resourceArns

特定資源的 Amazon Resource Name (ARN)。

resourceTags

套用至特定資源的標籤。

parameters

使用特定屬性識別目標的參數

filters

資源篩選條件會使用特定屬性來範圍識別的目標資源。

selectionMode

已識別資源的選擇模式

如需範例,請參閱 範例目標

資源類型

每個 AWS FIS 動作都會在特定 AWS 資源類型上執行。當您定義目標時,必須指定一個資源類型。當您為動作指定目標時,目標必須是 動作支援的資源類型。

AWS FIS 支援下列資源類型:

  • aws:dynamodb:global-table – Amazon DynamoDB 全域資料表

  • aws:ec2:autoscaling-group – Amazon EC2 Auto Scaling 群組

  • aws:ec2:ebs-volume – Amazon EBS 磁碟區

  • aws:ec2:instance – Amazon EC2 執行個體

  • aws:ec2:spot-instance – Amazon EC2 Spot 執行個體

  • aws:ec2:subnet – Amazon VPC 子網路

  • aws:ec2:transit-gateway – 傳輸閘道

  • aws:ecs:cluster – Amazon ECS 叢集

  • aws:ecs:task – Amazon ECS 任務

  • aws:eks:cluster – Amazon EKS 叢集

  • aws:eks:nodegroup – Amazon EKS 節點群組

  • aws:eks:pod – Kubernetes Pod

  • aws:elasticache:redis-replicationgroup – ElastiCache (Redis OSS) 複寫群組

  • aws:iam:role – IAM 角色

  • aws:lambda:function – AWS Lambda 函數

  • aws:rds:cluster – Amazon Aurora 資料庫叢集

  • aws:rds:db – Amazon RDS 資料庫執行個體

  • aws:s3:bucket – Amazon S3 儲存貯體

識別目標資源

當您在 AWS FIS 主控台中定義目標時,您可以選擇要鎖定的特定 AWS 資源 (特定資源類型)。或者,您可以讓 AWS FIS 根據您提供的條件來識別資源群組。

若要識別您的目標資源,您可以指定下列項目:

  • 資源 IDs – 特定資源的資源 IDs AWS 。所有資源 IDs都必須代表相同類型的資源。

  • 資源標籤 – 套用至特定 AWS 資源的標籤。

  • 資源篩選條件 – 代表具有特定屬性之資源的路徑和值。如需詳細資訊,請參閱資源篩選條件

  • 資源參數 – 代表符合特定條件之資源的參數。如需詳細資訊,請參閱資源參數

考量事項
  • 您無法同時指定相同目標的資源 ID 和資源標籤。

  • 您無法同時指定相同目標的資源 ID 和資源篩選條件。

  • 如果您指定具有空白標籤值的資源標籤,則它不等同於萬用字元。它會比對具有具有指定標籤索引鍵之標籤和空白標籤值的資源。

  • 如果您指定多個標籤,則所有指定的標籤都必須存在於目標資源上,才能選取該標籤 (AND)。

資源篩選條件

資源篩選條件是根據特定屬性識別目標資源的查詢。 AWS FIS 會根據您指定的資源類型,將查詢套用至包含 AWS 資源正式描述的 API 動作輸出。具有符合查詢之屬性的資源會包含在目標定義中。

每個篩選條件都以屬性路徑和可能的值表示。路徑是以句點分隔的一系列元素,描述在資源的描述動作輸出中到達 屬性的路徑。每個期間代表 元素的擴展。每個元素必須以 Pascal 案例表示,即使資源的描述動作輸出是以駱駝案例表示。例如,您應該使用 AvailabilityZone,而非 availablityZone 屬性元素。

"filters": [ { "path": "Component.Component.Component", "values": [ "string" ] } ],

下列邏輯適用於所有資源篩選條件:

  • 如果提供多個篩選條件,包括具有相同路徑的篩選條件,則所有篩選條件都必須符合才能選取資源: AND

  • 如果為單一篩選條件提供多個值,則任何一個值都必須符合才能選取資源: OR

  • 如果在描述 API 呼叫的路徑位置找到多個值,則任何一個值都需要符合才能選取資源: OR

  • 若要比對標籤鍵/值對,您應該改為依標籤選取目標資源 (請參閱上述)。

下表包含 API 動作和 AWS CLI 命令,您可以用來取得每個資源類型的正式描述。 AWS FIS 會代表您執行這些動作,以套用您指定的篩選條件。根據預設,對應的文件會描述結果中包含的資源。例如,DescribeInstances最近終止執行個體的狀態文件可能會出現在結果中。

資源類型 API 動作 AWS CLI 命令
aws:ec2:autoscaling-group DescribeAutoScalingGroups describe-auto-scaling-groups
aws:ec2:ebs-volume DescribeVolumes describe-volumes
aws:ec2:instance DescribeInstances describe-instances
aws:ec2:subnet DescribeSubnets describe-subnets
aws:ec2:transit-gateway DescribeTransitGateways describe-transit-gateways
aws:ecs:cluster DescribeClusters describe-clusters
aws:ecs:task DescribeTasks describe-tasks
aws:eks:cluster DescribeClusters describe-clusters
aws:eks:nodegroup DescribeNodegroup describe-nodegroup
aws:elasticache:redis-replicationgroup DescribeReplicationGroups describe-replication-groups
aws:iam:role ListRoles list-roles
aws:lambda:function ListFunctions list-functions
aws:rds:cluster DescribeDBClusters describe-db-clusters
aws:rds:db DescribeDBInstances describe-db-instances
aws:s3:bucket ListBuckets list-buckets
aws:dynamodb:global-table DescribeTable describe-table

如需範例,請參閱 範例篩選條件

資源參數

資源參數會根據特定條件識別目標資源。

下列資源類型支援參數。

aws:ec2:ebs-volume
  • availabilityZoneIdentifier – 包含目標磁碟區的可用區域的程式碼 (例如 us-east-1a)。

aws:ec2:subnet
  • availabilityZoneIdentifier – 包含目標子網路之可用區域的程式碼 (例如 us-east-1a) 或 AZ ID (例如 use1-az1)。

  • vpc – 包含目標子網路的 VPC。每個帳戶不支援多個 VPC。

aws:ecs:task
  • cluster – 包含目標任務的叢集。

  • service – 包含目標任務的服務。

aws:eks:pod
  • availabilityZoneIdentifier - 選用。包含目標 Pod 的可用區域。例如:us-east-1d。我們透過比較 Pod 的 hostIP 和叢集子網路的 CIDR 來判斷 Pod 的可用區域。

  • clusterIdentifier - 必要。目標 EKS 叢集的名稱或 ARN。

  • namespace - 必要。目標 Pod 的 Kubernetes 命名空間。

  • selectorType - 必要。選擇器類型。可能的值為 labelSelectordeploymentNamepodName

  • selectorValue - 必要。選擇器值。此值取決於 的值selectorType

  • targetContainerName - 選用。Pod 規格中定義的目標容器名稱。預設值是每個目標 Pod 規格中定義的第一個容器。

aws:lambda:function
  • functionQualifier - 選用。要鎖定的函數版本或別名。如果未指定任何限定詞,則會考慮所有調用以鎖定目標。如果指定具有多個版本的別名,只要使用包含別名的 ARN 叫用別名,別名中包含的所有版本都會被視為目標。如果$LATEST使用特殊別名,則會考慮對基本函數 ARN 的呼叫,以及在 ARN $LATEST中包含 的呼叫進行故障注入。如需 Lambda 版本的詳細資訊,請參閱 AWS Lambda 使用者指南中的管理 Lambda 函數版本

aws:rds:cluster
  • writerAvailabilityZoneIdentifiers - 選用。資料庫叢集寫入器的可用區域。可能的值為:可用區域識別符的逗號分隔清單,all

aws:rds:db
  • availabilityZoneIdentifiers - 選用。要受影響的資料庫執行個體可用區域。可能的值為:可用區域識別符的逗號分隔清單,all

aws:elasticache:redis-replicationgroup
  • availabilityZoneIdentifier - 必要。包含目標節點之可用區域的程式碼 (例如 us-east-1a) 或 AZ ID (例如 use1-az1)。

選擇模式

您可以透過指定選取模式來限制識別的資源範圍。 AWS FIS 支援下列選取模式:

  • ALL – 在所有目標上執行動作。

  • COUNT(n) – 在指定數量的目標上執行動作,該目標是從已識別的目標隨機選擇。例如,COUNT(1) 會選取其中一個已識別的目標。

  • PERCENT(n) – 對指定百分比的目標執行動作,該目標是從已識別的目標隨機選擇。例如,PERCENT(25) 會選取 25% 的已識別目標。

如果您有奇數的資源並指定 50%, AWS FIS 會捨棄。例如,如果您將五個 Amazon EC2 執行個體新增為目標,範圍為 50%, AWS FIS 會捨棄為兩個執行個體。您無法指定少於一個資源的百分比。例如,如果您將四個 Amazon EC2 執行個體和範圍新增至 5%, AWS FIS 就無法選取執行個體。

如果您使用相同的目標資源類型定義多個目標, AWS FIS 可以多次選取相同的資源。

無論您使用哪種選擇模式,如果您指定的範圍未識別任何資源,則實驗會失敗。

範例目標

以下是範例目標。

範例:指定 VPC 中具有指定標籤的執行個體

此範例的可能目標為指定 VPC 中的 Amazon EC2 執行個體,其標籤為 env=prod。選擇模式會指定 AWS FIS 隨機選擇其中一個目標。

{ "targets": { "randomInstance": { "resourceType": "aws:ec2:instance", "resourceTags": { "env": "prod" }, "filters": [ { "path": "VpcId", "values": [ "vpc-aabbcc11223344556" ] } ], "selectionMode": "COUNT(1)" } } }
範例:具有指定參數的任務

此範例的可能目標為具有指定叢集與服務的 Amazon ECS 任務。選擇模式會指定 AWS FIS 隨機選擇其中一個目標。

{ "targets": { "randomTask": { "resourceType": "aws:ecs:task", "parameters": { "cluster": "myCluster", "service": "myService" }, "selectionMode": "COUNT(1)" } } }

範例篩選條件

以下是範例篩選條件。

範例:EC2 執行個體

當您為支援 aws:ec2:instance 資源類型的動作指定篩選條件時, AWS FIS 會使用 Amazon EC2 describe-instances命令並套用篩選條件來識別目標。

describe-instances 命令會傳回 JSON 輸出,其中每個執行個體都是 下的結構Instances。以下是部分輸出,其中包含以斜體標示的欄位。我們會提供範例,使用這些欄位從 JSON 輸出的結構指定屬性路徑。

{ "Reservations": [ { "Groups": [], "Instances": [ { "ImageId": "ami-00111111111111111", "InstanceId": "i-00aaaaaaaaaaaaaaa", "InstanceType": "t2.micro", "KeyName": "virginia-kp", "LaunchTime": "2020-09-30T11:38:17.000Z", "Monitoring": { "State": "disabled" }, "Placement": { "AvailabilityZone": "us-east-1a", "GroupName": "", "Tenancy": "default" }, "PrivateDnsName": "ip-10-0-1-240.ec2.internal", "PrivateIpAddress": "10.0.1.240", "ProductCodes": [], "PublicDnsName": "ec2-203-0-113-17.compute-1.amazonaws.com", "PublicIpAddress": "203.0.113.17", "State": { "Code": 16, "Name": "running" }, "StateTransitionReason": "", "SubnetId": "subnet-aabbcc11223344556", "VpcId": "vpc-00bbbbbbbbbbbbbbbbb", ... "NetworkInterfaces": [ { ... "Groups": [ { "GroupName": "sec-group-1", "GroupId": "sg-a0011223344556677" }, { "GroupName": "sec-group-1", "GroupId": "sg-b9988776655443322" } ], ... }, ... }, ... { ... } ], "OwnerId": "123456789012", "ReservationId": "r-aaaaaabbbbb111111" }, ... ] }

若要使用資源篩選條件選取特定可用區域中的執行個體,請指定 的屬性路徑,AvailabilityZone以及可用區域的程式碼做為 值。例如:

"filters": [ { "path": "Placement.AvailabilityZone", "values": [ "us-east-1a" ] } ],

若要使用資源篩選條件選取特定子網路中的執行個體,請指定 的屬性路徑SubnetId和子網路的 ID 做為值。例如:

"filters": [ { "path": "SubnetId", "values": [ "subnet-aabbcc11223344556" ] } ],

若要選取處於特定執行個體狀態的執行個體,請指定 的屬性路徑Name和下列其中一個狀態名稱做為值: pending | running | shutting-down | terminated | stopping | | stopped。例如:

"filters": [ { "path": "State.Name", "values": [ "running" ] } ],

若要選取連接任何多個安全群組的執行個體,請指定具有 GroupId和多個安全群組 IDs單一篩選條件。例如:

"filters": [ { "path": "NetworkInterfaces.Groups.GroupId", "values": [ "sg-a0011223344556677", "sg-f1100110011001100" ] } ],

若要選取已連接所有數量安全群組的執行個體,請指定多個具有屬性路徑的篩選條件,GroupId以及每個篩選條件的單一安全群組 ID。例如:

"filters": [ { "path": "NetworkInterfaces.Groups.GroupId", "values": [ "sg-a0011223344556677" ] }, { "path": "NetworkInterfaces.Groups.GroupId", "values": [ "sg-b9988776655443322" ] } ],
範例:Amazon RDS 叢集 (資料庫叢集)

當您為支援 aws:rds:cluster 資源類型的動作指定篩選條件時, AWS FIS 會執行 Amazon RDS describe-db-clusters命令並套用篩選條件來識別目標。

describe-db-clusters 命令會傳回 JSON 輸出,類似於每個資料庫叢集的下列項目。以下是部分輸出,其中包含以斜體標示的欄位。我們會提供範例,使用這些欄位從 JSON 輸出的結構指定屬性路徑。

[ { "AllocatedStorage": 1, "AvailabilityZones": [ "us-east-2a", "us-east-2b", "us-east-2c" ], "BackupRetentionPeriod": 7, "DatabaseName": "", "DBClusterIdentifier": "database-1", "DBClusterParameterGroup": "default.aurora-postgresql11", "DBSubnetGroup": "default-vpc-01234567abc123456", "Status": "available", "EarliestRestorableTime": "2020-11-13T15:08:32.211Z", "Endpoint": "database-1.cluster-example.us-east-2.rds.amazonaws.com", "ReaderEndpoint": "database-1.cluster-ro-example.us-east-2.rds.amazonaws.com", "MultiAZ": false, "Engine": "aurora-postgresql", "EngineVersion": "11.7", ... } ]

若要套用資源篩選條件,只傳回使用特定資料庫引擎的資料庫叢集,請將屬性路徑指定為 Engine,並將值指定為 aurora-postgresql,如下列範例所示。

"filters": [ { "path": "Engine", "values": [ "aurora-postgresql" ] } ],

若要套用僅傳回特定可用區域中資料庫叢集的資源篩選條件,請指定屬性路徑和值,如下列範例所示。

"filters": [ { "path": "AvailabilityZones", "values": [ "us-east-2a" ] } ],