発生した問題
Node.jsで開発したアプリで認証ありのRedisサーバーに接続しようとした際、ローカルで動作させて接続できていたものが、CodeEngineにデプロイしたアプリでは正常に接続されなかった。
正確には接続する際の認証に失敗していたようだ。
REDIS_CERTIFICATE="-----BEGIN CERTIFICATE-----
MIIDHTCCAgWgAwIBAgIUFIO1EGeecAJjDhDdmSdOfCWPboYwDQYJKoZIhvcNAQEL
...
FTel34h4s8q8kPTaEWuohkoV80IYKLSZthAzzXtJpTW1
-----END CERTIFICATE-----"
証明書を上のような形で環境変数に入れることでローカルでは動作していたが、CodeEngineの環境変数にはこのまま突っ込んでも認識されないようだった。
"値"の部分にペーストした時点で改行コードから見た目同様の半角スペースになってしまうようだ。
解決策
REDIS_CERTIFICATE=-----BEGIN CERTIFICATE-----\nMIIDHTCCAgWgAwIBAgIUFIO1EGeecAJjDhDdmSdOfCWPboYwDQYJKoZIhvcNAQEL...\nFTel34h4s8q8kPTaEWuohkoV80IYKLSZthAzzXtJpTW1\n-----END CERTIFICATE-----
このように、文字列を囲うダブルクォーテーションを外し、改行を\n
に置き換えた。
その後Node.js側でREDIS_CERTIFICATE
を読み取り、.replace(/\\n/gm, "\n")
を行うことで無事接続が行えた。
考察?
CodeEngineでは、改行は半角スペースへ。
ダブルクォーテーションやバックスラッシュなどは環境変数の一部としてエスケープされるようだ。
CodeEngine上の環境変数で設定した値 | アプリケーション側で認識される値 |
---|---|
(改行) |
(半角スペース) |
\ |
\\ |
"" |
\"\" |
\n |
\\n |
わかりづらいと思うのは私だけ?