"AWSSupport-StartEC2RescueWorkflow" 자동화 런북을 사용하여 문제가 발생된 EC2 인스턴스에 대해 오프라인으로 문제 해결을 시도하는 방법

8분 분량
콘텐츠 수준: 중급
0

본 기사는 AWS 지원 자동화 워크플로우(Support Automation Workflow)의 "AWSSupport-StartEC2RescueWorkflow" 런북을 통해 EC2 인스턴스에 대해 오프라인으로 스크립트를 실행하여 발생된 문제 해결을 시도해 보는 방법을 설명합니다.

개요

EC2 인스턴스의 OS 레벨에서 예기치 않게 문제가 발생될 수 있습니다. 예를 들어, OS 및 3rd party 보안 프로그램의 업데이트 후 예기치 않게 문제가 발생되기도 합니다.

이때 경우에 따라서는 발생된 문제로 인해 해당 EC2 인스턴스에 접속이 불가할 수 있고 이로 인해 온라인으로 조치가 어려울 수 있습니다.

 

이러한 상황에서 본 기사에서 소개하는 "AWSSupport-StartEC2RescueWorkflow" 자동화 런북이 도움이 될 수 있습니다.

중요

Marketplace Amazon Machine Images(AMIs)에서 생성된 EC2 인스턴스는 이 자동화에서 지원되지 않습니다.

 

"AWSSupport-StartEC2RescueWorkflow" 자동화 런북은 EC2Rescue를 실행하는 도우미 인스턴스(Helper instance)를 생성하고, 문제가 발생된 EC2 인스턴스의 EBS 루트 볼륨을 도우미 인스턴스에 연결하여 해당 볼륨에 대해 입력 파라미터(OfflineScript)로 제공되는 스크립트를 실행해 줍니다. 이를 통해 문제 증상에 대해 조치할 수 있습니다.

 

이 자동화 런북은 사용자의 스크립트에서 사용할 수 있는 몇 가지 환경 변수를 자동으로 설정하여 제공합니다. 따라서 이러한 환경 변수를 스크립트에서 사용함으로 보다 쉽고 빠르게 조치할 수 있습니다.

제공되는 환경 변수들은 대상 OS별로 차이가 있습니다. 아래 표를 참고해 주세요.

 

Windows :

변수설명예시 값
$env:EC2RESCUE_ACCOUNT_ID{{ global:ACCOUNT_ID }}123456789012
$env:EC2RESCUE_DATE{{ global:DATE }}2018-09-07
$env:EC2RESCUE_DATE_TIME{{ global:DATE_TIME }}2018-09-07_18.09.59
$env:EC2RESCUE_EC2RW_DIREC2Rescue for Windows installation pathC:\Program Files\Amazon\EC2Rescue
$env:EC2RESCUE_EC2RW_DIREC2Rescue for Windows installation pathC:\Program Files\Amazon\EC2Rescue
$env:EC2RESCUE_EXECUTION_ID{{ automation:EXECUTION_ID }}7ef8008e-219b-4aca-8bb5-65e2e898e20b
$env:EC2RESCUE_OFFLINE_CURRENT_CONTROL_SETOffline Windows Current Control Set pathHKLM:\AWSTempSystem\ControlSet001
$env:EC2RESCUE_OFFLINE_DRIVEOffline Windows drive letterD:\
$env:EC2RESCUE_OFFLINE_EBS_DEVICEOffline root volume EBS devicexvdf
$env:EC2RESCUE_OFFLINE_KERNEL_VEROffline Windows Kernel version6.1.7601.24214
$env:EC2RESCUE_OFFLINE_OS_ARCHITECTUREOffline Windows architectureAMD64
$env:EC2RESCUE_OFFLINE_OS_CAPTIONOffline Windows captionWindows Server 2008 R2 Datacenter
$env:EC2RESCUE_OFFLINE_OS_TYPEOffline Windows OS typeServer
$env:EC2RESCUE_OFFLINE_PROGRAM_FILES_DIROffline Windows Program files directory pathD:\Program Files
$env:EC2RESCUE_OFFLINE_PROGRAM_FILES_X86_DIROffline Windows Program files x86 directory pathD:\Program Files (x86)
$env:EC2RESCUE_OFFLINE_REGISTRY_DIROffline Windows registry directory pathD:\Windows\System32\config
$env:EC2RESCUE_OFFLINE_SYSTEM_ROOTOffline Windows system root directory pathD:\Windows
$env:EC2RESCUE_REGION{{ global:REGION }}us-west-1
$env:EC2RESCUE_S3_BUCKET{{ S3BucketName }}amzn-s3-demo-bucket
$env:EC2RESCUE_S3_PREFIX{{ S3Prefix }}myprefix/
$env:EC2RESCUE_SOURCE_INSTANCE{{ InstanceId }}i-abcdefgh123456789
$script:EC2RESCUE_OFFLINE_WINDOWS_INSTALLOffline Windows Installation metadataCustomer Powershell Object

 

