AZ Availability: Power Interruption - AWS 장애 주입 서비스

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AZ Availability: Power Interruption

를 사용할 수 있습니다.AZ Availability: Power Interruption 가용 영역 (AZ) 의 전원이 완전히 중단될 것으로 예상되는 증상을 유도하는 시나리오.

이 시나리오는 한 번의 완전한 AZ 전원 중단 시 다중 AZ 애플리케이션이 예상대로 작동하는 것을 입증하는 데 사용할 수 있습니다. 여기에는 영역 컴퓨팅 손실 (AmazonEC2, 및ECS)EKS, AZ에서의 컴퓨팅 재조정 없음, 서브넷 연결 손실, 장애 조치, RDS 장애 조치, ElastiCache 응답하지 않는 볼륨 등이 포함됩니다. EBS 기본적으로 대상이 발견되지 않는 작업은 건너뛰게 됩니다.

작업

다음 작업을 함께 취하면 단일 AZ에서 완전한 정전 시 예상되는 여러 가지 증상이 나타납니다. AZ 가용성: 전원 중단은 단일 AZ 전원 중단 중에 영향을 받을 것으로 예상되는 서비스에만 영향을 줍니다. 기본적으로 시나리오는 30분 동안 전원 중단 증상을 주입한 다음 추가로 30분 동안 복구 중에 발생할 수 있는 증상을 주입합니다.

Stop-Instances

AZ 정전이 발생하면 영향을 받는 AZ의 EC2 인스턴스가 종료됩니다. 전원이 복원되면 인스턴스가 재부팅됩니다.AZ Availability: Power Interruption 중단이 지속되는 동안 영향을 받는 AZ의 모든 인스턴스를 중지할 수 있는 aws:ec2:stop-instance가 포함되어 있습니다. 기간이 지나면 인스턴스가 다시 시작됩니다. Amazon에서 관리하는 EC2 인스턴스를 EKS 중지하면 종속 EKS 포드가 삭제됩니다. Amazon에서 관리하는 EC2 인스턴스를 ECS 중지하면 종속 ECS 작업이 중지됩니다.

이 작업은 영향을 받는 AZ에서 실행 중인 EC2 인스턴스를 대상으로 합니다. 기본적으로 이 작업은 값이 StopInstancesAzImpairmentPower라는 이름의 태그가 있는 인스턴스를 대상으로 합니다. 이 태그를 인스턴스에 추가하거나 실험 템플릿에서 기본 태그를 사용자 지정 태그로 바꿀 수 있습니다. 기본적으로 유효한 인스턴스를 찾을 수 없는 경우 이 작업은 건너뛰게 됩니다.

중지- ASG -인스턴스

AZ 정전이 발생하면 영향을 받는 AZ의 Auto Scaling 그룹에서 관리하는 EC2 인스턴스가 종료됩니다. 전원이 복원되면 인스턴스가 재부팅됩니다.AZ Availability: Power Interruption Auto Scaling으로 관리되는 인스턴스를 포함하여 중단이 지속되는 동안 영향을 받는 AZ의 모든 인스턴스를 중지하는 aws:ec2:stop-instance가 포함되어 있습니다. 기간이 지나면 인스턴스가 다시 시작됩니다.

이 작업은 영향을 받는 AZ에서 실행 중인 인스턴스를 대상으로 합니다EC2. 기본적으로 이 작업은 값이 IceAsgAzImpairmentPower라는 이름의 태그가 있는 인스턴스를 대상으로 합니다. 이 태그를 인스턴스에 추가하거나 실험 템플릿에서 기본 태그를 사용자 지정 태그로 바꿀 수 있습니다. 기본적으로 유효한 인스턴스를 찾을 수 없는 경우 이 작업은 건너뛰게 됩니다.

인스턴스 시작 일시 중지

AZ 전원이 중단되면 AZ에서 용량을 프로비저닝하기 위한 EC2 API 호출이 실패합니다. 특히 APIs 다음이 영향을 받습니다:ec2:StartInstances,ec2:CreateFleet,. ec2:RunInstances AZ Availability: Power Interruption includes 영향을 받는 AZ에서 새 인스턴스가 프로비저닝되지 않도록 하는 aws:ec2: api-insufficient-instance-capacity -error가 포함되어 있습니다.

