🎉

AWSで問い合わせフォーマットを作成(SAAハンズオントレーニング)

2025/03/13に公開

AWS SAAを受講予定なので、ハンズオントレーニングを兼ねてブログサイトの問い合わせフォームを作成してみました。

↓実際の問い合わせフォーム

https://www.masato-tech-blog.com/pages/contact

備忘録も兼ねて詰まったポイントのみ記載しておきます。


全体構成

API Gateway、Lambda、DynamoDBを使ったサーバレスアーキテクチャとなります。

alt text

コストについても、個人利用の範囲ではほぼ無料で維持できそうです。


1. DynamoDBの設定

ここでは新規テーブルの作成を行うぐらいですが、下記に少し手間どりました。

(詰まったポイント)

  • パーティションキーの文字列はLamda関数のコードに合わせます。
    // DynamoDBに保存するアイテムを作成
    const item = {
      id: uuidv4(), // ユニークIDを生成
      name: body.name,
      email: body.email,
      message: body.message,
      subject: body.subject || '',
      submittedAt: new Date().toISOString(),
    };

ここの「id」の部分ですね。
alt text

例えばkeyという名前にするなら、パーティションキーにも「key」という名前を設定します。


あと作成されたテーブルデータは「項目を探索」の方から参照できます。
alt text

ダッシュボードとかテーブルの方ばかり見て、送信したデータが登録されず、悩んでいる時間がありました。。。


2. Lambda関数の作成

(詰まったポイント)
コードに関してはcommonJS形式で書くのが推奨されるようです。(Claudeの回答)

AWS Lambda環境との親和性:

AWS Lambdaは伝統的にCommonJS形式で設計されており、デフォルトの実装例やドキュメントもすべてCommonJS形式です
Lambda環境は長年CommonJSをサポートしてきたため、安定性と互換性が高いです


AWS SDKとの互換性:

AWS SDKは主にCommonJS形式を想定して開発されています
特に古いバージョンのAWS SDKでは、ES Modulesでの使用時に予期しない問題が発生することがあります


依存ライブラリとの互換性:

LambdaでよくCDKを使った場合に含まれる多くの依存ライブラリ(例:uuid)はCommonJS形式を前提としていることが多いです
ES Modulesで使う場合、インポート方法を調整する必要がある場合があります


シンプルさと保守性:

Node.jsの世界ではまだCommonJSが広く使われており、多くの開発者にとって馴染みがあります
実装方法がシンプルで、トラブルシューティングも容易です

下手にmjs(ESmodules)形式に直したりしていたので、再修正が必要となりました。

3. API Gatewayのセットアップ

(詰まったポイント)
ここではフロントエンド(Next.js)側のリソースパスの設定が抜けており、時間を要しました。

<.env.local>
NEXT_PUBLIC_CONTACT_API_URL="https://XXXXXXXXXX.execute-api.ap-northeast-1.amazonaws.com/prod/contact"

最後に「/contact」が必要となります。
AWSのAPI Gateway→「ステージ」の画面でURLをコピーすると、「/contact」がついてきません。。。

4. 問い合わせフォームの作成

完成画面はこんな感じです。

alt text

今回はどちらかというと1~3の設定の方がより重要だったので、
Claudeで出力してもらったものをそのまま使用しています。

まとめ

API Gateway、Lambda、DynamoDBはSAA試験にも頻出のサービスと思いますので、今回のハンズオントレーニングで中身の理解がだいぶ進んだと思います。
満足できる内容となりました。

GitHubで編集を提案

Discussion