Capistrano에서 새로 생성된 EC2 인스턴스에 SSH로 접근하려는 작업을 실행하면, 어딘가에서 오류가 발생해 작업이 완료되지 않습니다. 따라서 배포할 EC2 인스턴스의 시작 상태를 확인하는 작업을 만들었고, 완전히 실행되지 않았다면 잠전 모드로 전환되어 시작을 기다리게 합니다.
AWS EC2 인스턴스에 대한 상태 정보는 세 가지가 있으며, 이 모든 상태를 확인하지 않으면 인스턴스가 완전히 가동되었다고 말할 수 없습니다(아래 그림 참조).

인스턴스가 시작되었는지 확인하려면 AWS 관리 콘솔의 "인스턴스 상태"가 '실행 중'인지 확인하는 것은 괜찮지만, 인스턴스가 실제로 SSH 연결이 가능한지 확인하려면 두 상태(INSTANCE STATUS와 SYSTEMSTATUS reachability)가 모두 '통과'되었는지 확인해야 하며, 이는 'Status Checks' 열에 표시된 '2/2 checks'로 표시됩니다. 일반적으로 인스턴스가 실행되면 "인스턴스 상태"가 몇 초에서 10초 내에 '실행 중'이 되지만, '상태 검사'는 몇 분 정도 초기화됩니다. 이 두 상태 모두 '통과'되지 않으면 SSH 접근이 사용됩니다.
지금까지 사용한 '확인' 작업에서는 '인스턴스 상태' 상태 하나만 확인되어 SSH 접근으로 후속 작업이 중단되었습니다. 이번에는 이를 피하기 위한 작업이 '확인' 작업입니다.
작업 :체크 하기
run_locally 그래
created_instances_list = 'CREATED_INSTANCES'
def check_instance_status(instance_ids=[])
ec2 = AWS::EC2.new
AWS.memoize do
ec2info = ec2.client.describe_instance_status({'instance_ids' => instance_ids})
sys_status = ec2info.instance_status_set.map { |i| i.system_status.details[0].status }
ins_status = ec2info.instance_status_set.map { |i| i.instance_status.details[0].status }
상태 = sys_status + ins_status
반환 상태. include? ('초기화') ? false : true입니다
끝
끝
ec2 = AWS::EC2.new
시작
테스트 "[ -f ~/#{created_instances_list} ]"
created_instances = 캡처("CD ~; 고양이 #{created_instances_list}").씹어
ci = created_instances.gsub(/(\[|\s|\])/, '').split(',')
target_instances = ec2.instances.select { |i| i.exists? && i.status == :running && ci.include?( i.id) }.map(&:id)
target_instances.length < fetch(:instance_count)
if target_instances.length == fetch(:instance_count) then
# 全インスタンス起動(Instance Stateがrunning)
chk_retry = 0
while !check_instance_status(target_instances) do
# インスタンスステータスが全てOKでない場合は15秒待つ(※20回までリトライする)
info "In preparation of the instance: Status check " + (chk_retry > 0 ? "(재시도 #{chk_retry + 1} 번)" : "")
잠 15분
만약 check_instance_status(target_instances) 이면,
휴식
끝
chk_retry += 1
"인스턴스가 아직 준비되지 않았습니다. 잠시 기다린 후 작업을 다시 실행하세요."라고 chk_retry >= 20
끝
# 모든 인스턴스가 완전히 실행된 후의 과정입니다 (첫 번째 SSH 연결 설정)
target_instance_private_ips = ec2.instances.select { |i| i.exists? && i.status == :running && ci.include?( i.id) }.map(&:p rivate_ip_address)
pkfn = fetch(:p rivate_key_file)
target_instance_private_ips.each { |var|
Server var, user: 'ec2-user', roles: %w{web app}, ssh_options: { keys: %W(/home/deploy-user/#{pkfn}), forward_agent: true }
}
끝
끝
구조 => e
정보 E
퇴장
끝
끝
# 샘플 후속 작업 (호스트명 표시용 SSH)
On roles(:web) do
정보 캡처 "호스트네임"
끝
끝
위 설정에서, 후속 작업의 샘플 부분이 제거된 작업이 Capistrano에서 EC2 인스턴스를 생성한 후 배포 작업 바로 전에 삽입됩니다.