이 작업은 인스턴스를 프로비저닝하는 데 사용되는 역할을 대상으로 합니다IAM. 이러한 대상은 를 사용하여 지정해야 ARN 합니다. 기본적으로 유효한 IAM 역할을 찾을 수 없는 경우 이 작업은 건너뛰게 됩니다.

스케일링 일시 중지 ASG

AZ 전원이 중단되는 동안 Auto Scaling 컨트롤 플레인이 AZ에서 손실된 용량을 복구하기 위해 수행한 EC2 API 호출은 실패합니다. 특히 APIs 다음이 영향을 받습니다:ec2:StartInstances,ec2:CreateFleet,. ec2:RunInstances AZ Availability: Power Interruption 영향을 받는 AZ에서 새 인스턴스가 프로비저닝되지 않도록 하는 aws:ec2: asg-insufficient-instance-capacity -error가 포함되어 있습니다. 또한 이렇게 하면 EKS Amazon과 Amazon이 영향을 받는 ECS AZ에서 규모를 조정할 수 없습니다.

이 작업은 Auto Scaling 그룹을 대상으로 합니다. 기본적으로 이 작업은 값이 IceAsgAzImpairmentPower라는 이름의 태그가 있는 Auto Scaling 그룹을 대상으로 합니다. 이 태그를 Auto Scaling 그룹에 추가하거나 실험 템플릿에서 기본 태그를 사용자 지정 태그로 바꿀 수 있습니다. 기본적으로 유효한 Auto Scaling 그룹을 찾을 수 없는 경우 이 작업은 건너뛰게 됩니다.

네트워크 연결 일시 중지

AZ 전원이 중단되는 동안에는 AZ의 네트워킹을 사용할 수 없습니다. 이 경우 영향을 받는 AZ의 프라이빗 엔드포인트를 사용할 수 없음을 DNS 반영하여 일부 AWS 서비스를 업데이트하는 데 최대 몇 분이 걸릴 수 있습니다. 이 기간 동안에는 DNS 조회 시 액세스할 수 없는 IP 주소가 반환될 수 있습니다.AZ Availability: Power Interruption 영향을 받는 AZ에 있는 모든 서브넷의 모든 네트워크 연결을 2분 동안 차단하는 aws:network:disrupt-connectivity 기능이 포함되어 있습니다. 이렇게 하면 대부분의 애플리케이션에서 제한 시간이 초과되고 새로 고쳐집니다. DNS 2분 후에 작업을 종료하면 AZ를 계속 사용할 수 없는 DNS 동안에도 지역 서비스를 후속 복구할 수 있습니다.

이 작업은 서브넷을 대상으로 합니다. 기본적으로 이 작업은 값이 DisruptSubnetAzImpairmentPower라는 이름의 태그가 있는 클러스터를 대상으로 합니다. 이 태그를 서브넷에 추가하거나 실험 템플릿에서 기본 태그를 사용자 지정 태그로 바꿀 수 있습니다. 기본적으로 유효한 서브넷을 찾을 수 없는 경우 이 작업은 건너뛰게 됩니다.

페일오버 RDS

AZ 전원이 중단되면 영향을 받는 AZ의 RDS 노드가 종료됩니다. 영향을 받는 AZ의 단일 AZ RDS 노드는 완전히 사용할 수 없게 됩니다. 다중 AZ 클러스터의 경우, 쓰기 노드는 영향을 받지 않는 AZ로 장애 조치되고 영향을 받는 AZ의 읽기 노드는 사용할 수 없게 됩니다. 다중 AZ 클러스터의 경우 AZ Availability: Power Interruption 작성기가 영향을 받는 AZ에 있는 경우 failover-db-cluster 페일오버를 위한 aws:rds:가 포함되어 있습니다.

