ykokw.xyz blog logo

Blog Posts

No results for 'undefined'Powered by Algolia

前回の続き ということで、ある程度実装しきったのでまとめていく

stripe-nodeが便利

API Gatewayのリソースポリシー

アクセス元となるRedashがアクセス制限をかけているので、
そこからのアクセスを許可しつつ他のアクセスを制限していく(通信を許可するIPアドレスを指定するとか serverless.ymlのprovider.resourcePolicyで設定してく

環境変数設定

  • 環境変数はstage(stg / prod)ごとにenv.xxx.jsonを用意

    • それをserverless.ymlで参照している
  • 機密情報の場合はあらかじめKMSで暗号化した値のbase64エンコード文字列をjsonに書いている
# kmsにあるkey一覧を取得
$ aws kms list-keys

# kmsのkeyを使って機密情報を暗号化
aws kms encrypt --key-id KEY_ID --plaintext SECRET_TOKEN
  • lambda関数内で復号化を行っているので、暗号化に使用したkeyをserverless.ymlに設定
service:
  name: serverless-stripe-info
  awsKmsKeyArn: arn:aws:kms:ap-northeast-1:xxxxxxxxx:key/xxxx-xxxx-xxxx-xxxx

ローカル実行

  • 上で用意したenv.stg.jsonをコピーして、env.local.jsonを作る(env.local.jsonはgitignoreしておく)
  • env.local.jsonには生のAPIキーを登録しておく
  • local環境の場合はkmsでの復号化をスキップする処理を書く
    const encrypted = process.env.STRIPE_SECRET_KEY;
    let decrypted;
    if (decrypted) {
      return processFetchDataFromStripes(event, _context);
      return res;
    } else {
      if (process.env.STAGE === "LOCAL") {
        // 環境変数から読み取った生APIキーをcontextに設定
        _context.decrypted = encrypted;
      } else {
        const kms = new AWS.KMS();
        const req = kms.decrypt({
          CiphertextBlob: Buffer.from(encrypted, "base64")
        });
        const data = await req.promise();
        _context.decrypted = data.Plaintext.toString("ascii");
      }
      return processFetchDataFromStripe(event, _context);
    }
  • ローカルで関数呼び出し
$ sls invoke local -f <YOUR_FUNCTION> -s local

This content is built with Gatsby