Open5
個人用簡易APIサーバー作成記録
- CLIでやっている処理を刷新して、携帯電話からでも実行できるようにしたい
- AWS Lambda なり、Cloudflare Workers なり、サーバーレスな仕組みでやってコストを抑えたい
- Goが使いたいので、Lambdaでやってみよう
- RDSにお金をかけたくないし、応答性も必要ないのでS3にJSONを保存してデータを永続化しよう
- ホスティングは Lambda の Function URLs が使えないかなぁ?
- iPhoneのショートカットアプリとか、そのあたりからHTTPリクエストを投げることを考えると認証はかけづらい
- Function URLs の認証タイプNONEでいっとくのは、認証はアプリケーションレベルで何かやるにしても、DDoSとか怖い
Lambda統合のAPI Gatewayの利用も考えたが、Lambdaからのレスポンス形式が不正というエラーが出てうまくいかず。形式を確認したが、正しい形式に見えたのでなんだったのやら。深追いはしていない。
この辺りのレスポンスは、こちらのモジュールにお任せしてしまっている。余力があれば調査して何か貢献したいところ。
Function URLs に直接アクセスするのではなく、Cloudfront経由だけでアクセスするようにできる。そうするとCloudfrontにWAFやShieldを設定して脅威への耐性を向上することができる。
POST/PUTリクエストの場合は、ハッシュを計算してヘッダに付与する必要ありとのこと。
上記記事のようにLambda@Edgeで計算する方法もあるが、クライアント側で計算して付与しておいてももちろん問題ない。
iPhoneのショートカットアプリには、地味にハッシュを計算する機能もあるので、リクエストボディを文字列で持っておけば計算ができる。
ただし「リストから選択」などを使って複数項目のリスト(配列)を作り、それをPayloadにいれる場合(以下の例だとusers
のこと)、これを文字列にするのは地味に大変。
{"date":"2024-11-18","users":["Alice","Bob"]}
「辞書」という機能がショートカットアプリにはあり、テキストや配列を各キーに対する値として設定できるが、リストを無造作に突っ込むと"Alice\nBob"
のような形式になる。
そこで「各項目を繰り返し」を使い、次のように処置する必要あり。
- --ここから繰り返し--
- 各アイテムをダブルクオーテーションで囲む
- ダブルクオーテーションで囲った後の文字列を変数に格納(変数に追加で格納していくと勝手にリストにされる)
- --ここまで繰り返し--
- 変数をカンマ区切りで結合
- 「テキスト」を使って、無理やりJSON形式のペイロードを文字列として作成
- 「ハッシュ」を使って、上記の文字列のSHA256ハッシュを計算