Continuando da última vez, vamos fazer um SSH na recém-criada instância EC2 em Capistrano.
Primeiro, como preparação preliminar, a AWS cria um par de chaves para a nova instância. Você pode criar um par de chaves do menu "EC2" no Console de Gerenciamento AWS até o menu "Pares de Chaves" na categoria "REDE & SEGURANÇA", então por favor crie-o conforme necessário. No exemplo desta seção, usaremos o par de chaves usado pela instância de implantação onde o Capistrano está executando o "deploy-test".

Depois, faça upload do arquivo de chave privada do par de chaves que você deseja usar (o arquivo 'deploy-test.pem' neste exemplo) para o diretório inicial do usuário que irá implantar o ambiente de implantação rodando Capistrano ('/home/deploy-user/' neste exemplo)1. A chave privada enviada deve receber as permissões de leitura apropriadas, então mude as permissões do arquivo.
$ CD ~
$ chmod 600 deploy-test.pem
$ ls -l *.pem
-rw------- 1 deploy-user deploy-user 1692 Jul 2 10:18 deploy-test.pem
O arquivo de configuração de implantação 'config/deploy.rb' foi modificado da seguinte forma.
# configuração válida apenas para Capistrano 3.1
Trava '3.2.1'
# Carregando o AWS SDK para Ruby
Exigir 'AWS-SDK'
# Configurando para o AWS SDK
AWS.config({
:access_key_id => '<AWS access="" key="" id="">',
:secret_access_key => '<AWS secret="" access="" key="">',
:região => 'ap-nordeste-1',
})
# SOU image_id
# Amazon Linux AMI 2014.03.2 (HVM)
Set: ami_image_id, 'ami-29dc9228'
# Número de Instâncias a Criar
Conjunto :instance_count, 2
# Tipo de Instância a Criar
Set :ec2_instance_type, 'T2.Micro'
# Criar Zonas de Disponibilidade
Conjunto :availability_zones, [ 'AP-Nordeste-1A', 'AP-Nordeste-1C' ]
# Crie subnet_id (se necessário)
Set :subnet_ids, [ 'Subnet-********', 'Sub-net-********' ]
# Nome do Par de Chaves a Usar
Definir :key_pair_name, 'Deploy-Test'
# Arquivo de Chave Privada
definir :p rivert_key_file, 'deploy-test.pem'
# ID de grupo de segurança a ser usado
Set :security_groups, [ 'SG-********', 'SG-********', 'SG-********', 'SG-********' ]
# Exclua tarefas padrão do Capistrano
framework_tasks = [:começando, :começando, :atualizando, :atualizado, :p ublishing, :p ublished, :finalizando, :terminando]
framework_tasks.cada do |t|
Rake::Task["deploy:#{t}"].limpar
fim
Ancinho::Tarefa[:d eploy].limpar
desc 'Iniciar uma instância EC2 para cada zona de disponibilidade diferente'
Tarefa: lançar fazer
run_locally
ec2 = AWS::EC2.new
created_instances = []
Cnt = 0
enquanto não < 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 => pode buscar (:ami_image_id),
:monitoring_enabled => falso,
:availability_zone => current_az,
:subnet => current_sn,
:key_name => buscar(:key_pair_name),
:security_group_ids => buscar(:security_groups),
:d isable_api_termination => verdadeiro,
:instance_type => buscar(:ec2_instance_type),
:count => 1,
:associate_public_ip_address => verdade
)
durma 10 enquanto eu.status == :p anding
created_instances < i.id
cnt += 1
end
execute "echo -n #{created_instances} > ~/CREATED_INSTANCES"
fim
fim
Agora, vamos executar a tarefa de lançamento da instância.
Lançamento de teste de $cap
INFO[3c926533] Rodando /usr/bin/env echo -n ["i-1c0c351a", "i-cfd209d6"] > ~/CREATED_INSTANCES no localhost
DEBUG[3c926533] Comando: echo -n ["i-1c0c351a", "i-cfd209d6"] > ~/CREATED_INSTANCES
INFO[3c926533] Terminou em 0,036 segundos com status de saída 0 (bem-sucedido).
Depois de confirmar o lançamento da instância criada no AWS Management Console, tente SSH com o ec2-user na linha de comando.
$ ssh -i ~/deploy-test.pem ec2-user@176.34.61.235
A autenticidade do host '176.34.61.235 (176.34.61.235)' não pode ser comprovada.
A impressão digital da chave ECDSA é **:****:********:****.**************
Você tem certeza de que quer continuar se conectando (sim/não)? sim
Aviso: Adicionado permanentemente '176.34.61.235' (ECDSA) à lista de hosts conhecidos.
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2014.03-release-notes/
8 pacotes(s) necessário(s) para segurança, de um total de 18 disponíveis
Execute o "sudo yum update" para aplicar todas as atualizações.
Eu consegui em segurança.
Vamos adicionar uma tarefa complementar para acessar por SSH a instância recém-criada do EC2 no Capistrano.
desc 'Verifique o status de ativação das novas instâncias'
tarefa :verificar fazer
created_instances_list = 'CREATED_INSTANCES'
run_locally
ec2 = AWS::EC2.new
início
If testar "[ -f ~/#{created_instances_list} ]"
created_instances = capture("cd ~; cat #{created_instances_list}").chomp
ci = created_instances.gsub(/(\[|\s|\])/, '').split(',')
target_instances = ec2.instances.select { |i| i.exists? && i.status == :executando && ci.include?( i.id) }.map(&:p rivate_ip_address) #dns_name
se target_instances.comprimento == 0 então
raise "Nenhuma instância criada"
fim
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 }
}
fim
resgate => e
info e
Saída
fim
fim
fim
tarefa :init => :check fazer
Sobre papéis(:web) fazer
access_log = capturar "nome do hospedeiro"
Informações access_log
fim
fim
Na tarefa "init" recém-criada, a tarefa "check" é executada primeiro para verificar se a instância criada foi lançada. Na tarefa "check", o endereço IP privado é obtido a partir do ID de instância recém-criado e as informações do SSH são definidas como o servidor a ser acessado com a função "WEB, APP". Neste momento, o usuário é configurado para fazer login com uma chave privada para acesso pelo usuário inicial do Amazon Linux "ec2-user". Se você não definir 'forward_agent' para TRUE, o acesso será interrompido durante a interação do console no primeiro SSH. Se a tarefa "check" estiver OK, a tarefa "init" será executada automaticamente. Nessa tarefa, o nome de host de cada servidor em que você fez login com o comando 'hostname' é impresso e finalizado. Agora, vamos realmente executar a tarefa "init".
Teste de $cap init
DEBUG[8c9dcda9] Rodando /usr/bin/env [ -f ~/CREATED_INSTANCES ] no localhost
DEBUG[8c9dcda9] Comando: [ -f ~/CREATED_INSTANCES ]
DEBUG[8c9dcda9] Finalizado em 0,003 segundos com status de saída 0 (bem-sucedido).
DEBUG[c1473094] Rodando /usr/bin/env cd ~; cat CREATED_INSTANCES no localhost
DEBUG[c1473094] Comando: cd ~; cat CREATED_INSTANCES
DEPURAÇÃO[c1473094] [i-1c0c351a, i-cfd209d6]
DEBUG[c1473094] Finalizado em 0,002 segundos com status de saída 0 (bem-sucedido).
DEBUG[1fe95f86] Rodando o nome de host /usr/bin/env em 176.34.62.57
DEBUG[1fe95f86] Comando: /usr/bin/env nome do host
DEBUG[7d485d1a] Rodando o nome de host /usr/bin/env em 176.34.61.235
DEBUG[7d485d1a] Comando: /usr/bin/env nome do host
DEBUG[7d485d1a] Finalizado em 0,131 segundos com status de saída 0 (bem-sucedido).
DEBUG[7d485d1a] ip-176-34-61-235
DEBUG[7d485d1a] Finalizado em 0,131 segundos com status de saída 0 (bem-sucedido).
INFOip-176-34-61-235
DEBUG[1fe95f86] Terminou em 0,145 segundos com status de saída 0 (bem-sucedido).
DEBUG[1fe95f86] ip-176-34-62-57
DEBUG[1fe95f86] Terminou em 0,145 segundos com status de saída 0 (bem-sucedido).
INFOip-176-34-62-57
Consegui fazer SSH com sucesso na nova instância que criei com o Capistnrano. Tudo o que você precisa fazer é adicionar as configurações de implantação de cada instância à tarefa.
Da próxima vez, vou tentar configurar uma tarefa no Capistrano para criar um usuário diferente do ec2-user para a instância recém-criada e permitir o acesso SSH com esse usuário, enquanto defino uma senha para o usuário padrão ec2 e restrições ao acesso SSH pelo usuário padrão. Como é perigoso para a segurança poder acessar instâncias EC2 com usuários ec2 fortemente privilegiados para sempre, criar uma conta de manutenção na instância criada será como a configuração inicial da implantação do EC2.
- Na AWS, você pode baixar a chave privada de um par de chaves apenas uma vez ao criar um par de chaves, e não pode obter o arquivo da chave privada de outra forma, então é preciso ter cuidado ao manusear a chave privada. ↩