지금까지 새로운 AWS EC2 인스턴스를 생성해 Capistrano3에서 초기 구성까지 작업으로 전환했습니다. 어려웠지만 결국 EC2 인스턴스가 준비되었고, 미들웨어와 애플리케이션을 설치하기만 하면 되었습니다. 이번에는 지금까지의 배포 흐름을 요약하고자 합니다.
먼저, 배포 서버를 Capistrano3를 실행할 준비를 하세요. AWS 관리 콘솔 등에서 공식 Amazon Linux 환경과 같은 EC2 인스턴스를 실행하고, 로그인하여 Capistrano31을 설치하세요.
# 맛있어 업데이트 -y
# yum groupinstall -y "개발 도구"
# 개개성 버전
OpenSSL 1.0.1h-fips 2014년 6월 5일
# openssl 버전 -d
답변: "/etc/pki/tls"
# 컬 -L https://get.rvm.io | 박 -스 안정
# 출처 /etc/profile.d/rvm.sh
# RVM 목록
(※ RVM 루비가 표시되면 설치가 완료된 것입니다)
# 루비 -V
Ruby 2.0.0p451 (2014-02-24 리비전 45167) [x86_64-Linux]
# rvm 설치 2.0.0 -- --with-openssl-dir=/etc/pki/tls
# 루비 -V
Ruby 2.0.0p481 (2014-05-08 리비전 45883) [x86_64-linux]
# 젬 설치, 레일 --노-리 --노-로드
# 젬 인스태스트 카피스트라노
# 젬 설치 capistrano_colors
# 젬 설치 캡이스트라노-엑스트
# 젬 설치, 레일 없이 전개
# 캡 --V
(※ 캡 중단! ~ 전시되면 설치 완료)
# Gem 설치 AWS-SDK
배포 서버에서 배포 프로젝트를 실행할 사용자를 생성하세요. 배포 작업의 내용에 따라 타겟 사용자가 sudo 권한을 갖는 것이 더 편리합니다. 사용자를 만든 후 다시 그 사용자로 로그인하여 홈 디렉터리에 Capistrano3용 프로젝트를 생성합니다.
$ sudo useradd -G wheel deploy-user
$ sudo passwd deploy-user
$ sudo su - deploy-user
$ mkdir -m 755 CAP3-project
$ CD CAP3-프로젝트
$ cap install STAGES=test
다음으로, 배포 프로젝트 "cap3-project"를 설정하세요. 먼저, 배포 프로젝트에서 사용하는 전역 설정 "cap3-project/capfile"을 편집하세요.
캡파일
# DSL 로드하고 스테이지 설정
'capistrano/setup' 요구사항
# 기본 배치 작업 포함
'capistrano/배치' 요구사항
# 보석 파일에 포함된 다른 보석들의 작업 포함
#
# 이에 대한 문서는 예를 들어:
#
# https://github.com/capistrano/rvm
# https://github.com/capistrano/rbenv
# https://github.com/capistrano/chruby
# https://github.com/capistrano/bundler
# https://github.com/capistrano/rails
#
# '카피스트라노/RVM' 요구함
# '카피스트라노/르베네'를 요구한다
# '카피스트라노/크루비'를 요구해야 한다
# '카피스트라노/번들러'를 요구해
# 'capistrano/rails/assets'를 요구합니다
# '카피스트라노/철도/이주'를 요구한다
# 'lib/capistrano/tasks'에서 정의된 작업이 있다면 커스텀 작업을 불러옵니다.
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
Rake::Task[:test].invoke
인voke :test
이번 배포에서는 RVM, Rails 등을 사용하지 않으므로 선택적 모듈을 포함할 필요가 없습니다. 당분간은 기본 배포 환경이 "테스트"임만 지정할 것입니다.
다음으로, 배포 환경 파일 'cap3-project/config/deploy/test.rb'를 설정하세요.
config/deploy/test.rb
# 단순 역할 문법
# ==================
# 각 그룹의 주 서버에 호스트를 대량 추가하는 기능을 지원합니다
#는 어떤 호스트가 1차 주를 갖지 않는 한 첫 번째로 간주됩니다
# 속성 집합. 'role :all'을 선언하지 마세요, 메타 역할입니다.
#role :app, %w{deploy@example.com}
#role :web, %w{deploy@example.com}
#role :d b, %w{deploy@example.com}
# 확장 서버 문법
# ======================
# 이 기능을 사용하면 더 상세한 서버 정의를 입력할 수 있습니다.
# 서버 리스트. 두 번째 인자는 a, 또는 duck-types, 해시, 그리고
#는 서버에서 확장 속성을 설정하는 데 사용되었습니다.
#server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value
# 커스텀 SSH 옵션
# ==================
# 어떤 선택이든 통과할 수 있지만, net/ssh가 이해한다는 점을 명심하세요
# 제한된 옵션,[net/ssh 문서를](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start) 참고하세요.
#
# 글로벌 옵션
# --------------
# 세트 :ssh_options, {
# 키: %w(/home/rlisowski/.ssh/id_rsa),
# forward_agent: 거짓,
# auth_methods: %w(비밀번호)
# }
#
# 및/또는 서버별(전역 무시)
# ------------------------------------
# 서버 'example.com',
# 사용자: 'user_name',
# 역할: %w{웹 앱},
# ssh_options: {
# 사용자: 'user_name', # 위 사용자 설정을 덮어쓰는 것
# 키: %w(/home/user_name/.ssh/id_rsa),
# forward_agent: 거짓,
# auth_methods: %w(공개키 비밀번호)
# # 비밀번호: '키를 사용해 주세요'
# }
이번 배포에서는 실제 작업 중에 역할 설정과 배포 환경에 대한 SSH 설정이 동적으로 수행되므로 모든 기본 설정이 주석으로 삭제되었습니다.
그 다음, 배포 작업의 엔티티를 설정하세요.
config/deploy.rb
# config capistrano 3.1에만 유효
락 '3.2.1'
## AWS 구성 ------------------------------------------------
# 루비용 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, [ '서브넷-********', '서브넷-********' ]
# 세트에 필요한 키 페어 이름
Set :key_pair_name, '배치-테스트'
# 키 쌍 개인 키 파일
Set :p rivate_key_file, 'deploy-test.pem'
# 개인 키 파일 저장 경로 (로컬 측)
# *미리 /home/deploy-user/deploy-test.pem을 업로드하세요.
Set :p rivate_key_local_path, '/home/deploy-user/'
# 보안 그룹 ID 사용
세트 :security_groups, [ 'SG-********', 'SG-********', 'SG-*****' ]
# 커널 ID
셋 :kernel_id_name, '아키-*****'
# 태그 정보
Set :module, 'deploy'
Set :env, '테스트'
Set :version, '1.0.0'
# 초기 사용자 계정 정보 (새 비밀번호 설정)
Set :d ef_account, 'ec2-user'
set :d ef_password, 'PassWord'
# 유지보수 사용자 계정 정보
set :user_account, 'deploy-user'
설정 :user_password, '비밀번호'
## 배포 프로젝트의 공통 설정 ------------------------------------------------
# 배포할 애플리케이션 이름
Set :application, 'Application Name'
# :format의 기본 값은 :p retty입니다
Set :format, :p retty
# 로그 출력 레벨
설정 :log_level, :info
# :p ty의 기본 값은 거짓입니다
:p ty, 맞아요
## 작업 초기화 (Capistrano 기본 작업 삭제)
framework_tasks = [:시작, :시작, :업데이트 중, :업데이트, :p유전, :p완성, :마무리, :완료]
framework_tasks.각 두 |t|
Rake::Task["deploy:#{t}"].clear
끝
레이크::과제[:d에플로이].완료
## 프로젝트 배포 작업
네임스페이스 :d eploy do
## 배포 시 공통 처리 함수 정의
def get_created_instances(info_type=nil)
# 새로운 전기화된 EC2 인스턴스의 정보 함수 조회 (기본적으로 인스턴스 ID를 반환함)
created_instances_list = "CREATED_INSTANCES"
target_instances = []
ec2 = AWS::EC2.new
AWS.memoize do
File.exist? ( File.expand_path("~") + "/#{created_instances_list}" )
created_instances = File.read(File.expand_path("~") + "/#{created_instances_list}").chomp
ci = created_instances.gsub(/(\[|\s|\])/, "").split(",")
만약 info_type == "private_ip_address" 이때는
target_instances = ec2.instances.select { |i| i.exists? && i.status == :running && ci.include?( i.id) }.map(&:p rivate_ip_address)
엘시프 info_type == "dns_name" 그러면
target_instances = ec2.instances.select { |i| i.exists? && i.status == :running && ci.include?( i.id) }.map(&:d ns_name)
그렇지 않으면
target_instances = ec2.instances.select { |i| i.exists? && i.status == :running && ci.include?( i.id) }.map(&:id)
끝
target_instances
그렇지 않으면
무승부
끝
끝
끝
def set_ssh_options(current_task="init")
# 배포할 클라이언트의 SSH 연결 정보를 설정하세요 (기본값은 첫 번째 접속만)
target_instances = get_created_instances("dns_name")
만약 current_task == "init" 이면,
key_file_path = fetch(:p rivate_key_local_path) + fetch(:p rivate_key_file)
ssh_user = fetch(:d ef_account)
역할 :first_time, target_instances
target_instances.each { |host|
서버 호스트, 사용자: ssh_user, 역할: %w{first_time}, ssh_options: { 키: key_file_path, forward_agent: true}
}
그렇지 않으면
key_file_path = File.expand_path("~")+"/.ssh/#{fetch(:user_account)}_rsa"
ssh_user = fetch(:user_account)
역할 :웹, target_instances
target_instances.each { |host|
서버 호스트, 사용자: ssh_user, 역할: %w{web}, ssh_options: { 키: key_file_path, forward_agent: false }
}
끝
끝
## 배치 임무
desc "각 가용성 존마다 EC2 인스턴스를 다르게 실행하세요."
과제 :create_instances 할 거야
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
info ": Instances launch start."
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 => false,
:instance_type => fetch(:ec2_instance_type),
:카운트 => 1,
:associate_public_ip_address => 맞아요
)
3번 자기 중 i.status == :p엔딩
i.tags["ModuleName"] = fetch(:module)
i.tags["EnviromentName"] = fetch(:env)
i.tags["Version"] = fetch(:version)
i.tags["Name"] = [ fetch(:module), fetch(:env), format("%02d", cnt+1) ].join("-")
created_instances < i.id
cnt += 1
end
execute "echo -n #{created_instances} > ~/CREATED_INSTANCES"
끝
끝
desc "새 인스턴스의 활성화 상태를 확인하세요."
작업 :체크 하기
run_locally 그래
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
return, status.include? ("초기화") ? false : true
끝
끝
시작
target_instances = get_created_instances("id")
raise ": 여전히 모든 인스턴스가 생성되지 않나요" target_instances.length < fetch(:instance_count)
if target_instances.length == fetch(:instance_count) then
# 全インスタンス起動後
chk_retry = 0
while !check_instance_status(target_instances) do
# インスタンスステータスが全てOKでない場合は15秒待つ(※30回リトライ)
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 >= 30
끝
정보 ": 모든 인스턴스를 배포할 준비가 완료됨."
끝
구조 => e
정보 E
퇴장
끝
끝
끝
설명: "새 인스턴스에서 초기 설정을 수행합니다."
작업 :init => :체크 Do
# SSH 옵션 설정
set_ssh_options("init")
run_locally 그래
# 공개키 인증을 위한 키 쌍 생성
target_dir = "~/.ssh"
if !test "[ -f #{target_dir}/#{fetch(:user_account)}_rsa ]"
if !test "[ -d #{target_dir} ]"
execute "mkdir -m 700 #{target_dir}"
끝
실행 "CD #{target_dir}; ssh-keygen -t rsa -N \"\" -f #{target_dir}/#{fetch(:user_account)}_rsa"
끝
Set :p Ublic_key_content, capture("cat #{target_dir}/#{fetch(:user_account)}_rsa.pub").chomp
Set :new_private_key_path, "#{target_dir}/#{fetch(:user_account)}_rsa"
끝
역할(:first_time) 에 대해
# 초기 설정 (사용자 생성 시 .ssh 컨테이너 자동 생성)
if!test "[ -d /etc/skel/.ssh/ ]"
실행 :sudo, "mkdir -m 700 /etc/skel/.ssh/; sudo 터치 /etc/skel/.ssh/authorized_keys; sudo chmod 600 /etc/skel/.ssh/authorized_keys"
끝
# 유지보수용 새 사용자 생성
is_user = capture(:sudo, "cut -d: -f1 /etc/passwd").chomp.gsub(/(\r\n)/, ",").split(",")
만약 !is_user.포함? (fetch(:user_account))
execute :sudo, "useradd -G wheel #{fetch(:user_account)}"
실행 :sudo, "echo \"#{fetch(:user_account)}:#{fetch(:user_password)}\" | sudo chpasswd"
끝
# 공개키 인증이 포함된 SSH 신규 사용자 권한 부여
auth_keys = "/home/#{fetch(:user_account)}/.ssh/authorized_keys"
만약 capture(:sudo, "cat #{auth_keys}").chomp != fetch(:p ublic_key_content)
실행 :sudo, "echo \"#{fetch(:p ublic_key_content)}\" | sudo tee #{auth_keys}"
끝
# 새 인스턴스의 호스트네임을 변경하세요
ec2 = AWS::EC2.new
AWS.memoize do
current_private_ip = capture(:sudo, "ifconfig | grep 'inet addr' | cut -d ':' -f 2 | awk 'NR==1 { print $1 }'").chomp
instance_ids = ec2.instances.select { |i| i.exists? && i.status == :running && i.private_ip_address == current_private_ip }.map(&:id)
host_basename = ec2.instances[instance_ids[0]].tags["Name"]
만약 capture(:sudo, "호스트명").chomp != host_basename.chomp 이면,
실행 :sudo, "echo \"#{host_basename}\" | sudo tee /proc/sys/kernel/hostname"
실행 :sudo, "sed -i 's/\\(^HOSTNAME=\\).*/\\1#{host_basename}/' /etc/sysconfig/network"
exe :sudo, "hostname #{host_basename}"
끝
끝
# 기본 사용자 "ec2-user"의 비밀번호를 설정하고 sudo 권한을 제거하세요
# 유지보수를 위해 신규 사용자에게 sudo 권한을 부여합니다
is_passwd = capture(:sudo, "cut -d: -f1,2 /etc/shadow").chomp.gsub(/(\r\n)/, ',').split(',')
만약 is_passwd.포함한다면? ("ec2-user:!!") 그럼
실행 :sudo, "echo \"ec2-user:#{fetch(:d ef_password)}\" | sudo chpasswd"
끝
exe :sudo, "sed -i s/ec2-user/#{fetch(:user_account)}/g /etc/sudoers.d/cloud-init"
정보 ": 작업 완료."
끝
끝
설명: "맛있는 패키지를 업데이트하세요."
작업 :update_packages =>:init do
# SSH 옵션 설정
set_ssh_options("update_packages")
On roles(:web) do
정보 ": yum 패키지 업데이트 중."
deploy_log = capture(:sudo, "yum -y 업데이트")
pkg_updated = deploy_log.each_line.to_a
정보 ": " + pkg_updated.first.strip
정보 ": " + pkg_updated.last.strip
정보 ": 배치 작업 완료."
#info deploy_log
끝
끝
이후에 :create_instances, :update_packages
desc "애플리케이션을 배포하세요."
작업 :메인 do
On roles(:web) do
# 정의되지 않음
끝
끝
끝
이번 배포에서는 생성된 EC2 인스턴스에 대한 특정 정보를 얻고 SSH 접근 정보를 설정하는 과정을 기능화했으며, 이는 서로 다른 작업에 공통적으로 적용됩니다. SSH 옵션 설정은 첫 번째 접근과 다음 접근 권한의 역할을 변경하여 설정합니다2. 또한, 'create_instances' 작업이 실행될 때 'update_packages' 작업까지 배포가 완전히 자동으로 실행되도록 작업 후 메서드를 사용하려고 시도했습니다.
마지막으로, EC2 인스턴스를 생성할 때 사용한 키 쌍의 개인 키 파일을 배포 사용자의 홈 디렉터리에 'SCP'로 업로드하세요. 이제 시작할 준비가 완료되었습니다.
이제 실제로 배포해 봅시다. 배포 작업을 시작할 때, 프로젝트를 설치한 경로로 실행합니다.
$ CD ~/CAP3-project
$ cap test deploy:create_instances
배치 결과 로그는 다음과 같습니다:
정보: 인스턴스 실행 시작.
정보: 인스턴스 실행 시작.
INFO[be335092] localhost에서 /usr/bin/env echo -n ["i-4dd6ec4b", "i-62ae0a7b"] > ~/CREATED_INSTANCES 실행 중
INFO[be335092] 0.003초 만에 종료, 출구 상태 0(성공).
정보: 인스턴스 준비: 상태 확인
정보: 인스턴스 준비: 상태 확인 (2번 재시도)
정보: 인스턴스 준비: 상태 확인 (3번 재시도)
정보: 인스턴스 준비 중: 상태 확인 (4번 재시도)
정보: 인스턴스 준비 중: 상태 확인 (5번 재시도)
정보: 인스턴스 준비: 상태 확인 (6번 재시도)
정보: 인스턴스 준비: 상태 확인 (7번 재시도)
정보: 인스턴스 준비: 상태 확인 (8번 재시도)
정보: 인스턴스 준비: 상태 확인 (9번 재시도)
정보: 인스턴스 준비: 상태 확인 (10번 재시도)
정보: 인스턴스 준비 중: 상태 확인 (11번 재시도)
정보: 인스턴스 준비: 상태 확인 (12번 재시도)
정보: 인스턴스 준비: 상태 확인 (13번 재시도)
정보: 인스턴스 준비: 상태 확인 (14번 재시도)
정보: 완료되어 모든 인스턴스를 배포할 준비가 완료되었습니다.
INFO[35b9f350] /usr/bin/env sudo mkdir -m 700 /etc/skel/.ssh/; sudo touch /etc/skel/.ssh/authorized_keys; sudo chmod 600 /etc/skel/.ssh/authorized_keys ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[35b9f350] 0.069초 만에 완주했고, 출구 상태 0(성공).
INFO[6443cc90] /usr/bin/env sudo useradd -G wheel deploy-user 실행 중 ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[6443cc90] 0.222초 만에 완주했고, 출구 상태 0(성공).
INFO[b74993eb] /usr/bin/env 실행 중 sudo echo "deploy-user:password" | sudo chpasswd on ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[b74993eb] 0.070초 만에 완주, 출구 상태 0(성공).
INFO[a3e11615] Running /usr/bin/env sudo echo "ssh-rsa AAAAB3NzaC1yc2EAAADAQABAAABAQDgQ31X0qXm/eHXZCIecjv57C66cZ4ikLdprDhHZs+KV5/vK0B+/47cZCXaT7UEHdI+Bm3jNTPJoRE8iPzpkWB9L5Ks13tB7yJ5DGEIbFRe8d3kTa6Uwrj1HpL+i8hSZ7Bzbc4JvF5YULj 97NfVAmpNvAqxF1mRWeuzcmevnsVNJ1nF6ePysNjiWmboepWl+MvIJ8xXLYPzrw8mO1kg7WEB0QxqGN5OsVZjjbmEMLliJ+xbOGfxI50FEa+k2445Y3nynBD9krx/1wayurEVn2t8jKWDn6XLSUJ41Ep43QkwFibwtcVBsfDSPIHVm6S3k9RzaAQWpN6qSrUiabk0yAOp deploy-user@devlab-deploy01" | ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com 에서 /home/deploy-user/.ssh/authorized_keys sudo tee
INFO[a3e11615] 0.035초 만에 종료, 출구 상태 0(성공).
INFO[d2f6241f] /usr/bin/env 실행 중 sudo echo "deploy-test-02" | sudo tee /proc/sys/kernel/hostname on ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[d2f6241f] 0.024초 만에 완주했고, 출구 상태 0(성공).
INFO[93fa8aa7] /usr/bin/env sudo sed -i 's/\(^HOSTNAME=\).*/\1deploy-test-02/' /etc/sysconfig/network ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[93fa8aa7] 0.021초에 완주했고, 출구 상태 0(성공).
INFO[bd5146d3] /usr/bin/env sudo hostname deploy-test-02를 ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com 에서 실행 중입니다
INFO[bd5146d3] 0.018초 만에 완주했고, 출구 상태 0(성공).
INFO[e8a45be7] /usr/bin/env 실행 중 sudo echo "ec2-user:PassWord" | sudo chpasswd에서 ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com
INFO[e8a45be7] 0.116초 만에 완주했고, 출구 상태 0(성공).
INFO[e6bbbbda] /usr/bin/env sudo sed -i s/ec2-user/deploy-user/g /etc/sudoers.d/cloud-init ec2-54-178-167-106.ap-northeast-1.compute.amazonaws.com 에서 실행 중입니다
INFO[e6bbbbda] 0.019초 만에 종료했고, 출구 상태 0(성공).
정보: 작업 완료.
INFO[e078eb47] /usr/bin/env sudo mkdir -m 700 /etc/skel/.ssh/를 실행 중; sudo touch /etc/skel/.ssh/authorized_keys; sudo chmod 600 /etc/skel/.ssh/authorized_keys ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[e078eb47] 0.065초 만에 종료, 출구 상태 0(성공).
INFO[ded515dc] /usr/bin/env sudo useradd -G wheel deploy-user 실행 중 ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[ded515dc] 0.323초 만에 종료, 출구 상태 0(성공).
INFO[8927f2f0] /usr/bin/env 실행 중 sudo echo "deploy-user:password" | sudo chpasswd on ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[8927f2f0] 0.069초에 완주했고, 출구 상태 0(성공).
INFO[51ed8060] Running /usr/bin/env sudo echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAABAQDgQ31X0qXm/eHXZCIecjv57C66cZ4ikLdprDhHZs+KV5/vK0B+/47cZCXaT7UEHdI+Bm3jNTPJoRE8iPzpkWB9L5Ks13tB7yJ5DGEIbFRe8d3kTa6Uwrj1HpL+i8hSZ7Bzbc4JvF5YULjj 97NfVAmpNvAqxF1mRWeuzcmevnsVNJ1nF6ePysNjiWmboepWl+MvIJ8xXLYPzrw8mO1kg7WEB0QxqGN5OsVZjjbmEMLliJ+xbOGfxI50FEa+k2445Y3nynBD9krx/1wayurEVn2t8jKWDn6XLSUJ41Ep43QkwFibwtcVBsfDSPIHVm6S3k9RzaAQWpN6qSrUiabk0yAOp deploy-user@devlab-deploy01" | ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com 에서 /home/deploy-user/.ssh/authorized_keys
INFO[51ed8060] 0.025초 만에 종료, 출구 상태 0(성공).
INFO[8c5dc231] 실행 중 /usr/bin/env sudo echo "deploy-test-01" | sudo tee /proc/sys/kernel/hostname on ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[8c5dc231] 0.018초에 완주했고, 출구 상태 0(성공).
INFO[5fc4603c] /usr/bin/env sudo sed -i 's/\(^HOSTNAME=\).*/\1deploy-test-01/' /etc/sysconfig/network에서 실행 중 ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[5fc4603c] 0.033초 만에 완주했고, 출구 상태 0(성공).
INFO[9cdfbb66] /usr/bin/env sudo hostname deploy-test-01을 ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com 에서 실행 중입니다
INFO[9cdfbb66] 0.015초 만에 종료, 출구 상태 0(성공).
INFO[DE94f658] /usr/bin/env 에코 실행 중 "ec2-user:PassWord" | sudo chpasswd on ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com
INFO[de94f658] 0.052초 만에 종료, 출구 상태 0(성공).
INFO[7ae1cd6c] /usr/bin/env sudo sed -i s/ec2-user/deploy-user/g /etc/sudoers.d/cloud-init ec2-54-178-145-90.ap-northeast-1.compute.amazonaws.com 에서 실행 중입니다
INFO[7ae1cd6c] 0.046초 만에 종료, 출구 상태 0(성공).
정보: 작업 완료.
정보: yum 패키지 업데이트 중입니다.
정보: yum 패키지 업데이트 중입니다.
정보: 로드된 플러그인: 우선순위, 업데이트-모트, 업그레이드-도움
정보: 완전!
정보: 배치 임무 완료.
정보: 로드된 플러그인: 우선순위, 업데이트-모트, 업그레이드-도움
정보: 완전!
정보: 배치 임무 완료.
배치 완료.
Capistrano3로 새로운 EC2 인스턴스를 배포한 후, 정기적으로 배포하지 않는다면 배포 서버 인스턴스를 중지하거나 AMI를 받아 종료하는 것이 더 좋습니다. 배포 서버는 배포에만 사용되므로, 이 인스턴스에 비용을 부담할 필요가 없습니다.
이것은 RVM을 통한 설치 예시입니다. Ruby와 Capistrano3를 설치하는 방법은 여러 가지가 있으니, 애플리케이션에 따라 변경해 주세요. ↩
역할을 변경하지 않고 SSH 옵션을 정의하면, 다른 사용자로서의 SSH 접근이 동일한 역할에 추가되므로, 두 번째 및 이후 SSH에서 더 이상 접근할 수 없는 첫 번째 SSH 정보가 유지되고, 불필요하게 SSH 연결을 만들어 작업이 멈추게 됩니다. ↩
만약 당신이 만든 EC2 인스턴스 실행 확인 작업 중 15초 동안 30개의 가중치× 상태 상태가 OK로 바뀌지 않으면, 해당 작업이 중단됩니다. 이 경우 'deploy:update_packages' 작업에서 재배포하여 다시 시도할 수 있습니다. ↩