runn 0.122.0 に機密情報を扱う機能が追加されたので試してみた

runn 0.122.0 に機密情報を扱う機能が追加されたので試してみた

Clock Icon2024.12.20

こんにちは、runn おすすめおじさんです。

APIテストツールのrunnについては、リリースをsubscribeして新機能をウォッチしています。

そんなある日、こんなリリースが振ってきました。

Release v0.122.0 · k1LoW/runn

Implement secrets: section by @k1LoW in #1076

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を作ります。

call-api-without-secrets.yaml
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を作ります。

call-api-with-secrets.yaml
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。今後も目を離せません!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.