こんにちは。ざわかける!のざわ(@zw_kakeru)です。
curlするシェルスクリプトを書いたときに、別の設定ファイルからAPI Keyを読み込んだのでそのメモです。
awkを使います。
起こったこと
とあるAPIサーバーにcurlでリクエストを投げるスクリプトを書きました。
#!/bin/sh -eu
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_API_KEY_MOJIRETSU_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
-d '{ "data": [ "hoge" ] }' \
https://api-server.com/v1/
これでまあ普通にcurlできたわけですが、Gitにpuchしようとしたときに問題発生。
APIキーをそのままリモートリポジトリ上に載せるわけにはいきません。
とはいえこのスクリプトは他のチームメンバーも使います。その際には各々が持っている自身のAPIキーを使ってもらう必要があります。
手動で設定してもらってると事故も起きますし、何よりいちいち自分で設定するのは面倒です。
なんとかして、これを実行する人それぞれのAPIキーを勝手に設定してくれるようにしたいですね。
やったこと
APIキーをベタ書きするのではなく、所定のファイルから取得するようにしました。
APIキーを含めた設定ファイルはチームメンバーそれぞれの環境で共通の場所(~/.my-service.conf)に置いてあり、内容も次のような記述でした。
...(略)...
[account]
user = my-name
apikey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_API_KEY_MOJIRETSU_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
...(略)...
先ほどのスクリプトではここからAPIキーをコピペしていたんですね。
各々の環境でスクリプトをダウンロードした後に手動で自分のAPIキーに上書きしてもらってもいいのですが、あまりスマートではないですしそれが元でGit上にいろんな人のAPIキーが載ってしまうトラブルが発生する可能性があります。
よってこの場所のこの形式のファイルから自動でAPIキーを取得してリクエストを投げてくれるようにスクリプトを変更します。
次のような感じです。
#!/bin/sh -eu
# apikeyの値を取得
conf_file="$HOME/.my-service.conf"
apikey=$(awk -F' = ' '/apikey/ {print $2}' "$conf_file")
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: key $apikey" \
-d '{ "data": [ "hoge" ] }' \
https://api-server.com/v1/
awkコマンドで$conf_fileの中身の一行一行を、’ = ‘の文字を区切り文字として区切っていきます。
得られた結果からapikeyの文字列が含まれる行のときに{print $2}、すなわち区切った結果の2つ目の文字列部分を返しています。
これはapikey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_API_KEY_MOJIRETSU_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXという文字列を’ = ‘で区切っているために、一つ目($1)がapikeyという文字列で、二つ目($2)がXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_API_KEY_MOJIRETSU_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXの文字列部分になるよね、という理屈です。
そして、得られたAPIキーをcurl実行時に指定することでアクセスを実現しています。
こうすることによって自分でAPIキーをコピペする必要もなくなり、スクリプトを変更することなく他のメンバーもそのまま使用することができます。
Git上に誰かのAPIキーが載ってしまうという事故を防ぐこともできますね。
めでたしめでたし。
おわりに
今回は小手先の実装紹介だったので、本当にtipsらしいtipsでした。
色々と方法はあるものですね。
awkの使い方は知らなかったので、勉強になりました。
こういう細々したモヤりポイントをサクッと実装解決できるようになると快適ですね。アドリブ力が求められて実は結構レベルが高かったりもするのですが。
今回は以上です。