詳細検索

Lançando instâncias EC2 para diferentes AvilabilityZones em Capistrano

Avatar
por maeno
5 min de leitura

Lançando instâncias EC2 para diferentes AvilabilityZones em Capistrano
Traduzido do 日本語 • Ver original

Da última vez,

Da próxima vez, vou tentar criar um banco de dados e inserir a configuração inicial como uma tarefa de última hora, reescrever o arquivo de configuração do WordPress e baixar o tema do WordPress do GitHub.

No entanto, por conveniência, usei o Capistrano3 para criar uma instância AWS EC2, então gostaria de deixar as dicas. Desta vez, usei a AMI oficial das instâncias EC2 para implantação para configurar instâncias EC2 em cada área com diferentes AvailabilityZones. Como piloto, usarei o "Amazon Linux AMI 2014.03.2 (HVM)" que suporta o tipo de instância mais recente "t2.micro" para configurar um total de 4 instâncias ao mesmo tempo, duas em cada uma das AvailabilityZones da Região 1a e 1c de Tóquio.

  • Como preparação preliminar, você precisa configurar as configurações mínimas necessárias para criar instâncias EC2, como VPCs e Sub-nets, na conta AWS onde deseja configurar a instância. Em particular, como desta vez você vai configurar instâncias em diferentes AvailabilityZones, precisa configurar sub-redes em cada zona.

Agora, vamos começar com o procedimento de implantação. Primeiro, edite 'config/deploy/test.rb' para configurar o ambiente de implantação (servidor). Desta vez, a instância EC2 criada dinamicamente será o ambiente de implantação, então você não pode configurar o servidor antecipadamente. Isso porque novas instâncias lançadas na AWS não têm um ElasticIP, então o PublicIP é diferente a cada vez e a URL do endpoint muda dinamicamente. Portanto, desta vez, após o lançamento da instância, configuraremos o servidor alvo na tarefa Capistorano. A configuração inicial do servidor não existe mais, então vou comentar a descrição. Além disso, apenas a opção SSH será usada em comum no final, então vou deixar isso (embora não a use nesta tarefa de implantação...).

$ vim config/deploy/test.rb
#role :app, %w{deploy@localhost}
#role :web, %w{deploy@localhost}
#role :d b, %w{deploy@localhost}

Set :ssh_options, { 
  chaves: %w(/home/deploy/.ssh/id_rsa), 
  forward_agent: verdade, 
}

Nesta implantação, usaremos o "AWS SDK for Ruby", então instalaremos o SDK com antecedência.

$ Sudo Gem instalar AWS-SDK

Em seguida, defina o conteúdo de implantação em 'config/deploy.rb'.

$ vim config/deploy.rb
# 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="">',  
  :region=> 'ap-northeast-1', # a região onde a Instância EC2 é criada
})

# SOU image_id
# Amazon Linux AMI 2014.03.2 (HVM)
Set: ami_image_id, 'ami-29dc9228' 

# Número de Instâncias a Criar
Set :instance_count, 4

# 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' ]

# Criado subnet_id
Set :subnet_ids, [ 'Subnet-********', 'Subnet-********' ]

# 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),  
        :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

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)
        se target_instances.comprimento == 0 então
          raise "Nenhuma instância criada" 
        fim
        target_instances.each { |var| 
          Server var, User: 'EC2-User', Roles: %W{Web App}
        }
      fim
    resgate => e
      info e
      Saída
    fim

  fim
fim

Tarefa :d Eploy => :check Do
  run_locally

    InfoFunções(:todos)
    info 'Próxima tarefa de implantação em novas instâncias' 

    # Início de implantação

  fim
fim

De fato, lance a instância.

Lançamento de teste de $cap
INFO[10af60ae] Rodando /usr/bin/env eco -n ["i-7497be72", "i-01c31718", "i-4d94bd4b", "i-00c31719"] > ~/CREATED_INSTANCES no localhost
DEBUG[10af60ae] Comando: echo -n ["i-7497be72", "i-01c31718", "i-4d94bd4b", "i-00c31719"] > ~/CREATED_INSTANCES
INFO[10af60ae] Finalizou em 0,003 segundos com status de saída 0 (bem-sucedido). 