Linux :

변수설명예시 값
EC2RESCUE_ACCOUNT_ID{{ global:ACCOUNT_ID }}123456789012
EC2RESCUE_DATE{{ global:DATE }}2018-09-07
EC2RESCUE_DATE_TIME{{ global:DATE_TIME }}2018-09-07_18.09.59
EC2RESCUE_EC2RL_DIREC2Rescue for Linux installation path/usr/local/ec2rl-1.1.3
EC2RESCUE_EXECUTION_ID{{ automation:EXECUTION_ID }}7ef8008e-219b-4aca-8bb5-65e2e898e20b
EC2RESCUE_OFFLINE_DEVICEOffline device name/dev/xvdf1
EC2RESCUE_OFFLINE_EBS_DEVICEOffline root volume EBS device/dev/sdf
EC2RESCUE_OFFLINE_SYSTEM_ROOTOffline root volume mount point/mnt/mount
EC2RESCUE_PYTHONPython versionpython2.7
EC2RESCUE_REGION{{ global:REGION }}us-west-1
EC2RESCUE_S3_BUCKET{{ S3BucketName }}amzn-s3-demo-bucket
EC2RESCUE_S3_PREFIX{{ S3Prefix }}myprefix/
EC2RESCUE_SOURCE_INSTANCE{{ InstanceId }}i-abcdefgh123456789

 

문제가 발생되어 조치가 필요한 EC2 인스턴스의 OS가 Windows이면 Powershell 스크립트를 입력 파라미터에 제공합니다. Windows OS가 아니라면 Bash 스크립트를 제공합니다.

그리고 이때 입력 파라미터로 제공되는 스크립트는 BASE64로 인코딩하여 제공되어야 합니다.

 

스크립트를 BASE64로 인코딩하기 위해 Powershell 또는 Bash에서 다음과 같이 수행할 수 있습니다.

 

Powershell :

[System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.IO.File]::ReadAllText('PATH_TO_FILE')))

Bash :

base64 PATH_TO_FILE

 

 

"AWSSupport-StartEC2RescueWorkflow" 런북은 다음과 같은 입력 파라미터를 제공합니다. 해당 런북의 실행을 위해 각 입력 파라미터를 설정할 때 참고해 주세요.

 

● InstanceId (Required) : 본 자동화 런북을 실행할 대상 인스턴스를 지정합니다. 자동화가 실행되는 동안 대상 인스턴스는 중지되며 인스턴스 스토어 볼륨에 저장된 데이터는 손실됩니다. 또한 Elastic IP를 사용하지 않는 경우 인스턴스의 Public IP 주소가 변경됩니다.

● AutomationAssumeRole (Optional) : 사용자를 대신하여 Systems Manager 자동화가 작업을 수행할 수 있도록 허용하는 AWS IAM 역할의 ARN(Amazon Resource Name)을 지정합니다. 역할을 지정하지 않을 경우, 이 자동화 런북을 시작하는 사용자의 권한을 사용합니다.

● OfflineScript (Required) : 도우미 인스턴스에서 실행할 BASE64로 인코딩된 스크립트의 스트링을 입력합니다. 조치가 필요한 대상 인스턴스가 Linux인 경우 Bash를 사용하고 Windows인 경우 PowerShell을 사용하여 스크립트를 작성하고 입력합니다.

