A instância EC2 recém-criada no arquivo de configuração de implantação anterior não tinha par de chaves, grupo de segurança, etc., então não consegui usar SSH a instância criada porque ela estava... 1orz
Depois disso, alterei várias configurações de implantação e consegui fazer login na instância EC2 que criei com SSH, então escrevi sobre o processo como um memorando. Bem, ao criar uma instância AWS EC2 no Capistrano... ou melhor, o que ter em mente ao criar uma instância EC2 com o "AWS SDK para Ruby"... Pode ser perto.
Primeiro, vamos dar uma olhada na parte da tarefa do lançamento da instância a partir do 'config/deploy.rb' anterior.
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 => busca(:ami_image_id),
:availability_zone => current_az,
:subnet => current_sn,
:instance_type => buscar(:ec2_instance_type),
:count => 1
)
durma 10 enquanto eu.status == :p anding
created_instances < i.id
cnt += 1
end
execute "echo -n #{created_instances} > ~/CREATED_INSTANCES"
fim
fim
Como apenas a AvailabilityZone e a Sub-net estão definidas para a instância a ser criada, ela ficará inacessível. No mínimo, é necessário configurar um grupo de segurança para garantir uma rota de acesso externa e definir um par de chaves para permitir que usuários autenticados façam login. Depois disso, acho que a configuração mínima é fazer o PublicIP (PublicDNS) alocado automaticamente para que o acesso possa ser feito pela Internet.
Vamos corrigir isso imediatamente. Primeiro, adicione o valor de conjunto necessário como variável.
# Nome do Par de Chaves a Importar
Set :key_pair_name, 'Mykeypair'
# ID de grupo de segurança a ser usado
Set :security_groups, [ 'SG-********', 'SG-********', 'SG-*****' ]
# ID do Núcleo
Set :kernel_id_name, 'Aki-*****'
Pares de chaves e grupos de segurança devem ser criados antecipadamente no console AWS. É uma forma rápida de usar o par de chaves e o grupo de segurança da instância onde o Capistrano está rodando como ambiente de implantação. Defina o ID do kernel conforme necessário. Não há problema mesmo que não haja um separado. Depois, altere a parte do método da classe ec2 da seguinte forma.
i = ec2.instances.create(
:image_id => buscar(:ami_image_id),
:block_device_mappings => [{
:d nome_de_evice_=> '/dev/sda1',
:ebs => {
:volume_size => 50,
:d elete_on_termination => verdadeiro
}
}],
:monitoring_enabled => falso,
:availability_zone => current_az,
:subnet => current_sn,
:key_name => buscar(:key_pair_name),
:security_group_ids => buscar(:security_groups),
:kernel_id => buscar(:kernel_id_name),
:d isable_api_termination => verdadeiro,
:instance_type => buscar(:ec2_instance_type),
:count => 1,
:associate_public_ip_address => verdade
)
As opções de método recém-adicionadas são as seguintes:
- ':block_device_mappings' Esta é a configuração EBS (ELASTIC BLOCK STORE). Se você precisar adicionar mais à capacidade fixa de armazenamento da instância, adicione-a. Neste exemplo, estamos adicionando um volume de armazenamento de 50 GB.
- ':monitoring_enabled' para começar a monitorar o CloudWatch após o lançamento da instância.
- ':key_name' ... Esta é uma configuração obrigatória. Especifique o nome do par de chaves3. Aqui estamos chamando a variável que definimos anteriormente.
- ':security_group_ids' é uma configuração obrigatória. Descreva os IDs dos grupos de segurança que já foram definidos em um formato de array4. Aqui estamos chamando as variáveis que definimos anteriormente.
- ':kernel_id' Especifica ao usar um ID de kernel. Se você tentar criar múltiplas instâncias a partir de uma AMI habilitada para HMV com o mesmo ID de kernel, receberá um erro, então não especifique nesse caso.
- Defina o ':d isable_api_termination' para TRUE se quiser permitir que a instância seja encerrada usando a API EC2.
- ':associate_public_ip_address' é uma configuração importante. Se você quiser que a instância criada seja automaticamente atribuída a um endereço PublicIP, defina para TRUE5.
Agora, com as configurações de implantação modificadas, vamos executar a tarefa de lançamento da instância.
Lançamento de teste de $cap
INFO[6866d5d4] Rodando /usr/bin/env echo -n ["i-70f0cf76", "i-f718c1ee"] > ~/CREATED_INSTANCES no localhost
DEBUG[6866d5d4] Comando: echo -n ["i-70f0cf76", "i-f718c1ee"] > ~/CREATED_INSTANCES
INFO[6866d5d4] Terminou em 0,034 segundos com status de saída 0 (bem-sucedido).
- Aliás, se você quiser depurar tarefas do Capistrano, é útil lembrar que, se você executar a tarefa com a opção 'cap test launch debug' ou 'cap test launch --trace', ela rastreará o processamento em detalhes.
Confira no AWS Management Console.


