AWS活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は、「AWS Lambda」を使って「Amazon S3」にアップロードしたCSVを「Amazon DynamoDB」に自動登録する方法を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「Amazon Web Services」(AWS)活用における便利な小技を簡潔に紹介する連載「AWSチートシート」。今回は、「AWS Lambda」を使って「Amazon S3」にアップロードしたCSVファイルを「Amazon DynamoDB」に自動登録する方法を紹介します。
DynamoDBは、メンテナンスや管理、運用、スケーリングをAWSが行うフルマネージドNoSQLデータベースサービスです。主なユースケースとして、Webやスマホアプリのユーザー情報、セッション情報の管理、広告やゲームのユーザー行動履歴管理などがあります。
このDynamoDBを利用しているとたびたび出くわすのが「CSV形式のデータを一括でDynamoDBテーブルに取り込みたい」というシーンです。こちらの実現方法として、今回はLambdaとS3を利用します。
今回行うDynamoDBへのCSV登録は図1のような構成です。
下記の手順に沿って作業します。
DynamoDBコンソールから「テーブルの作成」をクリックしてテーブル作成画面(図2)に遷移し、次の通りに値を設定します。
ソートキーの指定は任意なので今回は省略し、その他の設定もデフォルトのままで「テーブルの作成」をクリックします。
数十秒〜数分でテーブルの作成が完了しステータスが「Active」になっていることを確認できます。
今度はS3ダッシュボードに遷移し、任意の名前を入力し、「バケットの作成」ボタンでS3バケットを作成します。
バケットの作成が完了したらDynamoDBにインポートするCSVファイルをアップロードします。
作成したバケット名をクリックし、「アップロード」ボタンでファイルをアップロードします。
本稿でアップロードした「employee.csv」は次のような内容です。
1,杉本,男,営業部 2,徳永,男,人事部 3,北田,女,システム部 4,赤松,女,システム部 5,志賀,男,総務部 6,藤原,女,システム部
Lambda関数の実行に必要となるIAMロールを作成します。
IAMダッシュボードから「ロール」→「ロールの作成」とクリックして遷移した画面で、次のように選択して「次のステップ:アクセス権限」に進みます。
IAMロールにアタッチするIAMポリシーは、以下のAWS管理ポリシーとユーザー管理ポリシーを指定します。
ユーザー管理ポリシーは自分で作成する必要があります。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Resource": "*", "Action": [ "dynamodb:PutItem", "dynamodb:BatchWriteItem" ] } ] }
最後にロール名を指定して「ロールの作成」をクリックすれば、ステップ3は完了です。
CSVファイルをDynamoDBテーブルにインポートするためのLambda関数を作成します。
Lambdaダッシュボードから「関数の作成」をクリックし、以下の項目に次のように値を指定して「関数の作成」をクリックします。
すると、作成したLambda関数の詳細ページに遷移するので、図8の「コードソース」欄のエディタ部分に下記のコードを入力します。
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」ボタンをクリックしてソースコードをデプロイします。
ステップ4で作成したLambda関数を使ってS3にある「emplopyee.csv」のデータをDynamoDBテーブルに登録できるかどうかをテストします。
今回のシナリオでは、S3へのCSVファイルのアップロードをイベントとしてLambda関数を実行したいので、「テスト」タブをクリックして下記の通りイベントテンプレートと名前を指定します。
JSON形式のイベントドキュメントは、自分が作成したS3バケットとCSVファイルを使ってテストできるように下記の部分を修正します。
上記の設定が完了したら「変更を保存」をクリックし、「テスト」ボタンからLambda関数をテストします。
問題がなければ、図11のように実行結果が表示されます。
DynamoDBダッシュボードの画面左から「項目」タブをクリックして、「employee_table」を選択し、「スキャン」を実行するとCSVファイル内のデータがDynamoDBに登録されていることを確認できます。
最後に、S3バケットでCSVファイルがアップロードされたことをLambdaに通知するイベントを設定します。
自分の作成したS3バケットの画面で「プロパティ」タブをクリックし、画面を下の方までスクロールすると「イベント通知」の設定欄が存在します。
こちらから「イベント通知を作成」をクリックし、遷移後の画面で以下のように設定します。
S3バケットに「employee2.csv」をアップロードして、こちらの内容がDynamoDBに反映されることを確認しましょう。
4,あかまつ,女,システム部 5,しが,男,総務部 6,ふじわら,女,システム部 7,竹本,女,営業部
DynamoDBで再度スキャンすると、もともと存在していたid「4」〜」6」のデータは上書きされ、id「7」のデータが新しく登録されていることを確認できます。
今回はLambdaを使ってS3にアップロードしたCSVファイルをDynamoDBに自動で登録する方法を紹介しました。
S3へのファイルアップロードをトリガーにしたLambda関数の実行やLambda関数によるCSVファイルのDynamoDBへの登録はよく利用されるパターンなので、一度動作を確認してみてはいかがでしょうか。
マルチクラウドへの閉域接続サービスのサービスマネジメント業務に従事した後、AWS案件での基盤構築支援などを担当。社内では、検証・学習用にAWSを完全定額で利用できるサービス「安心サンドボックス」の立ち上げや東京ITスクールのAWS研修におけるコンテンツ開発、Java・AWS研修の講師などを歴任。
Copyright © ITmedia, Inc. All Rights Reserved.