ElasticBeanstalk `eb setenv` - перезапуск приложения - PullRequest
0 голосов
/ 03 июля 2018

При запуске eb setenv не удается запустить ловушки в .ebextensions. В моих .ebextensions я удаляю конфигурацию nginx по умолчанию и заменяю ее новой конфигурацией. Крайне важно, чтобы этот хук запускался при каждом запуске приложения, чтобы nginx не падал. Вот мой файл .ebextensions / proxy.config (я тоже прикрепил его).

Когда я загружаю заархивированное приложение, перехваты запускаются как ожидалось. Только при перезапуске приложения через eb api файл /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf снова появляется

Пожалуйста, дайте мне знать, если я делаю что-то не так или это ограничение ElasticBeanstalk.

files:
  /etc/nginx/conf.d/proxy.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      upstream nodejs {
        server 127.0.0.1:8081;
        keepalive 256;
      }

      server {
        listen 8080;

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
          set $year $1;
          set $month $2;
          set $day $3;
          set $hour $4;
        }

        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
        access_log  /var/log/nginx/access.log  main;

        location ~* ^/(api) {
          proxy_pass  http://nodejs;
          proxy_set_header   Connection "";
          proxy_http_version 1.1;
          proxy_set_header        Host            $host;
          proxy_set_header        X-Real-IP       $remote_addr;
          proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        gzip on;
        gzip_min_length 10240;
        gzip_comp_level 4;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location / {
          alias /var/app/current/public/;
          try_files $uri /index.html;
        }
      }

  /opt/elasticbeanstalk/hooks/appdeploy/post/97_kill_default_nginx.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      set -x
      rm -f /tmp/deployment/config/#etc#nginx#conf.d#* /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      initctl stop nginx || true
      initctl start nginx

Ответы [ 2 ]

0 голосов
/ 04 августа 2018

Это интересный подход. Я следовал примеру, опубликованному Amazon здесь: Пример AWS , в котором предлагалось использовать команды контейнера.

container_commands:
removeconfig:
    command: "rm -f /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf"

Однако при обновлении заархивированного файла (я думаю, тот же подход, что и у вас), обновление конфига всегда зависало.

Мне пришлось следовать подходу, описанному в этом ответе, чтобы заставить его работать с командами контейнера: Справка сценария перезапуска stackoverflow

Мой обработчик postcongif теперь выглядит так (и я использую команду контейнера):

  /opt/elasticbeanstalk/hooks/configdeploy/post/99_kill_default_nginx.sh:
 owner: root
 group: root
 mode: "000755"
 content: |
   #!/bin/bash -xe
   set -x
   echo "starting post config script"
   status=`/sbin/status nginx`
   if [[ -e "/etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf" ]];
    then
      echo "default config file exists - we should delete it"; fi
      rm -f /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      echo "restart nginx after deletion"
      if [[ $status = *"start/running"* ]]; then
        echo "stopping nginx..."
        stop nginx
        echo "starting nginx..."
        start nginx
      else
        echo "nginx is not running... starting it..."
        start nginx
      fi
    else
      echo "no default config file exists - no need to delete it"
    fi
0 голосов
/ 03 июля 2018

Я в конечном итоге перечитал Документы по платформам гораздо ближе и нашел разницу между appdeploy и configdeploy

appdeploy - сценарии запускаются во время развертывания приложения. Elastic Beanstalk выполняет развертывание приложения при запуске новых экземпляров и когда клиент инициирует развертывание новой версии.

configdeploy - сценарии запускаются, когда клиент выполняет обновление конфигурации, которое влияет на конфигурацию программного обеспечения, например, путем установки свойств среды или включения ротации журналов в Amazon S3.

После прочтения этих описаний мне стало ясно, что мне нужно переместить изменить свой файл proxy.config, чтобы /opt/elasticbeanstalk/hooks/appdeploy/post/97_kill_default_nginx.sh стал /opt/elasticbeanstalk/hooks/configdeploy/post/97_kill_default_nginx.sh. Чтобы быть в безопасности и убедиться, что этот сценарий выполняется как при запуске новой версии приложения, так и при обновлении переменной env, я скопировал / вставил его для ОБА appdeploy и configdeploy. Итак, финал proxy.config выглядит как

files:
  /etc/nginx/conf.d/proxy.conf:
    mode: "000644"
    owner: root
    group: root
    content: |
      upstream nodejs {
        server 127.0.0.1:8081;
        keepalive 256;
      }

      server {
        listen 8080;

        if ($time_iso8601 ~ "^(\d{4})-(\d{2})-(\d{2})T(\d{2})") {
          set $year $1;
          set $month $2;
          set $day $3;
          set $hour $4;
        }

        access_log /var/log/nginx/healthd/application.log.$year-$month-$day-$hour healthd;
        access_log  /var/log/nginx/access.log  main;

        location ~* ^/(api) {
          proxy_pass  http://nodejs;
          proxy_set_header   Connection "";
          proxy_http_version 1.1;
          proxy_set_header        Host            $host;
          proxy_set_header        X-Real-IP       $remote_addr;
          proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        gzip on;
        gzip_min_length 10240;
        gzip_comp_level 4;
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        location / {
          alias /var/app/current/public/;
          try_files $uri /index.html;
        }
      }

  /opt/elasticbeanstalk/hooks/appdeploy/post/97_kill_default_nginx.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      set -x
      rm -f /tmp/deployment/config/#etc#nginx#conf.d#* /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      initctl stop nginx || true
      initctl start nginx

  /opt/elasticbeanstalk/hooks/configdeploy/post/97_kill_default_nginx.sh:
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      set -x
      rm -f /tmp/deployment/config/#etc#nginx#conf.d#* /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf
      initctl stop nginx || true
      initctl start nginx

Хорошим способом отладки этого (и любых скриптов хука в этом отношении) было бы ssh на EC2, управляемый beanstalk, и создать файл touch /etc/nginx/conf.d/00_elastic_beanstalk_proxy.conf. Затем в отдельном окне терминала запустите eb setenv (или любую другую команду для перезапуска приложения). Затем в окне ssh'd после завершения команды eb setenv проверьте, что файл был удален ls -l /etc/nginx/conf.d

...