ELBをCLB(Classic Load Balancer)からNLB(Network Load Balancer)にオンラインで変更した時のメモ


対応にあたる経緯

CLBを利用している場合、定期的にCLBのエンドポイントから名前解決されるIPアドレスが変わってしまい、VPN経由でアクセスをしている場合に、
毎回VPNの経路申請をして変えてもらう必要があったため、IPアドレスが変わらないようにしたいということで対応にあたった

対応手順

  1. 本番プロキシサーバのAMIを取得し、それよりNLB用にプロキシサーバ起動
    1. Multi-AZで動作していて欲しいので、2台起動
  2. 起動後、これまでのプロキシサーバはSSL TerminationしていないHTTP(80)でリクエストを受けていたので、 /etc/nginx/conf.d/XXXX.conf を作成して、下記の‌nginxの設定‌に記載したように設定してnginx再起動
    1. nlb.XXXX.jpはテスト用でドメインつけて動作テストしました。
  3. NLBを作成します。
    1. ここで紐づけるAZとサブネット、Elastic IPを確認します
      1. サブネットはGIPを持たせるため、Public Subnetである必要あり
      2. AZは1つでも複数でも可能でしたが、一度作成すると変更できないので、再作成が必要になるようでした
  4. TCP:443(HTTPS)でリスナー作成。
  5. リスナーの転送先のターゲットグループを作成。
    1. ここで、NLBにぶらさげるインスタンスを選択してもらいます。
    2. ※注意点は「対応してるインスタンスタイプが少ない」ので、インフラ費用が上がるのは覚悟しましょう (今回は c3.large を選択しました。)
    3. ヘルスチェックはTCPで行われます。
      1. ポートは「ターゲットグループで選択したポート」か「上書き」ができるようです。
      2. 正常と非正常の閾値、タイムアウトとチェック間隔を設定してください。
    4. ※注意点1:NLBにはセキュリティグループがありません。そのため、ぶらさげたEC2のセキュリティグループでアクセス制限をします。
    5. ※注意点2:NLBからのヘルスチェックされるときに、アクセス元が該当サブネットのCIDRとなるので、EC2のセキュリティグループでそれを許可する必要あり
  6. Route53にて、NLBのDNS名をnlb.XXXX.jpのAレコードのAliasとして登録
  7. nlb.XXXX.jpへアクセスして動作確認
  8. 特に問題ないようであれば、Route53にて、wwwの方の名前解決先をNLBのエンドポイントに変更して保存
  9. ※注意点:DNSキャッシュされている人が変更前のELB経由でアクセスしてるようなので、そこへのリクエストがなくなるまでは両方動くようにしておきましょう。

nginxの設定

/etc/nginx/conf.d/XXXX.conf
server {
    listen       443;
    server_name  nlb.XXXX.jp  www.XXXX.jp;
    root /opt/XXXX/public;
    charset utf-8;
    access_log  /var/log/nginx/access_443.log  main;

        # NLB変更により、EC2でSSL Terminationすることになるので、SSLの設定内容を追加してます
    ssl                  on;
    ssl_certificate      /etc/pki/tls/certs/XXXX.pem;
    ssl_certificate_key  /etc/pki/tls/certs/XXXX.key;
    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    #favicon
    location ~ \.ico$ {
        log_not_found off;
        access_log off;
        expires 7d;
    }
    #healthceck
    location /health_check.html {
        access_log off;
    }
    # static
    location /assets {
        access_log off;
        proxy_cache cache_space;
        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 1m;
    }

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Real-IP $remote_addr;

    location / {
        proxy_pass http://XXXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX.ap-northeast-1.elb.amazonaws.com$request_uri;
        client_max_body_size 50M;
        client_body_buffer_size 128k;
        client_body_temp_path /dev/shm/nginx_client_body_temp;
        # アップストリームサーバからのレスポンスバッファリングwarning削減。
        proxy_buffering on;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size  256k;
        proxy_max_temp_file_size 1024m;
        proxy_temp_path /dev/shm/nginx_proxy_temp;
        proxy_connect_timeout 300s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }
    error_page  404              /404.html;
    location = /40x.html {
        root   /usr/share/nginx/html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

参考資料