runn 0.122.0 に機密情報を扱う機能が追加されたので試してみた
こんにちは、runn おすすめおじさんです。
APIテストツールのrunnについては、リリースをsubscribeして新機能をウォッチしています。
そんなある日、こんなリリースが振ってきました。
APIの認証に必要なあれやこれな情報を安全に扱えるなら、それは良いことですよね!
ということで試してみました。
なお、このエントリは年末三本締めの一本目です。
secrets:
の機能
ということで、早速実装されたPull Request(PR)を見てみましょう。
Implement secrets:
section by k1LoW · Pull Request #1076 · k1LoW/runn
By listing the names of variables stored in the secrets section, you can mask all the values of those variables in the output.
ふむふむ、 secrets
というセクションで宣言した変数を、出力する際にマスクしてくれる機能のようですね。
PRに書いてある例でも、それが見て取れます。
やってみた
機能がわかったところで、実際のユースケースを考えて使ってみましょう。
まず、APIテストを実行するツールとして、安全に扱いたいものの代表として「APIキー」があるかと思います。
そして、テストはCIなどでも実行することを考えると、APIキーは環境変数から渡すことが考えられます。
ということで、「環境変数で宣言したAPIキーを、secrets
セクションで宣言した変数に格納し、実際にAPI実行で使うケースについて、debug
モードで実行する」のをやってみましょう。
本記事で使ったrunnのバージョンは以下です。
$ runn -v
runn version 0.124.1
まず、secrets
機能を使わずにAPIを呼び出すrunbookを作ります。
desc: secretsを使わないAPIコールのテスト
runners:
req: ${ENDPOINT_URL:-http://localhost:3000}
vars:
api_key: ${API_KEY:-}
steps:
callApi:
req:
/api:
get:
headers:
authorization: "Bearer {{ vars.api_key }}"
test: |
current.res.status == 200
runnで環境変数から値を受け取る方法は、以下の記事を参考にして下さい。
【Day6】変数を外部から与えてみる / runnチュートリアル
この状態でrunbookを実行しましょう。
$ API_KEY=this_is_secret_information runn run --debug ./call-api-without-secrets.yaml
Run "req" on "APIキーを使ったAPIコールのテスト".steps.callApi
-----START HTTP REQUEST-----
GET /api HTTP/1.1
Host: localhost:3000
Authorization: Bearer this_is_secret_information
-----END HTTP REQUEST-----
-----START HTTP RESPONSE-----
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: keep-alive
Content-Type: text/plain;charset=UTF-8
Date: Fri, 20 Dec 2024 07:01:29 GMT
Keep-Alive: timeout=5
Vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch
d
Hello, World!
0
-----END HTTP RESPONSE-----
Run "test" on "APIキーを使ったAPIコールのテスト".steps.callApi
.
1 scenario, 0 skipped, 0 failures
すると、当然ながら標準出力にバッチリAPIキーが見えてしまいます。
Authorization: Bearer this_is_secret_information
次に、secrets
セクションを追加したrunbookを作ります。
desc: secretsを使ったAPIコールのテスト
runners:
req: ${ENDPOINT_URL:-http://localhost:3000}
vars:
api_key: ${API_KEY:-}
secrets:
- vars.api_key
steps:
callApi:
req:
/api:
get:
headers:
authorization: "Bearer {{ vars.api_key }}"
test: |
current.res.status == 200
runbookを実行してみましょう。
$ API_KEY=this_is_secret_information runn run --debug ./call-api-with-secrets.yaml
Run "req" on "APIキーを使ったAPIコールのテスト".steps.callApi
-----START HTTP REQUEST-----
GET /api HTTP/1.1
Host: localhost:3000
Authorization: Bearer *****
-----END HTTP REQUEST-----
-----START HTTP RESPONSE-----
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: keep-alive
Content-Type: text/plain;charset=UTF-8
Date: Fri, 20 Dec 2024 06:49:40 GMT
Keep-Alive: timeout=5
Vary: RSC, Next-Router-State-Tree, Next-Router-Prefetch, Next-Router-Segment-Prefetch
d
Hello, World!
0
-----END HTTP RESPONSE-----
Run "test" on "APIキーを使ったAPIコールのテスト".steps.callApi
.
1 scenario, 0 skipped, 0 failures
今度はAPIキーがマスクされていることがわかります。
Authorization: Bearer *****
これで、CI環境でも安全に出力できますね!
まとめ
普通に使うだけでも便利なrunnですが、ローカル以外の環境でも安全に使えるような配慮が加わったことで、一層プロダクションで使いやすくなりますね。
まだまだ進化を続けるrunn。今後も目を離せません!