月の売上とかをStripeのAPIをリクエストしてくれるLambda関数(HTTPSエンドポイント)を用意して Redashで集計できるようにしたかったので試してみました。
created[gte]=1564585200&created[lte]=1567263600
sls create -t aws-nodejs-typescript project-name
で、いい感じにlambda用かつTypeScriptなプロジェクトの雛形が作成されるserverless-offline
パッケージを追加Stripeのシークレットキーはセキュアに扱いたかったので調査した
コード全部を掲載しませんが、メモだけ残しておきます。
momentしか使ったことなかったのでluxon使ってみた
Math.floor()
で切り捨てた// StripeのCharge一覧取得用パラメータ作成
const params = {
['created[gte]']: Math.floor(DateTime.local().minus({ month: 1}).startOf('month').toSeconds()),
['created[lte]']: Math.floor(DateTime.local().minus({ month: 1}).endOf('month').toSeconds())
}
superagentしか使ったことなかったのでaxios使ってみた
// StripeのAPIをリクエスト
const res = await axios.get(url, { baseURL, auth, params })
KMSの復号化もサンプルコードがコンソールでも手に入るし、それをasync / await式にかきかえた
request.promise();
にちょっとつまずいた// encryptedに、暗号化された文字が入ってる
const req = kms.decrypt({ CiphertextBlob: new Buffer(encrypted, 'base64') });
const data = await req.promise();
decrypted = data.Plaintext.toString('ascii');
うえのほうで
lambdaのドキュメントではKMSを使うように書いてあった
と書いたがServerless FrameworkでもKMSのキーのARNを設定できましたが、
[Enable helpers for encryption in transit]
をserverless.ymlでは(もっというと Cloud Formationでは)設定できなさそうでした。
結局 sls deploy
したときに、平文で環境変数が登録されてそれを手動で暗号化することになりそうだったので、パラメータストアを使って関数内で復号化できないかためしたほうがよさそうでした。
(とはいえ正直 encryption in transitを有効にしないとどんなリスクがあるかあんまりピンと来てないです。。。。)
~true
とつけると復号化されるらしい~true
を設定しないで、関数内で復号化できないかという作戦