詳細検索

Coloque as tarefas do Capistrano em modo de suspensão até que a nova instância EC2 seja totalmente lançada

Avatar
por maeno
3 min de leitura

Coloque as tarefas do Capistrano em modo de suspensão até que a nova instância EC2 seja totalmente lançada
Traduzido do 日本語 • Ver original

Se você executar uma tarefa para acessar por SSH uma instância EC2 recém-criada no Capistrano que não está totalmente iniciada, ela receberá um erro em algum lugar e a tarefa não será concluída. Portanto, criamos uma tarefa que verifica o status de inicialização da instância EC2 a ser implantada e, se não for totalmente iniciada, ela irá entrar em suspensão e esperar o início.

Existem três informações de status para as instâncias AWS EC2 e, se você não verificar todos esses status, não pode dizer que a instância está totalmente ativa (veja a figura abaixo).

AWSマネージメントコンソールで確認できるEC2インスタンスステータス

Para verificar se uma instância foi iniciada, é aceitável determinar se o "Estado da Instância" no AWS Management Console está 'rodando', mas para verificar se a instância pode realmente ser conectada por SSH, é necessário verificar se ambos os status (STATUS da INSTÂNCIA e acessibilidade do SYSTEMSTATUS) estão 'passados', conforme mostrado na coluna "Verificações de Status" como "2/2 verificações". Normalmente, quando uma instância é iniciada, o "Estado da Instância" fica 'executando' em alguns segundos a dez segundos, mas as "Verificações de Status" são inicializadas por alguns minutos. Se ambos os status não forem 'passados', o acesso ao SSH será utilizado.

Na tarefa de 'verificação' que usei até agora, apenas um status, 'Estado da Instância', foi verificado, então a tarefa subsequente foi interrompida pelo acesso ao SSH. A tarefa para evitar isso é a tarefa de 'verificação' desta vez.

tarefa :verificar fazer
  run_locally
    created_instances_list = 'CREATED_INSTANCES' 

    def check_instance_status(instance_ids=[]) 
      ec2 = AWS::EC2.new
      AWS.memoize faz
        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 }
        status = sys_status + ins_status
        status de retorno. incluir? ('inicializando')? falso : verdadeiro
      fim
    fim

    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(&:id)
          raise "Ainda não é criada todas as instâncias" se target_instances.comprimento < fetch(:instance_count)
          if target_instances.length == fetch(:instance_count) then
            # 全インスタンス起動(Instance Stateがrunning)
            chk_retry = 0

            while !check_instance_status(target_instances) do
              # インスタンスステータスが全てOKでない場合は15秒待つ(※20回までリトライする)
              info "In preparation of the instance: Status check " + (chk_retry > 0 ? "(retentar #{chk_retry + 1} vezes)" : "")
              Sono 15
              se check_instance_status(target_instances) então
                Intervalo
              fim
              chk_retry += 1
              raise "A instância ainda não está pronta. Por favor, execute a tarefa novamente após esperar um pouco." se chk_retry >= 20
            fim

            # Este é o processo após todas as instâncias serem totalmente iniciadas (primeira configuração de conexão SSH)
            target_instance_private_ips = ec2.instances.select { |i| i.exists? && i.status == :executando && ci.include?( i.id) }.map(&:p endereço_ip_rivate)
            pkfn = fetch(:p rivate_key_file)
            target_instance_private_ips.each { |var| 
              Server var, User: 'EC2-User', Roles: %W{Web App}, ssh_options: { Keys: %W(/home/deploy-user/#{pkfn}), forward_agent: true }
            }
          fim
        fim
      resgate => e
        info e
        Saída
      fim
  fim

  # Tarefa de acompanhamento de exemplo (SSH para exibir o nome do host)
  Sobre papéis(:web) fazer
    Captura de Informação "Nome do Host" 
  fim
fim

A partir das configurações acima, a tarefa com a parte de exemplo da tarefa de acompanhamento removida é inserida logo antes da tarefa de implantação após a criação da instância EC2 no Capistrano.

Site de referência

Related Articles