初心者向け　-lambdaとAPIGatewayを使用してDynamoDBにデータ登録-

この記事では、AWSのサーバーレス機能である Lambda と API Gateway を組み合わせて、DynamoDB にデータを登録する仕組みを構築します。
Lambda は、イベント駆動型でコードを実行できるサーバーレスコンピューティングサービスで、API Gateway を通じて外部リクエストを処理する役割を果たします。以下の手順で進めていきます。

1.DynamoDBテーブルを作成する
2.Lambda関数を作成する
3.API Gatewayを設定する



# Lambdaとは

LambdaとはAmazon Web Services（AWS）が提供するサーバーレスコンピューティングサービスであり、Java、Node.js、C#、Pythonといったプログラミング言語に対応しています。
Lambdaは、ファイルのアップロードやデータストリームなどのイベントに応じて起動し、データ処理を自動で実行するタスクに最適です。
Lambda関数は必要なときにのみ実行されるため、リソースを無駄にせず効率的に処理を行えます。これにより、コスト削減とシステムの効率化が期待できます。

# API Gatewayとは
AWS API Gatewayは、クライアント（アプリケーション）とバックエンドサービス（サーバー上のサービス）の間をつなぐAPI管理ツールです。あらゆる規模のREST、HTTP、WebSocket APIを作成、公開、管理、モニタリング、セキュア化するために利用されます。API Gatewayを利用すると、APIリクエストに応じてAWS Lambdaのコードを実行し、その結果をレスポンスとして返す仕組みを構築できます。これにより、サーバーやデータベースの管理を意識せず、柔軟でスケーラブルなアプリケーションを簡単に開発できます。
# DynamoDBとは
Amazon DynamoDBは、サーバーレスのフルマネージドNoSQLデータベースです。リレーショナルデータベースと比べて、非構造化データの処理やスケーラビリティに優れ、ショッピングカートなど大規模なオペレーションワークロードにも適しています。代表的な特徴として、サーバー管理が不要、ストレージ容量が無制限、可用性の向上、コスト効率の良さなどが挙げられます。また、AWSがSQL互換のクエリ言語を提供するため、柔軟に活用できるのも魅力です。リレーショナルデータベースの複雑さを軽減しながら、運用効率を高める選択肢として最適です。


# 1.DynamoDBテーブルを作成する
まずはDynamoDBのテーブルを作成します。
AWSにログインして左上の検索ボックスから「DynamoDB」と間絵作をかけ、画面が表示されたら「テーブルの作成」を選択します。
すると下記の画面になるので、テーブル名を入力します。
ソートキーは必須ではないので、必要であれば入力しましよう。今回は、パーテンションキーのみ入力します。パーテンションキーに入れる値が数値の場合は右の文字列の立っているボックスを変更しましょう。
入力したら下の「テーブルを作成」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/62d0ce2c-c3a1-27ee-65ec-769fd9ff9266.png)

数秒待つと、状態が「アクティブ」になります。この状態になれば、テーブルの作成が完了です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/586653be-2de7-2ab5-238b-027481189005.png)

# 2.Lambda関数を作成する
次に、Lambda関数を作成します。
左上の検索ボックスで「Lambda」と検索し、「関数の作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/be1d301e-515d-8e83-7be1-01287a975d01.png)

関数名を入力し、ランタイムを選択します。  
ランタイムとは、Python、Node.jsなどのプログラミング言語を選択する項目です。  
今回はNode.jsを選択し、関数を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/614eedd3-55d7-cede-9a7d-be37020e6226.png)

次に、関数コードを記述します。

```index.js
const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
    try {
        // リクエストボディを取得
        const data = JSON.parse(event.body);

        // 必須データの検証
        const requiredFields = ['id', 'date', 'dayOfWeek', 'title', 'body', 'registeredUser'];
        const missingFields = requiredFields.filter(field => !data[field]);

        if (missingFields.length > 0) {
            return {
                statusCode: 400,
                body: JSON.stringify({
                    message: `Missing required fields: ${missingFields.join(', ')}`,
                }),
            };
        }

        // DynamoDBに登録するデータ
        const params = {
            TableName: 'TaskSchedule', // DynamoDBテーブル名
            Item: {
                id: data.id,                   // パーティションキー
                date: data.date,               // 日付 (ISO形式: YYYY-MM-DD)
                dayOfWeek: data.dayOfWeek,     // 曜日 (例: "Monday")
                title: data.title,             // タイトル
                body: data.body,               // 本文
                registeredAt: new Date().toISOString(), // 登録日時
                registeredUser: data.registeredUser,    // 登録ユーザー
                updatedAt: null,              // 初期値はnull
                updatedUser: null,            // 初期値はnull
            },
        };

        // DynamoDBにデータを登録
        await dynamoDb.put(params).promise();

        return {
            statusCode: 200,
            body: JSON.stringify({
                message: 'Task added successfully',
                task: params.Item,
            }),
        };
    } catch (error) {
        console.error('Error:', error);
        return {
            statusCode: 500,
            body: JSON.stringify({
                message: 'Error adding task',
                error: error.message,
            }),
        };
    }
};
```

