LoginSignup
2
2

Amazon Linux 2023でHTTPS対応のNode-RED環境を構築する(nginxリバースプロキシ使用)

Last updated at Posted at 2023-05-25

背景

諸事情によりインターネット環境にNode-REDの実行環境が必要となり、EC2にサーバー構築しました。
いつものAmazon Linux 2で構築しようと思ったのですが、以下サイトに「WARNING: BUILD SYSTEM CURRENTLY BROKEN FOR NODEJS 18+」とあったので、Amazon Linux 2023で構築しました。

手順

EC2インスタンスの起動と初期設定

詳細については割愛し、注意点のみ記載します。

インスタンス起動時の注意点

  • インターネット環境で使用するため、「パブリックIPの自動割り当て」を「有効化」
    image.png
  • セキュリティグループで以下のルールを追加
    • SSH(デフォルトで入っている・ソースタイプを「自分のIP」にすること推奨)
    • HTTP
    • HTTPS
    • TCP1880(動作確認用・ソースタイプを「自分のIP」にすること推奨)

インスタンス起動後の作業

  • Elastic IPの割り当て
  • DNS登録:ホスト名でグローバルIPが変換できるようにする(当方はRoute53でAレコード追加)

SSH接続

これまで使ってきたTeraTermが使えないらしいので、コマンドプロンプトから接続します。

> cd (キーペアのpemファイルのダウンロードフォルダ)
> ssh -i "(キーペア名).pem" ec2-user@(ホスト名)

OSインストール後の共通作業

EC2のAmazon Linux起動後の共通作業(日本語化対応)を実施します。

$ sudo -s
# vi /etc/hostname
(ホスト名を書き換えて保存)
# rm -f /etc/localtime; ln -sf /usr/share/zoneinfo/Japan /etc/localtime
# vi /etc/sysconfig/clock
(ZONEを「UTC」から「Asia/Tokyo」に書き換えて保存)
# vi /etc/sysconfig/i18n
(「en_US」を「ja_JP」に書き換えて保存)
# source /etc/sysconfig/i18n
# reboot

Node-REDインストールと初期設定

Node-REDインストール

再起動完了後、SSHで再接続してNode-REDのインストールを行います。

$ sudo -s
# curl -fsSL https://rpm.nodesource.com/setup_20.x | bash -
# dnf install -y nodejs
# npm install -g --unsafe-perm node-red

パスワード保護

そのままだとセキュリティ的に問題があるので、パスワードでログインするようにします。

# node-red admin hash-pw
Password:(パスワード入力しEnter)
$2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(この値をコピーしておく)
# vi /usr/lib/node_modules/node-red/settings.js
…
(以下のコメント解除)
    adminAuth: {
        type: "credentials",
        users: [{
            username: "admin",
            password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.",
                             ↓ 初期値は「password」なので、上でコピーしたハッシュ値に変更
            password: "$2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
            permissions: "*"
        }]
    },
…

自動起動設定

OS起動時にNode-REDが自動で起動するように、PM2をインストール、設定します。

# npm install -g pm2
…
# exit

※注意:以下はec2-userで実行する
$ pm2 start /usr/bin/node-red
…
$ pm2 startup
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ec2-user --hp /home/ec2-user
…
$ pm2 save
…

https://(グローバルIP):1880/でアクセスし、adminでログインできることを確認します。
image.png

リバースプロキシ導入とHTTPS対応

nginxインストール

nginxをインストールし、サービスの起動、自動起動設定します。

$ sudo -s
# dnf install -y nginx
# systemctl start nginx
# systemctl enable nginx

http://(ホスト名)でアクセスし、Welcome画面が表示されることを確認します。
image.png

Let's Encryptインストール

certbotのインストールと、証明書取得、nginxの設定を行います。

# dnf install -y python3 augeas-libs pip
# python3 -m venv /opt/certbot/
# /opt/certbot/bin/pip install --upgrade pip
# /opt/certbot/bin/pip install certbot
# ln -s /opt/certbot/bin/certbot /usr/bin/certbot
# systemctl stop nginx
# certbot certonly --standalone
…
(メールアドレスを記入)
…
(ライセンス規程に同意)
…
(メール配信希望に回答)
…
(ホスト名を入力)
…
# vi /etc/nginx/nginx.conf
…
(コメントを外し、ssl_certificateとssl_certificate_keyを編集)
    server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  _;
        root         /usr/share/nginx/html;

        ssl_certificate "/etc/letsencrypt/live/(ホスト名)/fullchain.pem";
        ssl_certificate_key "/etc/letsencrypt/live/(ホスト名)/privkey.pem";
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
…
# systemctl start nginx

https://(ホスト名)でアクセスし、Welcome画面が表示されることを確認します。

リバースプロキシ設定

nginxの設定ファイルにリバースプロキシ設定を追記し、サービスを再起動します。

# vi /etc/nginx/nginx.conf
…
    server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  _;
        root         /usr/share/nginx/html;
        # ここから追記
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
                proxy_pass http://127.0.0.1:1880/;
        }
        # ここまで追記

        ssl_certificate "/etc/letsencrypt/live/(ホスト名)/fullchain.pem";
        ssl_certificate_key "/etc/letsencrypt/live/(ホスト名)/privkey.pem";
…

# systemctl restart nginx

https://(ホスト名)でアクセスし、Node-REDの画面が表示されることを確認します。
image.png

以上で構築完了となります。
インターネット公開しているため、セキュリティグループのTCP 1880のルールを削除しておくことをおすすめします。

証明書更新(2023/8/3追記)

Let's Encryptで取得した証明書は3か月で有効期限が切れるため、有効期限の1か月程度前に更新が必要となります。
更新の方法はこちらを参考に実行しましたが、「Failed to renew certificate ceemskj.chugai-tec.com with error: The requested nginx plugin does not appear to be installed」となったため、以下のコマンドでプラグインを追加しました。

# /opt/certbot/bin/pip install certbot-nginx

プラグインインストール後、以下のコマンドで無事更新ができました。

# certbot renew --nginx --renew-hook "/bin/systemctl reload nginx"

参考URL

今回も先人の方々の情報により短時間で実現できました。
以下の著者の皆様、誠にありがとうございます。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2