「Amazon S3」にアップロードしたCSVファイルを「Amazon DynamoDB」に自動登録する「AWS Lambda」関数の作り方AWSチートシート

AWS活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は、「AWS Lambda」を使って「Amazon S3」にアップロードしたCSVを「Amazon DynamoDB」に自動登録する方法を紹介する。

» 2021年09月24日 05時00分 公開
[天野盛介東京ITスクール]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 「Amazon Web Services」(AWS)活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は、「AWS Lambda」を使って「Amazon S3」にアップロードしたCSVファイルを「Amazon DynamoDB」に自動登録する方法を紹介します。

 DynamoDBは、メンテナンスや管理、運用、スケーリングをAWSが行うフルマネージドNoSQLデータベースサービスです。主なユースケースとして、Webやスマホアプリのユーザー情報、セッション情報の管理、広告やゲームのユーザー行動履歴管理などがあります。

 このDynamoDBを利用しているとたびたび出くわすのが「CSV形式のデータを一括でDynamoDBテーブルに取り込みたい」というシーンです。こちらの実現方法として、今回はLambdaとS3を利用します。

DynamoDBへのCSVファイル登録手順と構成

 今回行うDynamoDBへのCSV登録は図1のような構成です。

図1 DynamoDBにCSVファイルをインポートする構成

 下記の手順に沿って作業します。

  1. DynamoDBテーブルの作成
  2. S3バケットを作成してCSVファイルをアップロード
  3. Lambda関数が利用する「AWS Identity and Access Management」(IAM)ロールの作成
  4. DynamoDBにデータを登録するLambda関数の作成
  5. 作成したLambda関数のテスト
  6. S3バケットでイベントトリガーを設定

【ステップ1】DynamoDBテーブルの作成

 DynamoDBコンソールから「テーブルの作成」をクリックしてテーブル作成画面(図2)に遷移し、次の通りに値を設定します。

  • テーブル名:employee_table
  • パーティションキー:id

図2 DynamoDBのテーブル作成

 ソートキーの指定は任意なので今回は省略し、その他の設定もデフォルトのままで「テーブルの作成」をクリックします。

 数十秒〜数分でテーブルの作成が完了しステータスが「Active」になっていることを確認できます。

図3 作成したDynamoDBテーブル

【ステップ2】S3バケットを作成してCSVファイルをアップロード

 今度はS3ダッシュボードに遷移し、任意の名前を入力し、「バケットの作成」ボタンでS3バケットを作成します。

 バケットの作成が完了したらDynamoDBにインポートするCSVファイルをアップロードします。

 作成したバケット名をクリックし、「アップロード」ボタンでファイルをアップロードします。

図4 S3バケットにアップロードされたCSVファイル

 本稿でアップロードした「employee.csv」は次のような内容です。

1,杉本,男,営業部
2,徳永,男,人事部
3,北田,女,システム部
4,赤松,女,システム部
5,志賀,男,総務部
6,藤原,女,システム部

【ステップ3】Lambda関数が利用するIAMロールの作成

 Lambda関数の実行に必要となるIAMロールを作成します。

 IAMダッシュボードから「ロール」→「ロールの作成」とクリックして遷移した画面で、次のように選択して「次のステップ:アクセス権限」に進みます。

  • エンティティの種類:AWSサービス
  • 一般的なユースケース:Lambda

図5 IAMロールのエンティティとユースケースを選択

 IAMロールにアタッチするIAMポリシーは、以下のAWS管理ポリシーとユーザー管理ポリシーを指定します。

  • AWS管理ポリシー
    • AWSLambdaBasicExecutionRole
    • AWSLambdaInvocation-DynamoDB
    • AmazonS3ReadOnlyAccess

 ユーザー管理ポリシーは自分で作成する必要があります。

  • ユーザー管理ポリシー
    • 名前:dynamodb-put-batchwrite
    • アクセス権限:以下のポリシーを付与
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Resource": "*",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:BatchWriteItem"
            ]
        }
    ]
}

 最後にロール名を指定して「ロールの作成」をクリックすれば、ステップ3は完了です。

  • ロール名:lambda-import-csv-into-dynamodb

図6 ロール名を指定してIAMロールを作成

【ステップ4】DynamoDBにデータを登録するLambda関数の作成

 CSVファイルをDynamoDBテーブルにインポートするためのLambda関数を作成します。

 Lambdaダッシュボードから「関数の作成」をクリックし、以下の項目に次のように値を指定して「関数の作成」をクリックします。

  • オプション:一から作成
  • 関数名:import-csv-into-dynamodb
  • ランタイム:Python 3.7
  • デフォルト実行ロールの変更:既存のロールを使用する
  • 既存のロール:lambda-import-csv-into-dynamodb