次に、LambdaがDynamoDBにアクセスできるようにアクセス権限を設定します。
まず、作成したLambda関数を選択し、「設定」タブからロール名を確認しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/56b574be-e6af-cc1a-732a-00675852dfc6.png)

左上の検索バーで「IAM」と検索し、左側のメニューから「ロール」を選択します。
一覧にロールが表示されるので、先ほど確認したLambdaのロール名を選択してください。
※該当のロールが見つからない場合は、Lambda関数を再作成して確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/65fd3758-8c32-f939-da9a-e1a6423a02db.png)
許可ポリシーのセクションで「許可を追加」をクリックし、「ポリシーをアタッチ」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/50d38164-d625-be61-1da0-d0fefd9ed94f.png)

検索ボックスに「AmazonDynamoDBFullAccess」と入力し、表示された項目のチェックボックスをオンにします。
右下の「許可を追加」ボタンをクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/864987e2-44b6-ea89-eb38-4f341f07eff1.png)
許可ポリシーに「AmazonDynamoDBFullAccess」が追加されていることを確認します。
その後、Lambda関数のコードをデプロイして、Lambda関数の作成は完了です。
# 3.APIGatewayを設定する
次に、API Gatewayを設定します。
画面左上の検索バーで「API Gateway」と検索し、API Gatewayサービスに移動します。その後、「APIを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/a30df32a-b8ad-6089-52fb-6db61685b668.png)
「APIタイプを選択」と表示されるので、「HTTP API」または「REST API」を選択してください。（ここではREST APIを使用します）
「新しいAPI」を選択し、API名を入力したら、画面右下の「APIを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/6b915c6c-ade6-59f0-22c4-45ed62b7a14c.png)

APIが作成されたら、次にリソースを作成します。  
画面中央の「リソースの作成」をクリックします。  

![リソース作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/6ac00747-4545-5460-3403-558cce9dfa35.png)

リソース名を入力し、画面右下の「リソースを作成」をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/966b372b-623a-96b7-8b41-cd9767c5bbe2.png)

次に、画面右側の「メソッドの作成」をクリックします。  
メソッドタイプは「POST」、統合タイプは「Lambda関数」を選択します。  

画面下部に表示されるLambda関数の指定欄に、先ほど作成したLambda関数を入力します。関数名を一部入力すると、自動で候補が表示されるので、その中から該当の関数を選択してください。  
![メソッド作成画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/976a8a07-c52f-2488-37cd-a1484b144cb1.png)

その後、画面右上にある「APIをデプロイ」をクリックします。  
ステージの設定画面が表示されたら、「新しいステージ」を選択し、ステージ名を入力して、画面右下の「デプロイ」をクリックします。  
![デプロイ画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/7dfc6cca-bc6e-9d8b-fcf1-717dea9f2678.png)

これで、API Gatewayの設定は完了です。
では、Lambda関数を動かして、DynamoDBにデータ登録してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/92f7cec0-70a5-2653-9879-fd23fc47a26c.png)

次に、「Create test event」をクリックして、テストイベントを作成します。
イベント名（EventName）を入力し、以下のJSONデータを貼り付けます。
```Json
{
  "body": "{\"id\":\"123\",\"date\":\"2024-12-06\",\"dayOfWeek\":\"Monday\",\"title\":\"Sample Task\",\"body\":\"This is a sample task.\",\"registeredUser\":\"User1\"}"
}
```
入力が完了したら保存し、「Test」をクリックします。

実行後、以下のようなレスポンスが返ってくれば成功です。
```
Response:
{
  "statusCode": 200,
  "body": "{\"message\":\"Task added successfully\",\"task\":{\"id\":\"123\",\"date\":\"2024-12-06\",\"dayOfWeek\":\"Monday\",\"title\":\"Sample Task\",\"body\":\"This is a sample task.\",\"registeredAt\":\"2024-12-06T04:24:53.117Z\",\"registeredUser\":\"User1\",\"updatedAt\":null,\"updatedUser\":null}}"
}

```

もし、この時点で aws-sdk 関連のエラーが発生する場合は、以下の記事を参考にしてください。

https://qiita.com/k__maeda/items/c629f0f167fe3abc0671

最後に、DynamoDBにデータが登録されているか確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/97ae500a-db78-abbf-3a37-b571a1d69f0b.png)

登録されたデータがDynamoDBに反映されていれば、設定は成功です！

# エラーが発生した場合

もしエラーが発生した場合は、CloudWatch でログを確認すると原因を特定しやすくなります。
Lambda関数のログを確認するには、Lambdaの詳細画面から「モニタリング」をクリックし、「CloudWatchログを表示」を選択してください。以下のような画面が表示され、詳細なログ情報を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3952109/443169e5-db41-eaf8-5724-ffbc7fa524a8.png)




この記事が、これからAWSを活用して開発を始める方の参考になれば幸いです。ぜひ試してみてください！