詳細検索

Coisas para ter em mente ao implantar instâncias AWS EC2 no Capistrano

Avatar
por maeno
6 min de leitura

Coisas para ter em mente ao implantar instâncias AWS EC2 no Capistrano
Traduzido do 日本語 • Ver original

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.

スクリーンショット1スクリーンショット2

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


  1. 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.")

  2. 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.

  3. 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)

  4. 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.

  5. A configuração padrão é FALSE, então se você não colocar essa configuração, o PublicDNS não será ativado.

Related Articles