이 작업은 클러스터를 대상으로 합니다. RDS 기본적으로 이 작업은 값이 DisruptRdsAzImpairmentPower라는 이름의 태그가 있는 클러스터를 대상으로 합니다. 이 태그를 클러스터에 추가하거나 실험 템플릿에서 기본 태그를 사용자 지정 태그로 바꿀 수 있습니다. 기본적으로 유효한 클러스터를 찾을 수 없는 경우 이 작업은 건너뛰게 됩니다.

Redis를 일시 ElastiCache 중지합니다.

AZ 전원이 차단되는 동안에는 AZ의 ElastiCache 노드를 사용할 수 없습니다.AZ Availability: Power Interruption 영향을 받는 AZ의 노드를 interrupt-cluster-az-power ElastiCache 종료하기 위한 aws:elasticache:가 포함되어 있습니다. 중단이 지속되는 동안, 영향을 받는 AZ에서 새 인스턴스가 프로비저닝되지 않으므로 클러스터는 감소된 용량으로 유지됩니다.

이 작업은 클러스터를 대상으로 합니다. ElastiCache 기본적으로 이 작업은 값이 ElasticacheImpactAzImpairmentPower라는 이름의 태그가 있는 클러스터를 대상으로 합니다. 이 태그를 클러스터에 추가하거나 실험 템플릿에서 기본 태그를 사용자 지정 태그로 바꿀 수 있습니다. 기본적으로 유효한 클러스터를 찾을 수 없는 경우 이 작업은 건너뛰게 됩니다. 영향을 받는 AZ에 쓰기 노드가 있는 클러스터만 유효한 대상으로 간주됩니다.

I/O 일시 중지 EBS

AZ 전원이 중단된 후 전원이 복원되면 매우 적은 비율의 인스턴스에서 볼륨이 응답하지 EBS 않을 수 있습니다.AZ Availability: Power Interruption 1개의 볼륨을 응답하지 않는 상태로 유지하기 위한 aws:ebs:pause-io가 포함되어 있습니다. EBS

기본적으로 인스턴스가 종료된 후에도 지속되도록 설정된 볼륨만 대상이 됩니다. 이 작업은 값이 APIPauseVolumeAzImpairmentPower라는 태그가 있는 볼륨을 대상으로 합니다. 이 태그를 볼륨에 추가하거나 실험 템플릿에서 기본 태그를 사용자 지정 태그로 바꿀 수 있습니다. 기본적으로 유효한 볼륨을 찾을 수 없는 경우 이 작업은 건너뛰게 됩니다.

제한 사항

  • 이 시나리오에는 중지 조건이 포함되어 있지 않습니다. 애플리케이션에 맞는 올바른 중지 조건을 실험 템플릿에 추가해야 합니다.

  • 대상 AZ에서 실행 중인 Amazon EKS EC2 Pod는 EC2 작업자 노드와 함께 종료되고 새 EC2 노드의 시작은 차단됩니다. 하지만 AWS Fargate에서 실행되는 아마존 EKS 포드는 지원되지 않습니다.

  • 대상 AZ에서 실행 중인 Amazon ECS 작업은 EC2 작업자 노드와 함께 EC2 종료되며 새 EC2 노드 시작은 차단됩니다. 하지만 AWS Fargate에서 실행되는 Amazon ECS 작업은 지원되지 않습니다.

  • 읽기 가능한 예비 DB 인스턴스 2개가 있는 Amazon RDS Multi-AZ는 지원되지 않습니다. 이 경우 인스턴스가 종료되고 장애 조치가 RDS 수행되며 해당 AZ에 용량이 즉시 다시 프로비저닝됩니다. 영향을 받는 AZ의 읽기 가능한 대기는 계속 사용할 수 있습니다.

요구 사항

권한

