이전 배포 설정 파일에서 새로 생성된 EC2 인스턴스에는 키 쌍, 보안 그룹 등이 없어서, 생성된 인스턴스를 SSH로 연결할 수 없었어요... 1orz
그 후 여러 배포 설정을 수정해 SSH로 만든 EC2 인스턴스에 로그인할 수 있었고, 그 과정을 메모로 작성했습니다. 음, Capistrano에서 AWS EC2 인스턴스를 만들 때... 정확히 말하면, "AWS SDK for Ruby"로 EC2 인스턴스를 만들 때 무엇을 염두에 두어야 하는지... 거의 비슷할 수도 있습니다.
먼저, 이전 'config/deploy.rb'에서 인스턴스 실행의 작업 부분을 살펴보겠습니다.
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),
:availability_zone => current_az,
:서브넷 => current_sn,
:instance_type => fetch(:ec2_instance_type),
:카운트 => 1
)
i.status 동안 10번 자세요 == :p anding
created_instances < i.id
cnt += 1
end
execute "echo -n #{created_instances} > ~/CREATED_INSTANCES"
끝
끝
인스턴스 생성에 대해 AvailabilityZone과 Subnet만 설정되어 있기 때문에 접근할 수 없습니다. 최소한 외부로부터 접근 경로를 보호하기 위한 보안 그룹을 설정하고, 인증된 사용자가 로그인할 수 있도록 키 쌍을 설정하는 것이 필요합니다. 그 다음에는 최소한의 설정이 PublicIP(PublicDNS)를 자동으로 할당하여 인터넷에서 접근할 수 있도록 하는 것이라고 생각합니다.
바로 고치자. 먼저, 필요한 집합 값을 변수로 추가한다.
# 키 페어 이름 수입
셋 :key_pair_name, 'mykeypair'
# 보안 그룹 ID 사용
세트 :security_groups, [ 'SG-********', 'SG-********', 'SG-*****' ]
# 커널 ID
세트 :kernel_id_name, '아키-*****'
키 쌍과 보안 그룹은 AWS 콘솔에서 미리 생성해야 합니다. Capistrano가 실행 중인 인스턴스의 키 쌍과 보안 그룹을 배포 환경으로 빠르게 사용할 수 있는 방법입니다. 필요에 따라 커널 ID를 설정하세요. 별도의 코드가 없어도 문제 없습니다. 그 다음, ec2 클래스의 메서드 부분을 다음과 같이 변경하세요.
I = EC2.Instances.Create(
:image_id => fetch(:ami_image_id),
:block_device_mappings => [{
:d evice_name => '/dev/sda1',
:ebs => {
:volume_size => 50,
:d elete_on_termination => 참
}
}],
:monitoring_enabled => 거짓,
:availability_zone => current_az,
:서브넷 => current_sn,
:key_name => fetch(:key_pair_name),
:security_group_ids => fetch(:security_groups),
:kernel_id => fetch(:kernel_id_name),
:d isable_api_termination => true,
:instance_type => fetch(:ec2_instance_type),
:카운트 => 1,
:associate_public_ip_address => 맞아요
)
새로 추가된 메서드 옵션은 다음과 같습니다:
- ':block_device_mappings' 이것은 EBS(ELASTIC BLOCK STORE) 설정입니다. 고정 인스턴스 저장 용량에 더 추가하고 싶으면 추가하세요. 이 예시에서는 50GB 저장 용량 볼륨2를 추가하고 있습니다.
- 인스턴스 실행 후 CloudWatch 모니터링을 시작하는 ':monitoring_enabled'
- ':key_name' ... 이것은 필수 설정입니다. 키 쌍 name3를 지정하세요. 여기서는 앞서 정의한 변수를 호출하고 있습니다.
- ':security_group_ids'는 필수 설정입니다. 이미 배열 형식으로 정의된 보안 그룹 ID를 설명하세요4. 여기서는 이전에 정의한 변수들을 호출합니다.
- ':kernel_id' 커널 ID를 사용할 때 명시합니다. 동일한 커널 ID로 HMV 지원 AMI에서 여러 인스턴스를 생성하려 하면 오류가 발생하므로 해당 경우 지정하지 마세요.
- EC2 API를 사용해 인스턴스를 종료할 수 있도록 하려면 ':d isable_api_termination'을 TRUE로 설정하세요.
- ':associate_public_ip_address'는 중요한 설정입니다. 생성된 인스턴스에 PublicIP 주소를 자동으로 할당하고 싶다면 TRUE5로 설정하세요.
이제 수정된 배포 설정을 사용해 인스턴스 실행 작업을 실행해 보겠습니다.
$ 캡 테스트 발사
INFO[6866d5d4] localhost에서 /usr/bin/env echo -n ["i-70f0cf76", "i-f718c1ee"] > ~/CREATED_INSTANCES 실행 중
DEBUG[6866d5d4] 명령어: echo -n ["i-70f0cf76", "i-f718c1ee"] > ~/CREATED_INSTANCES
INFO[6866d5d4] 0.034초 만에 종료, 출구 상태 0(성공).
- 참고로, Capistrano 작업을 디버깅하고 싶다면, 'cap test launch debug' 또는 'cap test launch --trace' 옵션을 사용해 작업을 실행하면 처리 과정을 자세히 추적할 수 있다는 점을 기억하는 것이 유용합니다.
AWS 관리 콘솔에서 확인해 보세요.


