【技術検証】S3アップロードからLambda経由でDynamoDBに保存する構成を検証してみた

## はじめに

まずはじめに、前回の記事の続きとなります。簡単に前回の振り返りをすると、S3バケットにファイルがアップロードされたことをトリガーに、Lambda関数を実行する構成を構築しました。

**前回の検証記事はこちらです！**

https://qiita.com/free-honda/items/d1d2f13ac75872879d16

CloudWatch のログも確認しましたが、想定通りファイル名がログに出力されていました（前回の検証結果です）。

![Screenshot 2025-06-19 at 23.03.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/be30c62e-bcc4-4ffa-a7d3-0b19a9324bc7.png)

AWSのサーバーレス構成の基礎的な組み合わせであり、さまざまな場面で応用できると感じたため、今回はその構成にDynamoDBを加えて、連携する構成を試してみることにしました。

***簡単な内容ではありますが、備忘録も兼ねて記事として残しておきます...！！***

## 書こうと思ったきっかけ

サーバレスなアーキテクチャー構成に強くなりたいという思いから、最近は積極的にサーバレスサービスを触るようにしています。

その中で、S3バケットへのファイルアップロードをトリガーにして、Lambda関数を起動させ、そのままDynamoDBにデータを保存するという流れはまだ自分で試していなかったので、今回改めて手軽に検証してみました。

**今回はこんな感じの構成を試してみました！**

![Screenshot 2025-06-20 at 21.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e3dc8548-b14b-48f7-ba9c-5dd5d6593c03.png)

引用画像：https://aws.amazon.com/blogs/compute/creating-a-scalable-serverless-import-process-for-amazon-dynamodb/

## 実際にやってみた

S3バケットの作成、Lambda関数の作成、S3トリガーの設定については、前回の記事で詳しく手順をまとめています。

**ハンズオンされる方は、ぜひそちらを読んでから本記事を読み進めていただくのがおすすめです...！！**

https://qiita.com/free-honda/items/d1d2f13ac75872879d16

内容に不備などがございましたら、お手数ですが優しくご指摘いただけますと幸いです...！

### DynamoDBテーブルの作成

Lambdaからアップロードファイルの情報を保存するためのテーブルを作成します。

```bash
aws dynamodb create-table \
  --table-name UploadedFiles \
  --attribute-definitions AttributeName=FileName,AttributeType=S \
  --key-schema AttributeName=FileName,KeyType=HASH \
  --billing-mode PAY_PER_REQUEST
```

* テーブル名：`UploadedFiles`
* パーティションキー：`FileName`（文字列）

**こんな感じで問題なく実行できました！**

![Screenshot 2025-06-20 at 22.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/74d4c7cd-b6aa-4c2f-afa4-416845bdb3be.png)

**マネコン上でも想定通りテーブルが作成されていることが確認できました！**

![Screenshot 2025-06-20 at 22.03.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/dbc17d33-8fa2-4f93-ba13-99c3f7413c3d.png)

### Lambda関数にDynamoDBの処理を追加

Lambda関数にDynamoDBへの書き込み処理を追加します。

```python
import json
import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('UploadedFiles')

def lambda_handler(event, context):
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']

        # CloudWatchログ出力
        print(f"S3バケット: {bucket}, アップロードファイル: {key}")

        # DynamoDBに保存
        table.put_item(Item={
            'FileName': key,
            'BucketName': bucket
        })

    return {
        'statusCode': 200,
        'body': json.dumps('保存完了')
    }
```

**実際にコードを貼り付けたあとは、下図の赤枠で示した「デプロイ」ボタンをクリックして反映してください！**

![Screenshot 2025-06-20 at 22.06.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c22b03bb-65c4-4aa2-a254-e3042ae96ca5.png)

#### IAMロールの設定

* IAM > ロール > 対象のLambda関数ロール
* 「インラインポリシーの追加」または「ポリシーをアタッチ」で、`AmazonDynamoDBFullAccess` を許可

![Screenshot 2025-06-20 at 22.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/778d66cd-5030-449f-88f7-2d757aa1668b.png)

※実際の運用では、必ず最小権限のポリシーを設定してください！今回はあくまで動作検証のために、便宜上フル権限を付与しています。


### 動作確認（S3アップロード → DynamoDB登録）

```bash
echo "hello dynamodb" > test2.txt
aws s3 cp test2.txt s3://my-upload-bucket-honda/
```

**私はこんな感じで、CloudShell 上から実行してみました！**

![Screenshot 2025-06-20 at 22.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/bf467712-b54a-48fd-a821-cd9da799dbed.png)

**実際のマネコン画面**

![Screenshot 2025-06-20 at 22.12.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b826aad2-2393-4fc5-a689-76cc66d42b77.png)

DynamoDBにデータが登録されているか確認：

![Screenshot 2025-06-20 at 22.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/de08d734-a577-469e-8c64-60759c85f791.png)

***CLIで確認するためのコマンドは以下の通りです。興味のある方はぜひお試しください〜***

```bash
aws dynamodb get-item \
  --table-name UploadedFiles \
  --key '{"FileName": {"S": "test2.txt"}}'
```

→ `FileName` と `BucketName` が登録されていれば成功です！

**こんな感じです...！**

![Screenshot 2025-06-20 at 22.20.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e34cf0fd-e7c3-4a54-8f71-ca35c0c72700.png)

## まとめ

ここまで読んでいただき、ありがとうございました！今回は、S3トリガー を使って、アップロードをきっかけにLambdaが起動するよう設定し、DynamoDB にファイル情報を保存する仕組みも加えました。

この週末は、CSVとか画像サムネイルとか、実用的なLambda処理にも手を出してみようと思ってます〜😆

## 参考文献

https://dev.classmethod.jp/articles/aws-lambda-s3-csv-to-dynamodb/