🐕
API GatewayとLambdaを使用してPOSTデータをGoogleスプレッドシートに書き込むCDKスタックの構築
概要
AWS LambdaからGoogleスプレッドシートにデータを書き込む処理をCDKで構築してみます。
例えば、フォームから送信されたデータをGoogleスプレッドシートに保存したいようなケースで活用できるかと思います。
サンプルコード
こちらがサンプルコードです。
構成
今回の構成は以下の通りです。
- 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