O log acima é a saída, e o lançamento da instância parece ter sido concluído, então confira no console de gerenciamento da AWS.

AWSのマネージメント・コンソールで新規インスタンスを確認

É verdade que quatro instâncias foram lançadas alternadamente em diferentes AvailabilityZones. Esse é um movimento ideal. Como o tempo de lançamento das instâncias AWS varia dependendo do ambiente, a tarefa de "lançamento" acima é encerrada sem verificar o status de lançamento da instância EC2. No entanto, se isso continuar, as informações da instância não poderão ser transferidas quando a próxima tarefa do Capistorano for lançada, então o ID da instância lançada na tarefa "launch" é escrito em um arquivo chamado "CREATED_INSTANCES" e terminado. Na próxima tarefa, pego o ID da instância escrito em "CREATED_INSTANCES", verifico o status de inicialização da instância e, se o status for ":running", tento defini-la como o servidor a ser implantado. Além disso, a tarefa "verificar" pega o endereço IP privado da nova instância com o status ":running" e o usa como nome de host do servidor de destino, mas se a nova instância receber um endereço IP público e o DNS público estiver configurado, não há problema em subtrair isso como '{}.map(&:d ns_name)'.

Tente executar as tarefas de acompanhamento.

$ Cap Teste de Implantação
DEBUG[79c503fb] Rodando /usr/bin/env [ -f ~/CREATED_INSTANCES ] no localhost
DEBUG[79c503fb] Comando: [ -f ~/CREATED_INSTANCES ]
DEBUG[79c503fb] Finalizado em 0,003 segundos com status de saída 0 (bem-sucedido). 
DEBUG[9dd1f93d] Rodando /usr/bin/env cd ~; cat CREATED_INSTANCES no localhost
DEBUG[9dd1f93d] Comando: cd ~; cat CREATED_INSTANCES
DEPURAR[9dd1f93d] [i-7497BE72, I-01C31718, I-4d94BD4B, I-00C31719]
DEBUG[9dd1f93d] Finalizado em 0,002 segundos com status de saída 0 (bem-sucedido). 
INFORMAÇÕES[#<Capistrano::Configuration::Server:0x0000000189a7c8 @user="ec2-user", @hostname="176.34.61.80", @port=nil, @properties=#<Capistrano::Configuration::Server::Properties:0x00000001899238 @properties={}, @roles=#<Set: {:web,="" :app}="">>>, #<Capistrano::Configuration::Server:0x000000018a3a08 @user="ec2-user", @hostname="176.34.62.168", @port=nil, @properties=#<Capistrano::Configuration::Server::Properties:0x000000018a3080 @properties={}, @roles=#<Set: {:web,="" :app}="">>>, #<Capistrano::Configuration::Server:0x000000018a0d58 @user="ec2-user", @hostname="176.34.62.75", @port=nil, @properties=#<Capistrano::Configuration::Server::Properties:0x000000018a6910 @properties={}, @roles=#<Set: {:web,="" :app}="">>>, #<Capistrano::Configuration::Server:0x000000018a8ee0 @user="ec2-user", @hostname="176.34.61.75", @port=nil, @properties=#<Capistrano::Configuration::Server::Properties:0x000000018b3818 @properties={}, @roles=#<Set: {:web,="" :app}="">>>]
Tarefa INFONext de implantar em novas instâncias

As informações da instância criadas na tarefa anterior foram herdadas e definidas com sucesso como servidor a ser implantado. Na próxima tarefa (neste caso, a tarefa de "deploy"), se você instalar Apache, PHP ou MySQL para cada nova instância, poderá se conectar à implantação anterior do WordPress.

No final, você pode criar um ambiente de implantação sonhador que permite criar um servidor e implantar o WordPress de uma vez só digitando comandos Capistrano 2~3 vezes.

Sites de Referência

Related Articles