🦀

シングルバイナリでsigv4署名ができるツールが欲しかったので作った

2024/12/09に公開

忙しい人用

https://github.com/1hakusai1/awscurl-rs

作ったのでよければ使ってください。日本語でのフィードバックも大歓迎です。

何を作ったのか

curlとほぼ同じ使い方で、sigv4署名付きのリクエストが送れるcliツールです。Homebrewで入ります。IAM認証がかかったAPI Gatewayを手元から叩きたい時などにお使いください。

使い方

> awscurl --help
Usage: awscurl [OPTIONS] <URL>

Arguments:
  <URL>  

Options:
  -d, --data <DATA>        Request body
  -X, --request <METHOD>   HTTP method (Ex. GET, POST, PUT ...)
  -H, --header <HEADER>    HTTP headers (Ex. content-type: application/json)
      --service <SERVICE>  AWS service name (Default: execute-api)
      --region <REGION>    AWS region
      --profile <PROFILE>  AWS profile
  -v, --verbose            
  -h, --help               Print help
  -V, --version            Print version

AWS_PROFILE=hakusai awscurl https://szbinmrnxd.execute-api.ap-northeast-1.amazonaws.com -X POST -H 'content-type: application/json' -d '{"data": "hoge"}'

なぜ作ったのか

API GatewayとLambdaを使い倒してほとんどのAPIを作り、内側の認証にIAM認証を使っているプロジェクトに参加していたことがあります。API GatewayのIAM認証は簡単に設定できる一方、APIを使う側がリクエストの署名を実装するのが少し面倒です。サービス内部で動き続けるプログラムであれば、一度実装してしまえば使い回せることも多いですが、「なんか応答おかしくね?ちょっと手元からリクエストしてみよう」みたいな時に認証を通すためのスクリプトを書かなければならないのが面倒に感じていました。

ということで、気軽にsigv4署名付きのリクエストを送るツールが欲しかったので、自分で作ることにしました。

なぜ他のツールじゃダメなのか

やっぱり同じ課題を抱えている人は世界中にいるらしく、要望を満たすツールがすでにいくつか存在しています。ここではなぜ既存のツールを使うのではなく、新しく作る必要があったのかを書いていきます。

ぶっちゃけ一番大きな理由は、自分でOSSのツールを作って公開してみたかった です。自己満足が99%です。以下は自分の傲慢な欲求を正当化するための理由づけだと思ってください。

curl

比較的新しいバージョンのcurlはsigv4署名に対応しています。普段使いのツールで実現できるならそれが一番良いです。ただ、curlのsigv4署名は

curl --aws-sigv4 "aws:amz:us-east-2:es" --user "MYACCESSKEY:my-secret" https://example.com

という形式で指定する必要があります。アクセスキーを覚えておいて手打ちすることはほぼ不可能だと思います。一応

curl --aws-sigv4 "aws:amz:us-east-2:es" --user "$(aws configure get aws_access_key_id):$(aws configure get aws_secret_access_key)" https://example.com

みたいなことをしてaws cliで認証情報を持ってくることができなくはないのですが、これもaws cliのコマンドを全部覚えておくのがつらいです。

ということで、デフォルトの認証情報を使ったりプロファイルを指定できたりするツールが欲しくなります。

awscurl

https://github.com/okigan/awscurl?tab=readme-ov-file

おそらく最もメジャーな選択肢です。curlとほぼ同じオプションが使え、aws cliと同様の環境変数やプロファイル指定が使えます。ほぼ欲しかったものです。

ただ個人的に使いにくい理由が、Pythonで書かれていることです。pipでグローバルのPythonに依存ライブラリを入れるのが好きではないです。Python自体、ライブラリのバージョンの細かい違いでコードが動かなくなることが多いイメージなので、Pythonで書かれたツールをpipでグローバルにインストールすることに抵抗があります。

ということで、バイナリ1個配ればOK、みたいなツールが欲しいです。

legal90/awscurl

https://github.com/legal90/awscurl

作り始めてから見つけました。awscurlと同等の機能をgoで実装したものです。ほぼ答えです。ぶっちゃけほとんど理想のツールではあるのですが、強いて言えばHomebrew等でインストールできず、バイナリを自分でダウンロードして配置する必要があるのが面倒というくらいでしょうか。逆にそれくらいしか言うことがありません。

ということで、自分のツールはHomebrewでインストールできるようにしました。

最後に

自分自身、長期間コミットがないツールを見ると「あんまメンテされてなさそうだし、使わんでおくか…」と思うので、今後も継続的にブラッシュアップしていくつもりです。現状考えているのは以下です。

  • プロファイルやアクセスキーをオプションで指定できるようにする
    • 環境変数だけでも動くことには動くのですが、aws cliと同様に指定できた方が嬉しいかもしれないので
  • assume_role を使う場合でも動くようにする
    • どうやら本家awscurlは未対応っぽいので。aws_sdkで認証情報を取ってきているのですでに動く可能性もあるんですが、ちゃんと検証したい。試した人がいたらココかGitHubにコメントください。
    • 追記 動いた
  • トレースログを出す
    • 現状だと認証情報を取れなかった時に一律同じエラーが出るので、たぶんトラブルシュートしにくい

使ってもらえると嬉しい気持ちになるので、同じような面倒臭さを感じている方がいらっしゃったらぜひ使っていただきたいです。もちろんバグ報告、機能要望、PRも大歓迎です。

読んでいただきありがとうございました。

Discussion