はじめに
まずはじめに、前回の記事の続きとなります。簡単に前回の振り返りをすると、S3バケットにファイルがアップロードされたことをトリガーに、Lambda関数を実行する構成を構築しました。
前回の検証記事はこちらです!
CloudWatch のログも確認しましたが、想定通りファイル名がログに出力されていました(前回の検証結果です)。
AWSのサーバーレス構成の基礎的な組み合わせであり、さまざまな場面で応用できると感じたため、今回はその構成にDynamoDBを加えて、連携する構成を試してみることにしました。
簡単な内容ではありますが、備忘録も兼ねて記事として残しておきます...!!
書こうと思ったきっかけ
サーバレスなアーキテクチャー構成に強くなりたいという思いから、最近は積極的にサーバレスサービスを触るようにしています。
その中で、S3バケットへのファイルアップロードをトリガーにして、Lambda関数を起動させ、そのままDynamoDBにデータを保存するという流れはまだ自分で試していなかったので、今回改めて手軽に検証してみました。
今回はこんな感じの構成を試してみました!
実際にやってみた
S3バケットの作成、Lambda関数の作成、S3トリガーの設定については、前回の記事で詳しく手順をまとめています。
ハンズオンされる方は、ぜひそちらを読んでから本記事を読み進めていただくのがおすすめです...!!
内容に不備などがございましたら、お手数ですが優しくご指摘いただけますと幸いです...!
DynamoDBテーブルの作成
Lambdaからアップロードファイルの情報を保存するためのテーブルを作成します。
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(文字列)
こんな感じで問題なく実行できました!
マネコン上でも想定通りテーブルが作成されていることが確認できました!
Lambda関数にDynamoDBの処理を追加
Lambda関数にDynamoDBへの書き込み処理を追加します。
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('保存完了')
}
実際にコードを貼り付けたあとは、下図の赤枠で示した「デプロイ」ボタンをクリックして反映してください!
IAMロールの設定
- IAM > ロール > 対象のLambda関数ロール
- 「インラインポリシーの追加」または「ポリシーをアタッチ」で、
AmazonDynamoDBFullAccessを許可
※実際の運用では、必ず最小権限のポリシーを設定してください!今回はあくまで動作検証のために、便宜上フル権限を付与しています。
動作確認(S3アップロード → DynamoDB登録)
echo "hello dynamodb" > test2.txt
aws s3 cp test2.txt s3://my-upload-bucket-honda/
私はこんな感じで、CloudShell 上から実行してみました!
実際のマネコン画面
DynamoDBにデータが登録されているか確認:
CLIで確認するためのコマンドは以下の通りです。興味のある方はぜひお試しください〜
aws dynamodb get-item \
--table-name UploadedFiles \
--key '{"FileName": {"S": "test2.txt"}}'
→ FileName と BucketName が登録されていれば成功です!
こんな感じです...!
まとめ
ここまで読んでいただき、ありがとうございました!今回は、S3トリガー を使って、アップロードをきっかけにLambdaが起動するよう設定し、DynamoDB にファイル情報を保存する仕組みも加えました。
この週末は、CSVとか画像サムネイルとか、実用的なLambda処理にも手を出してみようと思ってます〜😆
参考文献









