詳細検索

AWS SDK를 사용해 EC2 인스턴스의 상태를 확인하기

아바타
글쓴이 maeno
4분 읽기

AWS SDK를 사용해 EC2 인스턴스의 상태를 확인하기
日本語에서 번역 • 원문 보기

애플리케이션 측면에서는 AWS EC2 인스턴스의 현재 운영 상태를 실시간으로 확인하고 싶을 때가 있습니다. 예를 들어, 외부 애플리케이션에서 EC2 인스턴스를 시작하거나 중지할 때, 인스턴스의 운영 상태를 확인하고 상태가 바뀌면 다음 프로세스를 실행해야 합니다.

Ruby SDK에서는 'AWS::EC2' 클래스의 'client.describe_instance_status' 메서드를 사용하여 특정 EC 인스턴스의 상태를 얻을 수 있습니다. 인스턴스 상태에는 'system_status'와 'instance_status' 두 가지 유형이 있으며, 정확한 운영 상태를 확인하고 싶다면 이 두 가지 상태를 모두 얻어야 합니다. 또한, 인스턴스가 중단되면 상태가 존재하지 않는다는 점도 중요합니다. 즉, 중단된 인스턴스에 'client.describe_instance_status' 메서드를 실행하면 상태 정보를 저장하는 'instance_status_set' 객체의 내용을 가져올 수 없으므로, 이를 기반으로 코딩하지 않으면 상태 검색 오류가 발생합니다. 예를 들어, 중단된 인스턴스의 상태를 모니터링할 때는 인스턴스가 중단된 상태이므로 처음에는 'instance_status_set' 객체에 상태가 없다고 가정해야 합니다. 또한, 종료된 인스턴스는 'client.describe_instance_status' 메서드를 실행할 타겟이 없다는 점도 중요합니다.

위의 내용을 바탕으로 EC2 인스턴스 상태를 확인하기 위해 Ruby 프로그램을 만들었습니다.

chkins.rb
# 인코딩: UTF-8
"aws-SDK" 요구가 필요합니다 

디펜check_instance_status

    ec2 = AWS::EC2.new( 
      :access_key_id => 단락[:access_key_id],  
      :secret_access_key => 매개변수[:secret_access_key],  
      :region => 파라미터[:region]
    )

    AWS.memoize do
      상태 = []
      ec2.instances[Params[:instance_id]..exists? 
        ec2info = ec2.client.describe_instance_status({ 'instance_ids' => [Params[:instance_id]] })
        ec2info.instance_status_set.비어 있다면? 
          # 인스턴스가 멈췄다
          상태 < 'stopped'
          message = '%s has stopped'
        else
          ec2info.instance_status_set.map { |i| 
            sys_status = i.respond_to?(:system_status) ? i.system_status.details[0].status : nil
            ins_status = i.respond_to?(:instance_status) ? i.instance_status.details[0].status : nil
            status < sys_status < ins_status
          }
          if status.include?('passed')
            # instance is running
            message = '%s is running'

          elsif status.include?('initializing')
            # instance is initializing
            message = '%s is starting'

          else
            # otherwise
            message = '%s is unknown status'

          end
        end
      else
        # instance has terminated
        status < 'terminated'
        message = '%s has already terminated'
      end
      puts sprintf("#{message}. status: %s", "Instance: #{Params[:instance_id]}", status)
    end
end

begin
  # init
  Params = { 
    :access_key_id => ARGV[0],  
    :secret_access_key => ARGV[1],  
    :region => ARGV[2],  
    :instance_id => ARGV[3],  
    :타임아웃 => ARGV[4].nil? ? 1 : ARGV[4].to_i
  }
  Params.values.include? (nil)

  1의 I에 대해... Params[:timeout] do
    1을 >면 1번 자세요
    check_instance_status
  끝

구조 => e
  e
끝

프로그램 실행 시 인수로서,

  • AWS 접근 키 (필수)
  • AWS 비밀 접근 키 (필수)
  • 지역 (필수)
  • 인스턴스 ID (상태를 확인하고 싶은 인스턴스 ID)
  • 타임아웃 횟수(1초에 몇 번) 선택 사항. 생략 시 한 번만 허용)

고객에게 전달하면, 지정된 인스턴스의 상태를 표준 출력으로 거의 타임아웃 수 ≒초 단위로 모니터링합니다.

실행 예시:
$ 루비 -Ku chkins.rb <AWSアクセスキー> <AWSシークレットキー> ap-southeast-10 <インスタンスID> 
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]
인스턴스: i-***** 실행 중입니다. 상태: ["통과", "통과"]

지정된 인스턴스 ID가 실행 중일 경우, 위 결과는 약 10초 동안 모니터링됩니다.

  • 실행 전에 'AWS SDK for Ruby'(버전 1)를 설치해야 합니다.

특정 상태가 감지되면 이메일을 보내고, 스크립트를 'cron'에 등록한 뒤 정기적으로 실행하는 작업을 추가하면 AWS CloudWatch에 의존하지 않고도 인스턴스의 운영 상태를 모니터링할 수 있을 것입니다.</インスタンスID></AWSシークレットキー></AWSアクセスキー>

Related Articles