● EC2RescueInstanceType (Optional) : 도우미 인스턴스의 유형을 지정합니다.

● SubnetId (Optional) : 도우미 인스턴스가 생성될 서브넷을 지정합니다. 기본적으로 조치 대상 인스턴스와 동일 서브넷이 사용됩니다. 또한 "SelectedInstanceSubnet"을 입력하여 명시적으로 대상 인스턴스와 동일 서브넷이 선택되도록 하거나 "CreateNewVPC"을 입력하여 다른 새로운 VPC를 생성하고 사용하도록 할 수 있습니다. 중요: 사용자가 지정 서브넷을 제공하는 경우 해당 서브넷이 대상 인스턴스와 동일한 가용 영역이어야 하며 SSM 엔드포인트와의 통신을 허용해야 합니다.

● S3BucketName (Optional) : 문제 해결 로그를 업로드할 계정의 S3 버킷 이름입니다. 버킷 정책에서 수집된 로그에 액세스할 필요가 없는 당사자에 대해 불필요한 읽기/쓰기 권한을 부여하지 않도록 해야 합니다.

● S3Prefix (Optional) : S3에 저장되는 로그의 접두사를 지정합니다.

● AMIPrefix (Optional) : 자동화가 진행되는 동안 백업을 수행하도록 지정하면 백업 AMI를 생성합니다. 생성되는 백업 AMI 이름의 접두사를 지정합니다.

● CreatePreEC2RescueBackup (Optional) : 'True'로 설정하면 지정된 스크립트를 실행하기 전에 대상 인스턴스의 백업 AMI를 생성합니다. 이렇게 생성된 백업 AMI는 자동화 실행 완료 후에도 유지됩니다.

● CreatePostEC2RescueBackup (Optional) : 'True'로 설정하면 지정된 스크립트를 실행한 후에 대상 인스턴스의 백업 AMI를 생성합니다. 이렇게 생성된 백업 AMI는 자동화 실행 완료 후에도 유지됩니다.

● UniqueId (Optional) : 자동화의 고유 식별자를 지정합니다.

● HelperInstanceProfileName (Optional) : 생성되는 도우미 인스턴스에 연결될 인스턴스 프로파일의 이름을 지정합니다.

● AllowEncryptedVolume (Optional) : 'True'로 설정하면 암호화된 루트 볼륨에 대해 EC2Rescue 작업을 수행할 수 있도록 합니다. 단, 해당 볼륨을 암호화 하는데 사용된 AWS KMS 키가 활성화(enabled) 상태이고 유효한(valid) 상태이어야 합니다.

● AssociatePublicIpAddress (Optional) : 'True'로 설정하면 도우미 인스턴스에 public IP가 할당됩니다. SSM 엔드포인트로 연결에 Public IP가 필요한 경우 'True'로 설정합니다.

● HelperInstanceSecurityGroupId (Optional) : 도우미 인스턴스에 연결될 보안 그룹의 ID를 지정합니다. 만약 이를 지정하지 않으면 VPC의 기본 보안 그룹이 사용됩니다. 단, 도우미 인스턴스의 보안 그룹은 Amazon S3 및 AWS Systems Manager 엔드포인트와 HTTPS(443포트) 아웃바운드 트래픽을 허용해야 합니다.

 