図7 「関数の作成」画面

 すると、作成したLambda関数の詳細ページに遷移するので、図8の「コードソース」欄のエディタ部分に下記のコードを入力します。

図8 Lambda関数の「コードソース」欄
import boto3
 
# S3、DynamoDBテーブルへの接続準備
s3_client = boto3.client("s3")
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("employee_table")
 
def lambda_handler(event, context):
 
    # S3情報をeventから取得
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    s3_file_name = event['Records'][0]['s3']['object']['key']
 
    # オブジェクト(CSVファイル)を取得して行ごとにデータを取得
    resp = s3_client.get_object(Bucket=bucket_name,Key=s3_file_name)
    data = resp['Body'].read().decode("cp932")
    employees = data.split("\n")
 
    # 取得したデータの値を1つずつカンマで分けてテーブルに登録
    for emp in employees:
        print(emp)
        emp_data = emp.split(",")
 
        try:
            table.put_item(
                Item = {
                    "id"       : emp_data[0],
                    "name"     : emp_data[1],
                    "gender"   : emp_data[2],
                    "dept"     : emp_data[3]
                }
            )
        except Exception as e:
            print(e)

 ソースコードの入力が終わったら「Deploy」ボタンをクリックしてソースコードをデプロイします。

【ステップ5】作成したLambda関数のテスト

 ステップ4で作成したLambda関数を使ってS3にある「emplopyee.csv」のデータをDynamoDBテーブルに登録できるかどうかをテストします。

 今回のシナリオでは、S3へのCSVファイルのアップロードをイベントとしてLambda関数を実行したいので、「テスト」タブをクリックして下記の通りイベントテンプレートと名前を指定します。

  • 新しいイベント
  • テンプレート:s3-put
  • 名前:put-csv

図9 Lambda関数のテストイベントの指定

 JSON形式のイベントドキュメントは、自分が作成したS3バケットとCSVファイルを使ってテストできるように下記の部分を修正します。

  • 23行目:import-csv-into-dynamodb
  • 30行目:employee.csv

図10 修正後のイベントドキュメント(一部抜粋)

 上記の設定が完了したら「変更を保存」をクリックし、「テスト」ボタンからLambda関数をテストします。

 問題がなければ、図11のように実行結果が表示されます。

図11 Lambda関数のテスト結果

 DynamoDBダッシュボードの画面左から「項目」タブをクリックして、「employee_table」を選択し、「スキャン」を実行するとCSVファイル内のデータがDynamoDBに登録されていることを確認できます。

図12 DynamoDBテーブルに登録されたデータ

【ステップ6】S3バケットでイベントトリガーを設定

 最後に、S3バケットでCSVファイルがアップロードされたことをLambdaに通知するイベントを設定します。

 自分の作成したS3バケットの画面で「プロパティ」タブをクリックし、画面を下の方までスクロールすると「イベント通知」の設定欄が存在します。

図13 S3バケットの「プロパティ」タブ

図14 イベント通知の設定欄

 こちらから「イベント通知を作成」をクリックし、遷移後の画面で以下のように設定します。

  • イベント名:put-csv
  • サフィックス - オプション:.csv

図15 イベント通知の設定:一般的な設定
  • イベントタイプ全てのオブジェクト作成イベント

図16 イベント通知の設定:イベントタイプ
  • 送信先:Lambda関数
  • Lambda関数を特定:Lambda関数から選択する
  • Lambda関数:import-csv-into-dynamodb

図17 イベント通知の設定:送信先

 S3バケットに「employee2.csv」をアップロードして、こちらの内容がDynamoDBに反映されることを確認しましょう。

4,あかまつ,女,システム部
5,しが,男,総務部
6,ふじわら,女,システム部
7,竹本,女,営業部

 DynamoDBで再度スキャンすると、もともと存在していたid「4」〜」6」のデータは上書きされ、id「7」のデータが新しく登録されていることを確認できます。

図18 「employee2.csv」のデータが反映されたDynamoDBテーブル

終わりに

 今回はLambdaを使ってS3にアップロードしたCSVファイルをDynamoDBに自動で登録する方法を紹介しました。

 S3へのファイルアップロードをトリガーにしたLambda関数の実行やLambda関数によるCSVファイルのDynamoDBへの登録はよく利用されるパターンなので、一度動作を確認してみてはいかがでしょうか。

筆者紹介

天野盛介(あまのせいすけ)

株式会社システムシェアード

マルチクラウドへの閉域接続サービスのサービスマネジメント業務に従事した後、AWS案件での基盤構築支援などを担当。社内では、検証・学習用にAWSを完全定額で利用できるサービス「安心サンドボックス」の立ち上げや東京ITスクールのAWS研修におけるコンテンツ開発、Java・AWS研修の講師などを歴任。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。