지난번과 이어서, 새로 생성된 EC2 인스턴스인 Capistrano에 SSH로 접속해 보겠습니다.
먼저, 예비 준비 단계로, AWS는 새 인스턴스를 위한 키 쌍을 생성합니다. AWS 관리 콘솔의 "EC2" 메뉴에서 "NETWORK & SECURITY" 카테고리의 "Key Pairs" 메뉴로 키 쌍을 생성할 수 있으니, 필요에 따라 생성해 주세요. 이 섹션의 예시에서는 Capistrano가 "deploy-test"를 실행하는 배포 인스턴스에서 사용하는 키 쌍을 사용할 것입니다.

그 다음, 사용 가능한 키 쌍의 개인 키 파일(이 예시의 'deploy-test.pem' 파일)을 배포 환경을 배포할 사용자의 홈 디렉터리(이 예시에서 '/home/deploy-user/')1. 업로드된 개인 키에는 적절한 읽기 권한이 부여되어야 하므로 파일 권한을 변경하세요.
$ CD ~
$ chmod 600 deploy-test.pem
$ 이즈 -l *.pem
-rw------- 1 deploy-user deploy-user 1692 7월 2일 10:18 deploy-test.pem
배포 구성 파일 'config/deploy.rb'가 다음과 같이 수정되었습니다.
# config capistrano 3.1에만 유효
락 '3.2.1'
# 루비용 AWS SDK 로딩 중
'aws-sdk' 요구사항
# AWS SDK 설정
AWS.config({
:access_key_id => '<AWS access="" key="" id="">',
:secret_access_key => '<AWS secret="" access="" key="">',
:region => 'ap-northeast-1',
})
# 아미 image_id
# 아마존 리눅스 AMI 2014.03.2 (HVM)
셋 :ami_image_id, 'ami-29dc9228'
# 생성할 인스턴스 수
세트 :instance_count, 2
# 생성할 인스턴스 유형
셋 :ec2_instance_type, 't2.micro'
# 이용 가능 구역 만들기
세트 :availability_zones, [ 'AP-북동-1a', 'AP-북동-1c' ]
# 창조 subnet_id (필요하면)
Set :subnet_ids, [ 'subnet-********', 'subnet-********' ]
# 사용할 키 쌍 이름
Set :key_pair_name, '배치-테스트'
# 개인 키 파일
Set :p rivert_key_file, 'deploy-test.pem'
# 보안 그룹 ID 사용
집합 :security_groups, [ 'SG-********', 'SG-********', 'SG-********', 'SG-********' ]
# Capistrano 기본 작업 삭제
framework_tasks = [:시작, :시작, :업데이트 중, :업데이트, :p유전, :p완성, :마무리, :완료]
framework_tasks.각 두 |t|
Rake::Task["deploy:#{t}"].clear
끝
레이크::과제[:d에플로이].완료
desc '각 가용성 존별로 EC2 인스턴스를 런칭'
작업 :실행 실행
run_locally 그래
ec2 = AWS::EC2.new
created_instances = []
CNT = 0
CNT < fetch(:instance_count) do
if cnt.even? then
current_az = fetch(:availability_zones)[0]
current_sn = fetch(:subnet_ids)[0]
else
current_az = fetch(:availability_zones)[1]
current_sn = fetch(:subnet_ids)[1]
end
i = ec2.instances.create(
:image_id => fetch(:ami_image_id),
:monitoring_enabled => 거짓,
:availability_zone => current_az,
:서브넷 => current_sn,
:key_name => fetch(:key_pair_name),
:security_group_ids => fetch(:security_groups),
:d isable_api_termination => true,
:instance_type => fetch(:ec2_instance_type),
:카운트 => 1,
:associate_public_ip_address => 맞아요
)
i.status 동안 10번 자세요 == :p anding
created_instances < i.id
cnt += 1
end
execute "echo -n #{created_instances} > ~/CREATED_INSTANCES"
끝
끝
이제 인스턴스 실행 작업을 실행해 보겠습니다.
$ 캡 테스트 발사
INFO[3c926533] localhost에서 /usr/bin/env echo -n ["i-1c0c351a", "i-cfd209d6"] > ~/CREATED_INSTANCES 실행 중
DEBUG[3c926533] 명령어: echo -n ["i-1c0c351a", "i-cfd209d6"] > ~/CREATED_INSTANCES
INFO[3c926533] 0.036초 만에 완주했고, 출구 상태 0(성공).
AWS 관리 콘솔에서 생성된 인스턴스 실행을 확인한 후, 명령줄에서 ec2-user를 사용해 SSH를 시도해 보세요.
$ ssh -i ~/deploy-test.pem ec2-user@176.34.61.235
호스트 '176.34.61.235 (176.34.61.235)'의 진위 여부는 확인되지 않습니다.
ECDSA 키 지문은**** **:****::****.******************
계속 연결하고 싶으신가요? (예/아니오) 네
경고: '176.34.61.235' (ECDSA)가 알려진 숙주 목록에 영구적으로 추가되었습니다.
__| __|_ )
_| ( / 아마존 리눅스 AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/
보안 목적으로 필요한 패키지는 18개 중 8개
"sudo yum update"를 실행하면 모든 업데이트를 적용하세요.
무사히 성공했어요.
Capistrano에서 새로 생성된 EC2 인스턴스에 SSH 접근하는 후속 작업을 추가해 보겠습니다.
desc '새 인스턴스의 활성화 상태 확인'
작업 :체크 하기
created_instances_list = 'CREATED_INSTANCES'
run_locally 그래
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(&:p rivate_ip_address) #dns_name
만약 target_instances.length == 0이라면,
"생성된 인스턴스 없음"
끝
pkfn = fetch(:p rivert_key_file)
target_instances.each { |var|
Server var, user: 'ec2-user', roles: %w{web app}, ssh_options: { keys: %W(/home/deploy-user/#{pkfn}), forward_agent: true }
}
끝
구조 => e
정보 E
퇴장
끝
끝
끝
작업 :init => :체크 Do
On roles(:web) do
access_log = "호스트네임" 캡처
정보 access_log
끝
끝
새로 생성된 "init" 작업에서는 먼저 "check" 작업이 실행되어 생성된 인스턴스가 실행되었는지 확인합니다. "check" 작업에서는 새로 생성된 인스턴스 ID에서 개인 IP 주소를 얻고, SSH 정보는 "WEB, APP" 역할로 접근할 서버로 정의됩니다. 이 시점에서 사용자는 초기 Amazon Linux 사용자 "ec2-user"가 접근할 수 있도록 개인 키로 로그인하도록 설정됩니다. 'forward_agent'을 TRUE로 설정하지 않으면, 첫 번째 SSH 중 콘솔 상호작용 중에 접근이 중단됩니다. 'check' 작업이 정상이라면, 'init' 작업이 자동으로 실행됩니다. 이 작업에서는 'hostname' 명령어로 로그인한 각 서버의 호스트명이 출력되어 완료됩니다. 이제 실제로 "init" 작업을 실행해 보겠습니다.
$ 캡 테스트 init
DEBUG[8c9dcda9] localhost에서 /usr/bin/env [ -f ~/CREATED_INSTANCES ] 실행 중
DEBUG[8c9dcda9] 명령어: [ -f ~/CREATED_INSTANCES ]
DEBUG[8c9dcda9] 종료 시간은 0.003초, 종료 상태 0(성공).
DEBUG[c1473094] 실행 중 /usr/bin/env cd ~; localhost에서 cat CREATED_INSTANCES
DEBUG[c1473094] 명령어: cd ~; cat CREATED_INSTANCES
디버그[c1473094] [i-1c0c351a, i-cfd209d6]
DEBUG[c1473094] 종료 시간은 0.002초, 종료 상태 0(성공).
DEBUG[1fe95f86] 176.34.62.57에서 /usr/bin/env 호스트네임을 실행 중입니다
DEBUG[1fe95f86] 명령어: /usr/bin/env 호스트네임
DEBUG[7d485d1a] 176.34.61.235에서 /usr/bin/env 호스트네임을 실행 중입니다.
DEBUG[7d485d1a] 명령어: /usr/bin/env 호스트네임
DEBUG[7d485d1a] 종료 0.131초, 종료 상태 0(성공).
디버그[7d485d1a] ip-176-34-61-235
DEBUG[7d485d1a] 종료 0.131초, 종료 상태 0(성공).
정보-176-34-61-235
DEBUG[1fe95f86] 종료 시간은 0.145초, 종료 상태 0(성공).
디버그[1fe95f86] ip-176-34-62-57
DEBUG[1fe95f86] 종료 시간은 0.145초, 종료 상태 0(성공).
정보-176-34-62-57
저는 Capistnrano로 새로 만든 인스턴스에서 성공적으로 SSH를 할 수 있었습니다. 각 인스턴스의 배포 설정을 작업에 추가하기만 하면 됩니다.
다음에는 Capistrano에서 새로 생성된 인스턴스에 ec2-user 이외의 사용자를 생성하고 해당 사용자에게 SSH 접근을 허용하는 작업을 설정해 보겠습니다. 동시에 기본 ec2-user 사용자에게는 비밀번호를 설정하고 기본 사용자의 SSH 접근 제한을 설정할 것입니다. 강력한 권한이 있는 ec2-user 사용자로 EC2 인스턴스에 영원히 접근할 수 있는 것은 보안에 위험하기 때문에, 생성된 인스턴스에 유지보수 계정을 만드는 것은 EC2 배포의 초기 설정과 같습니다.
- AWS에서는 키 쌍을 생성할 때 개인 키는 한 번만 다운로드할 수 있으며, 그렇지 않으면 개인 키 파일을 얻을 수 없으므로 개인 키 다룰 때 주의가 필요합니다. ↩