입력 파라미터 중 "AutomationAssumeRole" 파라미터에는 이 런북을 성공적으로 실행할 수 있도록 "AmazonSSMAutomationRole" AWS 관리형 정책이 연결된 역할을 지정하는 것이 필요합니다. 그리고 여기에 더하여 다음과 같은 권한이 추가되어야 합니다. (여기서 "An-AWS-Account-ID"은 사용자의 AWS 어카운트로 대체 되어야 합니다.)

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Action": [
				"lambda:InvokeFunction",
				"lambda:DeleteFunction",
				"lambda:GetFunction"
			],
			"Resource": "arn:aws:lambda:*:An-AWS-Account-ID:function:AWSSupport-EC2Rescue-*",
			"Effect": "Allow"
		},
		{
			"Action": [
				"s3:GetObject",
				"s3:GetObjectVersion"
			],
			"Resource": [
				"arn:aws:s3:::awssupport-ssm.*/*.template",
				"arn:aws:s3:::awssupport-ssm.*/*.zip"
			],
			"Effect": "Allow"
		},
		{
			"Action": [
				"iam:CreateRole",
				"iam:CreateInstanceProfile",
				"iam:GetRole",
				"iam:GetInstanceProfile",
				"iam:PutRolePolicy",
				"iam:DetachRolePolicy",
				"iam:AttachRolePolicy",
				"iam:PassRole",
				"iam:AddRoleToInstanceProfile",
				"iam:RemoveRoleFromInstanceProfile",
				"iam:DeleteRole",
				"iam:DeleteRolePolicy",
				"iam:DeleteInstanceProfile"
			],
			"Resource": [
				"arn:aws:iam::An-AWS-Account-ID:role/AWSSupport-EC2Rescue-*",
				"arn:aws:iam::An-AWS-Account-ID:instance-profile/AWSSupport-EC2Rescue-*"
			],
			"Effect": "Allow"
		},
		{
			"Action": [
				"lambda:CreateFunction",
				"autoscaling:DescribeAutoScalingInstances",
				"ec2:CreateVpc",
				"ec2:ModifyVpcAttribute",
				"ec2:DeleteVpc",
				"ec2:CreateInternetGateway",
				"ec2:AttachInternetGateway",
				"ec2:DetachInternetGateway",
				"ec2:DeleteInternetGateway",
				"ec2:CreateSubnet",
				"ec2:DeleteSubnet",
				"ec2:CreateRoute",
				"ec2:DeleteRoute",
				"ec2:CreateRouteTable",
				"ec2:AssociateRouteTable",
				"ec2:DisassociateRouteTable",
				"ec2:DeleteRouteTable",
				"ec2:CreateVpcEndpoint",
				"ec2:DeleteVpcEndpoints",
				"ec2:ModifyVpcEndpoint",
				"ec2:Describe*",
				"ec2:CreateLaunchTemplate",
				"ec2:DeleteLaunchTemplate",
				"ec2:ModifyInstanceAttribute",
				"ec2:DetachVolume",
				"ec2:AttachVolume",
				"ec2:DescribeVolumes",
				"cloudformation:DescribeStackResource"
			],
			"Resource": "*",
			"Effect": "Allow"
		}
	]
}

 

 

런북 실행 예시

 

다음은 AWS 지원 자동화 워크플로우에서 제공되는 "AWSSupport-StartEC2RescueWorkflow" 런북을 통해 EC2 Windows 인스턴스에 오프라인 스크립트를 실행하는 예제를 보여 줍니다.

 

본 기사는 다음과 같은 간단히 시나리오를 기반으로 실행 예제를 작성하였습니다.

 

스크립트 실행 시나리오 :

  1. 대상 인스턴스는 EC2 Windows 인스턴스이며 대상 인스턴스의 루트 볼륨에 존재하는 특정 파일들(C:\Temp\a000*.txt)을 삭제하는 것을 목표로 스크립트를 제공하여 조치합니다.

여기에 이미지 설명 입력

  1. 해당 파일들을 삭제하기 위한 Powershell 스크립트는 다음과 같습니다.

get-childitem -path "$env:EC2RESCUE_OFFLINE_DRIVE\Temp" -Include a000*.txt -Recurse | foreach { $_.Delete()}

  1. 이를 BASE64로 인코딩하기 위해 다음과 같이 Powershell에서 실행합니다.

PS C:> $command = 'get-childitem -path "$env:EC2RESCUE_OFFLINE_DRIVE\Temp" -Include a000*.txt -Recurse | foreach { $_.Delete()}'

PS C:> $encodedcommand = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($command))

  1. BASE64로 인코딩된 값을 확인합니다. 그리고 출력된 문자열을 저장해 둡니다. 이후 "OfflineScript" 입력 파라미터에 이를 입력합니다.

