AZ Availability: Power Interruption - AWS Fault Injection Service

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

AZ Availability: Power Interruption

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

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

작업

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

Stop-Instances

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

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

Stop-ASG-Instances

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

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

인스턴스 시작 일시 중지

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

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

ASG 스케일링 일시 중지

AZ 전원 중단 시 Auto Scaling 컨트롤 플레인이 AZ에서 손실된 용량을 복구하기 위해 호출하는 EC2 API는 실패합니다. 특히 ec2:StartInstances ec2:CreateFleet ec2:RunInstances 등의 API가 영향을 받습니다. AZ Availability: Power Interruption에는 영향을 받는 AZ에서 새 인스턴스를 프로비저닝할 수 없도록 하는 aws:ec2:asg-insufficient-instance-capacity-error가 포함됩니다. 또한 영향을 받는 AZ에서 Amazon EKS 및 Amazon ECS를 확장할 수 없습니다.

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

네트워크 연결 일시 중지

AZ 전원이 중단되는 동안에는 AZ의 네트워킹을 사용할 수 없습니다. 이 경우 일부 AWS 서비스는 영향을 받는 AZ의 프라이빗 엔드포인트를 사용할 수 없음을 반영하여 DNS를 업데이트하는 데 최대 몇 분 정도 걸릴 수 있습니다. 이 시간 동안 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에 있는 경우 장애 조치할 aws:rds:failover-db-cluster가 포함됩니다.

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

ElastiCache Redis 일시 중지

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

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

EBS I/O 일시 중지

AZ 전원 중단 후 전원이 복구되면 극히 일부 인스턴스에서 EBS 볼륨이 응답하지 않는 현상이 발생할 수 있습니다. AZ Availability: Power Interruption에는 aws:ebs:pause-io가 포함되어 EBS 볼륨 1개를 응답하지 않는 상태로 남겨둡니다.

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

제한 사항

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

  • 대상 AZ에서는 EC2에서 실행되는 Amazon EKS 포드가 EC2 워커 노드와 함께 종료되고 새 EC2 노드의 시작이 차단됩니다. 하지만 AWS Fargate에서 실행되는 Amazon EKS 포드는 지원되지 않습니다.

  • 대상 AZ에서는 EC2에서 실행되는 Amazon ECS 태스크가 EC2 워커 노드와 함께 종료되고 새 EC2 노드의 시작이 차단됩니다. 하지만 AWS Fargate에서 실행되는 Amazon ECS 태스크는 지원되지 않습니다.

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

요구 사항

  • AWS FIS 실험 역할에 필요한 권한을 추가합니다.

  • 리소스 태그는 실험의 대상이 되는 리소스에 적용해야 합니다. 자체 태그 지정 규칙 또는 시나리오에 정의된 기본 태그를 사용할 수 있습니다.

권한

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

{ "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": [ "*" ] } ] }

시나리오 콘텐츠

다음 콘텐츠는 시나리오를 정의합니다. 이 JSON을 저장하여 AWS Command Line Interface(AWS CLI)에서 create-experiment-template 명령을 사용하여 실험 템플릿을 만드는 데 사용할 수 있습니다. 최신 버전의 시나리오를 보려면 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." }