다음 정책은 실험을 사용하여 실험을 실행하는 데 필요한 권한을 AWS FIS 부여합니다.AZ Availability: Power Interruption 시나리오. 이 정책은 실험 역할에 연결되어야 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowFISExperimentLoggingActionsCloudwatch", "Effect": "Allow", "Action": [ "logs:CreateLogDelivery", "logs:PutResourcePolicy", "logs:DescribeResourcePolicies", "logs:DescribeLogGroups" ], "Resource": "*" }, { "Effect": "Allow", "Action": "ec2:CreateTags", "Resource": "arn:aws:ec2:*:*:network-acl/*", "Condition": { "StringEquals": { "ec2:CreateAction": "CreateNetworkAcl", "aws:RequestTag/managedByFIS": "true" } } }, { "Effect": "Allow", "Action": "ec2:CreateNetworkAcl", "Resource": "arn:aws:ec2:*:*:network-acl/*", "Condition": { "StringEquals": { "aws:RequestTag/managedByFIS": "true" } } }, { "Effect": "Allow", "Action": [ "ec2:CreateNetworkAclEntry", "ec2:DeleteNetworkAcl" ], "Resource": [ "arn:aws:ec2:*:*:network-acl/*", "arn:aws:ec2:*:*:vpc/*" ], "Condition": { "StringEquals": { "ec2:ResourceTag/managedByFIS": "true" } } }, { "Effect": "Allow", "Action": "ec2:CreateNetworkAcl", "Resource": "arn:aws:ec2:*:*:vpc/*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeVpcs", "ec2:DescribeManagedPrefixLists", "ec2:DescribeSubnets", "ec2:DescribeNetworkAcls" ], "Resource": "*" }, { "Effect": "Allow", "Action": "ec2:ReplaceNetworkAclAssociation", "Resource": [ "arn:aws:ec2:*:*:subnet/*", "arn:aws:ec2:*:*:network-acl/*" ] }, { "Effect": "Allow", "Action": [ "rds:FailoverDBCluster" ], "Resource": [ "arn:aws:rds:*:*:cluster:*" ] }, { "Effect": "Allow", "Action": [ "rds:RebootDBInstance" ], "Resource": [ "arn:aws:rds:*:*:db:*" ] }, { "Effect": "Allow", "Action": [ "elasticache:DescribeReplicationGroups", "elasticache:InterruptClusterAzPower" ], "Resource": [ "arn:aws:elasticache:*:*:replicationgroup:*" ] }, { "Sid": "TargetResolutionByTags", "Effect": "Allow", "Action": [ "tag:GetResources" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:StartInstances", "ec2:StopInstances" ], "Resource": "arn:aws:ec2:*:*:instance/*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstances" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "kms:CreateGrant" ], "Resource": [ "arn:aws:kms:*:*:key/*" ], "Condition": { "StringLike": { "kms:ViaService": "ec2.*.amazonaws.com" }, "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "ec2:DescribeVolumes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:PauseVolumeIO" ], "Resource": "arn:aws:ec2:*:*:volume/*" }, { "Sid": "AllowInjectAPI", "Effect": "Allow", "Action": [ "ec2:InjectApiError" ], "Resource": [ "*" ], "Condition": { "ForAnyValue:StringEquals": { "ec2:FisActionId": [ "aws:ec2:api-insufficient-instance-capacity-error", "aws:ec2:asg-insufficient-instance-capacity-error" ] } } }, { "Sid": "DescribeAsg", "Effect": "Allow", "Action": [ "autoscaling:DescribeAutoScalingGroups" ], "Resource": [ "*" ] } ] }

시나리오 콘텐츠

다음 콘텐츠는 시나리오를 정의합니다. 이를 저장하고 명령줄 인터페이스 (AWSCLI) 의 create-experiment-template명령을 사용하여 실험 템플릿을 만드는 데 사용할 JSON 수 있습니다. AWS 최신 버전의 시나리오를 보려면 FIS 콘솔의 시나리오 라이브러리를 방문하세요.

{ "targets": { "IAM-role": { "resourceType": "aws:iam:role", "resourceArns": [], "selectionMode": "ALL" }, "EBS-Volumes": { "resourceType": "aws:ec2:ebs-volume", "resourceTags": { "AzImpairmentPower": "ApiPauseVolume" }, "selectionMode": "COUNT(1)", "parameters": { "availabilityZoneIdentifier": "us-east-1a" }, "filters": [ { "path": "Attachments.DeleteOnTermination", "values": [ "false" ] } ] }, "EC2-Instances": { "resourceType": "aws:ec2:instance", "resourceTags": { "AzImpairmentPower": "StopInstances" }, "filters": [ { "path": "State.Name", "values": [ "running" ] }, { "path": "Placement.AvailabilityZone", "values": [ "us-east-1a" ] } ], "selectionMode": "ALL" }, "ASG": { "resourceType": "aws:ec2:autoscaling-group", "resourceTags": { "AzImpairmentPower": "IceAsg" }, "selectionMode": "ALL" }, "ASG-EC2-Instances": { "resourceType": "aws:ec2:instance", "resourceTags": { "AzImpairmentPower": "IceAsg" }, "filters": [ { "path": "State.Name", "values": [ "running" ] }, { "path": "Placement.AvailabilityZone", "values": [ "us-east-1a" ] } ], "selectionMode": "ALL" }, "Subnet": { "resourceType": "aws:ec2:subnet", "resourceTags": { "AzImpairmentPower": "DisruptSubnet" }, "filters": [ { "path": "AvailabilityZone", "values": [ "us-east-1a" ] } ], "selectionMode": "ALL", "parameters": {} }, "RDS-Cluster": { "resourceType": "aws:rds:cluster", "resourceTags": { "AzImpairmentPower": "DisruptRds" }, "selectionMode": "ALL", "parameters": { "writerAvailabilityZoneIdentifiers": "us-east-1a" } }, "ElastiCache-Cluster": { "resourceType": "aws:elasticache:redis-replicationgroup", "resourceTags": { "AzImpairmentPower": "DisruptElasticache" }, "selectionMode": "ALL", "parameters": { "availabilityZoneIdentifier": "us-east-1a" } } }, "actions": { "Pause-Instance-Launches": { "actionId": "aws:ec2:api-insufficient-instance-capacity-error", "parameters": { "availabilityZoneIdentifiers": "us-east-1a", "duration": "PT30M", "percentage": "100" }, "targets": { "Roles": "IAM-role" } }, "Pause-EBS-IO": { "actionId": "aws:ebs:pause-volume-io", "parameters": { "duration": "PT30M" }, "targets": { "Volumes": "EBS-Volumes" }, "startAfter": [ "Stop-Instances", "Stop-ASG-Instances" ] }, "Stop-Instances": { "actionId": "aws:ec2:stop-instances", "parameters": { "completeIfInstancesTerminated": "true", "startInstancesAfterDuration": "PT30M" }, "targets": { "Instances": "EC2-Instances" } }, "Pause-ASG-Scaling": { "actionId": "aws:ec2:asg-insufficient-instance-capacity-error", "parameters": { "availabilityZoneIdentifiers": "us-east-1a", "duration": "PT30M", "percentage": "100" }, "targets": { "AutoScalingGroups": "ASG" } }, "Stop-ASG-Instances": { "actionId": "aws:ec2:stop-instances", "parameters": { "completeIfInstancesTerminated": "true", "startInstancesAfterDuration": "PT30M" }, "targets": { "Instances": "ASG-EC2-Instances" } }, "Pause-network-connectivity": { "actionId": "aws:network:disrupt-connectivity", "parameters": { "duration": "PT2M", "scope": "all" }, "targets": { "Subnets": "Subnet" } }, "Failover-RDS": { "actionId": "aws:rds:failover-db-cluster", "parameters": {}, "targets": { "Clusters": "RDS-Cluster" } }, "Pause-ElastiCache": { "actionId": "aws:elasticache:interrupt-cluster-az-power", "parameters": { "duration": "PT30M" }, "targets": { "ReplicationGroups": "ElastiCache-Cluster" } } }, "stopConditions": [ { "source": "aws:cloudwatch:alarm", "value": "" } ], "roleArn": "", "tags": { "Name": "AZ Impairment: Power Interruption" }, "logConfiguration": { "logSchemaVersion": 2 }, "experimentOptions": { "accountTargeting": "single-account", "emptyTargetResolutionMode": "skip" }, "description": "Affect multiple resource types in a single AZ, targeting by tags and explicit ARNs, to approximate power interruption in one AZ." }