PS C:> $endcodedcommand

Z2V0LWNoaWxkaXRlbSAtcGF0aCAiJGVudjpFQzJSRVNDVUVfT0ZGTElORV9EUklWRVxUZW1wIiAtSW5jbHVkZSBhMDAwKi50eHQgLVJlY3Vyc2UgfCBmb3JlYWNoIHsgJF8uRGVsZXRlKCl9

여기에 이미지 설명 입력

 

사용 예시를 보여주기 위해 간단한 시나리오로 설명 드리지만 이렇게 오프라인으로 스크립트를 실행하여 조치할 수 있는 방법을 활용하면 다양한 OS 레벨의 이슈 사례에 적용하여 문제 해결에 도움이 될 수 있습니다.

또한 앞서 설명드린 바와 같이 본 예시는 EC2 Windows 인스턴스를 대상으로 하지만 EC2 Linux와 EC2 MacOS 인스턴스를 대상으로 동일한 자동화를 실행할 수 있습니다.

 

  1. 조치가 필요한 대상 EC2 Windows 인스턴스의 ID를 확인합니다.

  2. AWS Systems Manager 콘솔로 이동하여 왼쪽 네비게이션에서 자동화(Automation)을 선택합니다.

  3. 오른쪽의 자동화 실행(Execute automation) 버튼을 클릭합니다.

  4. 중앙의 자동화 런북에서 "DiagnoseDiskUsageOnWindows"를 입력하여 검색하고 결과에 표시된 "AWSSupport-StartEC2RescueWorkflow" 런북을 선택한 뒤 하단에서 다음(Next)를 클릭합니다. 여기에 이미지 설명 입력

  5. 기본적으로 단순 실행(Simple execution)으로 선택됩니다. 조치가 필요한 인스턴스를 선택하거나 ID를 입력합니다. 그리고 입력 파라미터 섹션에서 필요한 정보를 입력합니다. 본 기사의 시나리오에서는 다음과 같이 입력 파라미터를 설정합니다. 그 외에는 기본 입력된 값을 사용하거나 별도로 지정하지 않았습니다.

● OfflineScript : Z2V0LWNoaWxkaXRlbSAtcGF0aCAiJGVudjpFQzJSRVNDVUVfT0ZGTElORV9EUklWRVxUZW1wIiAtSW5jbHVkZSBhMDAwKi50eHQgLVJlY3Vyc2UgfCBmb3JlYWNoIHsgJF8uRGVsZXRlKCl9

● EC2RescueInstanceType : t3.large

● SubnetId : SelectedInstanceSubnet

● CreatePreEC2RescueBackup : False

● CreatePostEC2RescueBackup : False

● UniqueId : {{ automation:EXECUTION_ID }}

  1. 하단에 실행(Execute)를 클릭합니다.
  2. 런북이 실행되는 동안 위에서 설명한 볼륨 분석 및 확장 여부 결정 작업이 자동으로 진행됩니다.
  3. 런북이 성공적으로 실행 완료되면, 실행 상태의 전체 상태(Overall status)가 "Success"로 표시되는지 확인합니다.

여기에 이미지 설명 입력

본 시나리오에서 스크립트가 정상적으로 실행되면 실제 대상 인스턴스에서 파일이 삭제된 것을 확인할 수 있습니다.

여기에 이미지 설명 입력

 

지정한 스크립트가 정상적으로 실행되었을 때 결과 예는 다음과 같습니다.

여기에 이미지 설명 입력

 

만약 스크립트 실행이 실패되면 결과에 오류 메시지가 표시됩니다.

다음 예는 본 시나리오에서 스크립트를 통해 삭제하려는 파일의 경로가 존재하지 않을 경우 Powershell 오류가 발생되고 이것이 결과로 출력되는 것을 보여줍니다.

여기에 이미지 설명 입력

 

 

참고

[1] AWSSupport-StartEC2RescueWorkflow

https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-startec2rescueworkflow.html

댓글 없음

관련 콘텐츠