環境の差を絞る
目標
「うちのサーバーでは動くんですが」と言われたときに、コードではなく環境を疑い、その違いを30分以内に特定できるようになります。
なぜ重要なのか
環境の問題は、コードの欠陥より見つけにくいものです。コードは読めば見えますが、環境には読むものがないからです。そのため順序が必要で、その順序をスクリプトに固めておくと、顧客企業とのやり取りが3往復から1往復に減ります。
このラボで扱う3つは、現場での頻度順です。環境変数は、設定した場所と読む場所が違うケースが大半です。エンコーディングは、ハングルの顧客データで圧倒的によく起きます。Windowsで作られたCSVはUTF-8ではなくEUC-KR(CP949)であることが多く、誤って読まれた文字列はエラーなしで黙って保存され、数週間後に「検索できない」という報告になって返ってきます。権限は、資格情報ファイルでは特に重い問題です。トークンが644で置かれていると、同じサーバーの他のユーザー全員が読めてしまい、セキュリティ点検でこれ1つでプロジェクト全体の信頼が削られます。
/opt/app/envcheck.shは、直す対象ではありません。環境をそれに合わせることが課題です。
ステップ
/root/envディレクトリを作成してください。bash /opt/app/envcheck.shをそのまま実行して、失敗の出力を/root/env/fail.txtに保存してください。- 失敗メッセージが指している環境変数の名前を、
/root/env/missing_var.txtに書いてください。 /opt/data/customers_kr.csvをUTF-8に変換して、/root/env/customers_utf8.csvとして保存してください。ハングルが正しく読める必要があります。- 変換したファイルのヘッダーを除いた顧客の行数を、
/root/env/kr_rows.txtに書いてください。 /root/env/token.txtを作成し、権限を600に設定してください。- 必要な環境変数を渡して
envcheck.shをもう一度実行し、成功の出力を/root/env/result.txtに保存してください。 /root/env/report.mdに、何が違ったのかを書いてください。環境変数の名前、元のファイルのエンコーディング名、適用した権限の数字が、すべて入っている必要があります。
参考
iconv -f EUC-KR -t UTF-8 입력 > 출력(プレースホルダーは入力ファイルと出力ファイルです)API_TOKEN=xxx bash /opt/app/envcheck.shのようにコマンドの前に付けると、その実行にだけ適用されます。chmod 600 파일、確認はstat -c %a 파일(プレースホルダーはどちらもファイル名です)- よくあるミス1: ステップ7で
exportを別のシェルで行い、ここで実行してしまうことです。環境変数はプロセスに沿って継承されます。 - よくあるミス2: ステップ4で、変換せずにコピーだけしてしまうことです。ハングルが実際に読めるかを確認してください。
作業ディレクトリを作る
/root/envディレクトリを作成してください。
/root/envの下に、出力物を集めます。
失敗を再現して保存する
bash /opt/app/envcheck.shをそのまま実行して、失敗の出力を/root/env/fail.txtに保存してください。
bash /opt/app/envcheck.shをそのまま実行すると失敗します。出力をそのままファイルに残してください。
欠けている環境変数の名前を書く
失敗メッセージが指している環境変数の名前を、/root/env/missing_var.txtに書いてください。
失敗メッセージが変数名を直接教えてくれます。名前だけを書いてください。
ハングルのCSVを復元する
/opt/data/customers_kr.csvをUTF-8に変換して、/root/env/customers_utf8.csvとして保存してください。ハングルが正しく読める必要があります。
/opt/data/customers_kr.csvはUTF-8では読めません。韓国語版Windowsで作られたファイルの代表的なエンコーディングを思い出して、iconvで変換してください。
顧客の行数を数える
変換したファイルのヘッダーを除いた顧客の行数を、/root/env/kr_rows.txtに書いてください。
変換したファイルから、ヘッダーを除いたデータ行の数です。
トークンファイルに最小権限を与える
/root/env/token.txtを作成し、権限を600に設定してください。
/root/env/token.txtを作成し、所有者だけが読み書きできるようにしてください。chmodの数字表記を使います。
チェックを通す
必要な環境変数を渡してenvcheck.shをもう一度実行し、成功の出力を/root/env/result.txtに保存してください。
環境変数をコマンドの前に付けると、その実行にだけ適用されます。通った出力をファイルに残してください。
環境の違いのレポートを書く
/root/env/report.mdに、何が違ったのかを書いてください。環境変数の名前、元のファイルのエンコーディング名、適用した権限の数字が、すべて入っている必要があります。
何が違ったのかを3つ書きます。変数名、元のファイルのエンコーディング名、適用した権限の数字です。