키 쌍, 보안 그룹, 그리고 PublicIP는 예상대로 EC2 인스턴스로 실행되었습니다. 이제 콘솔에서 SSH가 가능한지 확인해 봅시다.
$ ssh default-user@176.34.61.218
호스트 '176.34.61.218 (176.34.61.218)'의 진위 여부는 확인되지 않습니다.
RSA 키 지문은 **:****::****.**********************
계속 연결하고 싶으신가요? (예/아니오) 네
경고: '176.34.61.218' (RSA)이 알려진 호스트 목록에 영구적으로 추가되었습니다.
default-user@176.34.61.218의 비밀번호:
마지막 로그인: 2014년 5월 20일 화요일 06:47:06 ***에서**. ******. ******. *****.ne.jp
[default-user@ip-176-34-61-218 ~]$
저는 그 데이터를 입력했습니다. 하지만 이 예시에서는 AMI에서 인스턴스를 생성했고, 그 AMI에서 이미 "default-user"라는 사용자를 만들어 SSH로 접근할 수 있었기 때문에 쉽게 로그인할 수 있었습니다. 하지만 이전 예시처럼 공식 AWS AMI에서 인스턴스를 만들면 시간이 더 걸릴 것입니다. 이제 "Amazon Linux AMI 2014.03.2 (HVM)"의 공식 AMI를 사용하여 "t2.micro"에서 인스턴스를 생성하는 작업을 수정해 보겠습니다. HVM 호환 AMI에서 인스턴스를 실행할 때 오류를 일으키는 EBS 설정과 커널 ID 명세를 제거하세요.
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 => 맞아요
)
자, 시작하자.
$ 캡 테스트 발사
INFO[520beb79] localhost에서 /usr/bin/env echo -n ["i-abd4ebad", "i-580fd641"] > ~/CREATED_INSTANCES localhost에서 실행 중입니다
DEBUG[520beb79] 명령어: echo -n ["i-abd4ebad", "i-580fd641"] > ~/CREATED_INSTANCES
INFO[520beb79] 0.035초 만에 완주했고, 출구 상태 0(성공).
AWS 관리 콘솔에서 생성된 인스턴스 ID의 PrivertIP를 확인한 후, 콘솔에서 Amazon Linux AMI의 기본 사용자 "ec2-user"로 SSH를 실행하세요.
$ ssh EC2-user@176.34.61.153
호스트 '176.34.61.153 (176.34.61.153)'의 진위 여부는 확인되지 않습니다.
ECDSA 키 지문은**** **:****::****.******************
계속 연결하고 싶으신가요? (예/아니오) 네
경고: '176.34.61.153' (ECDSA) (ECDSA)가 알려진 숙주 목록에 영구적으로 추가되었습니다.
허가 거부됨 (공개 키).
물론 연결할 수는 있었지만, 공개키 인증 때문에 접근할 수 없었습니다. 'ssh -i' 옵션으로 개인 키를 연결하고 인증하지 않으면 연결할 수 없습니다. 즉, 생성된 인스턴스의 다음 작업을 수행하려면 Capistrano를 실행 중인 배포 서버에서 인스턴스 생성에 사용할 개인 키를 미리 준비해야 합니다. 그 다음, 새 인스턴스에 대한 첫 번째 SSH는 개인 키를 사용해 로그인하는 것입니다. 지금은 이 섹션에서 마칩니다. 다음에는 인스턴스 실행 직후 작업으로서 Capistrano를 통해 새 인스턴스에 SSH로 연결하는 단계를 요약하겠습니다.
참고 사이트
SDK 문서에는 주석(이하 ":key_name (문자열) — 사용할 키 쌍의 이름. 참고: 키 쌍 ID 없이 공개 이미지를 실행하면 접근 불가능해집니다.") ↩
EBS 볼륨을 사용하면 HVM 호환 AMI가 더 이상 제공되지 않습니다. 따라서 인스턴스 유형을 "t2.micro" 대신 "t1.micro"로 변경해야 하며, HMV는 "t2.micro"에 할당되어 있습니다. ↩
동작을 시도해보진 않았지만, 키 페어를 가져올 수 있는 것 같습니다. 그렇다면 텍스트가 ':key_pair => ec2.key_pairs.import(fetch(:key_pair_name), File.read('~/.ssh/identity.pub')))) 같은 형태인가요? (검증되지 않음) ↩
보안 그룹을 지정하지 않으면 기본 그룹만 설정되어 동일 VPC 네트워크에서만 접근할 수 있습니다. ↩
기본 설정은 FALSE이므로 이 설정을 하지 않으면 PublicDNS가 활성화되지 않습니다. ↩