🐕

API GatewayとLambdaを使用してPOSTデータをGoogleスプレッドシートに書き込むCDKスタックの構築

2024/03/02に公開

概要

AWS LambdaからGoogleスプレッドシートにデータを書き込む処理をCDKで構築してみます。

例えば、フォームから送信されたデータをGoogleスプレッドシートに保存したいようなケースで活用できるかと思います。

サンプルコード

こちらがサンプルコードです。

https://github.com/FuminoriSugawara/cdk-lambda-spreadsheet-sample

構成

今回の構成は以下の通りです。

  • Googleスプレッドシートの書き込み処理でエラーが発生した場合にSQS側でリトライするようにできます。
  • Googleスプレッドシートに書き込むには、GoogleAPIのシークレット情報が必要になります。
    このシークレット情報はSecretsManagerに保存しておき、Lambdaから参照できるようにしています。
  • GoogleSpreadsheetへの書き込みには、google-spreadsheetというライブラリを使っています。

準備

1. Google Cloud Platformの設定

  • 事前にGoogle Cloud Platformでサービスアカウントを発行しておきます。
  • 発行したサービスアカウントの認証情報(JSON)を取得しておきます。
  • サービスアカウントのメールアドレスをコピーします(後ほど利用します)。
  • Google Sheet APIを有効にします。

2. 書き込み先のGoogleスプレッドシートの設定

  • 書き込みたいスプレッドシートを作成します。
  • 1行目に適当なヘッダー名を追加します(詳しくはgoogle-spreadsheetのドキュメント参照)
  • 「共有」ボタンをクリックし、さきほどコピーしたサービスアカウントのメールアドレスを入力します。
  • 権限を「編集者」として送信ボタンをクリックします。「通知」のチェックは外しても構いません。
  • 書き込みたいスプレッドシートのIDをURLから抽出してコピーします。
  • http://***/d/{スプレッドシートのID}/editという形式になっています。

3. サービスアカウントの認証情報(JSON)をSecretsManagerに登録

  • AWSのマネジメントコンソールにサインインし、SecretsManagerを開きます。
  • 「新しいシークレットを保存する」をクリックし、その他のシークレットタイプを選択します。
  • キー名にgoogleApiCredentialsと入力します。
  • シークレットの値には、認証情報のJSONの内容を貼り付けます。
  • シークレットのARNをコピーし、環境変数としてexportします。

以上で事前準備は完了です。

デプロイ

以下を実行します。AWSのプロフィールを指定する場合は、--profileオプションを指定します。

export SECRET_ARN=XXXXXXXX
cd cdk
npm run build
cdk bootstrap
cdk deploy

デプロイが完了すると、API Gatewayのエンドポイントがコンソールに出力されます。

動作確認

  • コンソールに出力されたエンドポイントをコピーします。
  • Postmanなどで上記のエンドポイントに対してPOSTリクエストを送信します。
  • リクエストBodyにはスプレッドシートID、シート名と書き込みたいデータをJSON形式で設定します。
  • スプレッドシートを開き、行が追加されていれば成功です。
  • 動作確認が完了したら、cdk destroy を実行して、リソースを削除します。

JSONの例

{
    "sheetId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "sheetName": "シート1",
    "data": {
        "住所": "sample1",
        "氏名": "sample2",
        "電話番号": "sample3",
        "送信日": "2024-01-01"
    }
}

Discussion