O par de chaves, o grupo de segurança e o PublicIP foram lançados conforme as instâncias EC2 esperadas. Agora, vamos verificar se o SSH é possível a partir do console.
$ ssh padrão-user@176.34.61.218
A autenticidade do host '176.34.61.218 (176.34.61.218)' não pode ser comprovada.
A impressão digital da chave RSA é **:****:**:**:****.******************
Você tem certeza de que quer continuar se conectando (sim/não)? sim
Aviso: Adicionado permanentemente '176.34.61.218' (RSA) à lista de hosts conhecidos.
Senha do padrão-user@176.34.61.218:
Último login: Ter 20 de maio 06:47:06 de **2014 de ****. ******. ******. *****.ne.jp
[default-user@ip-176-34-61-218 ~]$
Eu coloquei isso. No entanto, neste exemplo, consegui fazer login facilmente porque criei uma instância a partir de uma AMI que já havia criado um usuário chamado "default-user" que pode ser acessado por SSH antecipadamente, mas se eu criasse uma instância a partir de uma AMI oficial da AWS, como no exemplo anterior, isso levaria outra hora. Agora, vamos modificar a tarefa de criar uma instância em "t2.micro" usando a AMI oficial "Amazon Linux AMI 2014.03.2 (HVM)". Elimine as configurações de EBS e as especificações do ID do kernel que causam erros ao iniciar uma instância de uma AMI compatível com HVM.
i = ec2.instances.create(
:image_id => 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
)
Agora, vamos lá.
Lançamento de teste de $cap
INFO[520beb79] Rodando /usr/bin/env echo -n ["i-abd4ebad", "i-580fd641"] > ~/CREATED_INSTANCES no localhost
DEBUG[520beb79] Comando: echo -n ["i-abd4ebad", "i-580fd641"] > ~/CREATED_INSTANCES
INFO[520beb79] Terminou em 0,035 segundos com status de saída 0 (bem-sucedido).
Após verificar o PrivertIP a partir do ID da instância criado no AWS Management Console, SSH com o usuário padrão "ec2-user" da Amazon Linux AMI do console.
$ SSH EC2-user@176.34.61.153
A autenticidade do host '176.34.61.153 (176.34.61.153)' 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.153' (ECDSA) à lista de hosts conhecidos.
Permissão negada (chave pública).
Claro, embora eu tenha conseguido conectar, não consegui acessá-lo devido à autenticação de chave pública. Você não pode se conectar sem anexar a chave privada com a opção 'ssh -i' e autenticá-la. Em outras palavras, para realizar a próxima tarefa no Capistrano para a instância criada, você precisa preparar a chave privada para ser usada para a criação da instância no servidor de implantação que roda o Capistrano com antecedência. Depois, o primeiro SSH para a nova instância deve ser fazer login usando a chave privada. Por enquanto, esta seção termina aqui. Na próxima vez, como tarefa imediatamente após o lançamento da instância, vou resumir os passos para SSH na nova instância via Capistrano.
Sites de Referência
A documentação do SDK indica uma nota (doravante ":key_name (String) — O nome do par de chaves a ser usado. Nota: Lançar imagens públicas sem um ID de par de chaves as deixará inacessíveis.") ↩
Se você usar volumes EBS, AMIs compatíveis com HVM não estarão mais disponíveis. Portanto, é necessário alterar o tipo de instância a ser criado para "t1.micro" em vez de "t2.micro", que é dedicado ao HMV. ↩
Não testei esse comportamento, mas parece que você pode importar pares de chaves. Nesse caso, o texto ficaria como ':key_pair => ec2.key_pairs.import(fetch(:key_pair_name), File.read('~/.ssh/identity.pub')),'? (não verificado) ↩
Se você não especificar um grupo de segurança, apenas o grupo padrão é definido e só pode ser acessado a partir da mesma rede VPC. ↩
A configuração padrão é FALSE, então se você não colocar essa configuração, o PublicDNS não será ativado. ↩