質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

0回答

508閲覧

S3に保存されているJSONファイルをDBへ取り込む方法

akira777

総合スコア8

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Amazon DynamoDB

Amazon DynamoDBは、 AWS上のNoSQLデータベースサービスです。フルマネージド型のサービスで、スキーマレス、高速且つ安定性のある動作、自動的に容量を変更する自動スケーリングなどの特徴を持ちます。

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2022/06/23 01:01

S3に保存されているJSONファイルを「DocumentDB」「DynamoDB」などのAWSのDBへ取り込む方法として
下記の記事を参考に実施いたしましたが、ClodWatchで下記のエラーが発生してしまいます。
他にも方法がございましたら、ご教示をお願いします。
https://qiita.com/yifey/items/cd97445ecd7085cea444

lambdaのテンプレコードで変更した個所は下記となります。
YOUR_DYNAMO_TABLE_NAME → test-jsonlog
DynamoDBのパーティションキーは同じなので「name 」で変更しておりません。

よろしくお願いいたします。

'Records': KeyError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 16, in lambda_handler
bucket = event['Records'][0]['s3']['bucket']['name']
KeyError: 'Records'

import boto3
import json
import urllib.parse
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

dynamodb = boto3.client('dynamodb')
s3 = boto3.client('s3')

def lambda_handler(event, context):
#target dynamo table name
dynamotable = 'test-jsonlog'

#get bucket name and file name by s3 put event bucket = event['Records'][0]['s3']['bucket']['name'] filename = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') #get uploaded text file contents try: res = s3.get_object(Bucket=bucket, Key=filename) except Exception as e: return logger.error("Failed to get uploaded file: {}".format(e)) # file type check if (res['ContentType'] == 'text/plain'): # get body body = res['Body'].read() bodystr = body.decode('UTF-8') lines = bodystr.split('\r\n') # for windows line endings #get items of each line for item in lines: data = item.split(' ') name = data[0] age = data[1] #register data to the dynamo db try: dynamodb.put_item( TableName = dynamotable, Item = {'name':{'S':name},'age':{'N':age}}, Expected = {'name':{'Exists':False}} ) except Exception as e: print(e) else: logger.error('Invalid File Type: ' + res['ContentType'])

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2022/06/23 05:31

ちゃんと実際にS3にファイルをputして動作確認しましたか? イベントに対してRecordというキーがないと言われていますが…。
akira777

2022/06/27 08:17

ありがとうございます。 解決いたしました。
akira777

2022/06/27 08:24

追加で質問ですが、こちらの関数ですとテキスト以外のファイルには対応していないということで鎧いでしょうか? 例えば、CSVファイルやJSONファイルなど・・・ また、下記のようなテキスト内容の場合、Lambda関数の健康個所は「Item = {'name':{'S':name},'age':{'N':age}},」の個所のみでよろしいのでしょうか? Agent,First name,Last name,Routing profile,Log in,Log out,Duration,Agent Hierarchy Level One,Agent Hierarchy Level Two,Agent Hierarchy Level Three,Agent Hierarchy Level Four,Agent Hierarchy Level Five taro.suzuki,太郎,鈴木,TEST Routing Profile,2022-06-07T00:40:19.155Z,2022-06-08T04:31:20.286Z,100261,-,-,-,-,- testSV,SV,テスト,Basic Routing Profile,2022-06-08T01:47:19.271Z,-,-,TEST01,-,-,-,- よろしくお願いいたします。
yu_1985

2022/06/27 08:35

解決したのなら、何をどうして解決したのかを自己解決の回答として記載しておくと後から見る人に親切です。 追加の質問は、元ネタのLambda Functionが何をしているのかを一から説明するだけになるので詳細は省きます。 結論だけ言うとそこだけ直してもダメです。元のLambda Functionはスペース区切りのテキストを前提としているので、jsonを対象にしたいならjsonの構造を、csvを対象にしたいならcsvの構造を読み取って自分の登録したいように整形してデータ投入するように実装してください。
akira777

2022/06/28 08:42

ありがとうございます。 テキストファイルの内容が、全然違う形式の文字列なのが原因でした。 また、CSVファイルの整形は下記と思われますが、③の変更箇所のトリガーが分かりません。 ①スペース区切りは「data = item.split(' ')」→「data = item.split(',')」 ② テキストからCSV形式は「if (res['ContentType'] == 'text/plain'):」→「 if (res['ContentType'] == 'csv/plain'):」 ③DynamoDBの「Item = {'name':{'S':name},'age':{'N':age}},」の「S」と「N」の個所が不明です。 お手数をおかけしますが、よろしくお願いいたします。
yu_1985

2022/06/29 07:15

ここは無償デバッグサイトではないのでそこはさすがに自分で調べてやってほしいですね…。 > csv/plain そんなContent−Typeはないです。調べてみてください。 https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types また、適当に値を設定するのではなく実際のレスポンスの中身を見て実装することを強くお勧めします。 実際に動かしながら直していくとわかりやすいでしょう。
akira777

2022/06/30 08:21

ありがとうございます。 Lambda関数のコードを変更したところ、下記のエラーが発生してしまいました。 下記はどのようなエラーなのでしょうか? よろしくお願いいたします。 -------エラー内容------------------------ list index out of range: IndexError Traceback (most recent call last): File "/var/task/lambda_function.py", line 36, in lambda_handler First = data[1] IndexError: list index out of range ---------Lambdaコード-------------------------- #get items of each line for item in lines: data = item.split(',') Agent = data[0] First = data[1] Last = data[2] Routing = data[3]
yu_1985

2022/07/01 02:03

当初と質問内容が変わってます。 プログラムを逐一デバッグする作業をここに投げるのではなく、エラーメッセージを調べながらやってみてください。 変数に何が入っているか表示しながら動かしてデバッグしてみると良いでしょう。 以後は回答しません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問