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.
Database Expert 鬮ォ�ェ陋滂ソス�ス�コ闕オ譁溷クキ�ケ譎「�ス�ウ驛「�ァ�ス�ュ驛「譎「�ス�ウ驛「�ァ�ス�ー