DynamoDBのデータをS3にCSV形式でエクスポートする機能を作成する

DyanamoDBのテーブルに格納しているデータをS3にエクスポートするためのLambdaを作成しました。
DynamoDBの標準機能でも「S3へのエクスポート」機能がありましたが、ファイル形式が限られておりCSV形式では出力できませんでした。
データ連携やバックアップの意味でも使いやすいCSV形式で出力したかったので、作りこみを行いました。
DynamoDBの標準機能でも「S3へのエクスポート」機能がありましたが、ファイル形式が限られておりCSV形式では出力できませんでした。
データ連携やバックアップの意味でも使いやすいCSV形式で出力したかったので、作りこみを行いました。
使用例
このページのLambdaと他のAWSサービスを使用することで以下のようなことが実現できます。
各サービスとの連携はAWSのサービスドキュメントを確認しながら実装してください。
- 指定したDynamoDBのテーブルデータをS3に定期出力が可能です。
各サービスとの連携はAWSのサービスドキュメントを確認しながら実装してください。
構成図
EventBridgeにて定期実行のタイマー機能が実装可能です。
実行開始されたLambdaはDyanmoDBの内容をスキャンし、S3にCSV形式で出力ができます。
EventBridgeの作り方は、「EventBridgeを作成する」を参考に作成してください。
実行開始されたLambdaはDyanmoDBの内容をスキャンし、S3にCSV形式で出力ができます。
EventBridgeの作り方は、「EventBridgeを作成する」を参考に作成してください。

Lambdaソースコード
import boto3
import json
import os
import csv
import io
dynamodb_client = boto3.client('dynamodb')
s3_client = boto3.client('s3')
def lambda_handler(event, context):
TableName = os.environ['TABLENAME']
BucketName = os.environ['BUCKETNAME']
FileName = os.environ['FILENAME']
TableData = dynamodb_client.scan(TableName=TableName)
TableItems = TableData['Items']
while 'LastEvaluatedKey' in TableData:
TableData = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
TableItems.extend(TableData['Items'])
if TableItems:
keys = TableItems[0].keys()
output = io.StringIO()
writer = csv.DictWriter(output, fieldnames=keys)
writer.writeheader()
for TableItem in TableItems:
writer.writerow(TableItem)
s3_client.put_object(
Bucket=BucketName,
Key=FileName,
Body=output.getvalue()
)
return 0
権限(IAMロール設定)
LambdaにアタッチするIAMロールに「dynamodb:Scan」、「s3:PutObject」の権限を付与してください。
解説
紹介した機能のフローは以下の通りです。
その場合、応答結果に「LastEvaluatedKey」が含まれます。
「LastEvaluatedKey」が含まれる場合は再度スキャンを繰り返すような処理を作成しています。
- 対象のDynamoDBのテーブルをスキャン
- 「LastEvaluatedKey」を確認し、一度のスキャンで内容を確認しきれなかったデーブル情報を追加スキャン
- スキャンしたテーブル情報をCSV形式でS3に出力
その場合、応答結果に「LastEvaluatedKey」が含まれます。
「LastEvaluatedKey」が含まれる場合は再度スキャンを繰り返すような処理を作成しています。
使い方
対象のDynamoDBや出力先のS3バケット、CSVファイル名は環境変数にて指定しますので、作成するLambdaには以下の環境変数を設定してください。
- TABLENAME → 対象のDynamoDBテーブル名
- BUCKETNAME → 出力先のS3バケット名
- FILENAME → 出力先CSVファイル名