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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

4046閲覧

AWS LambdaのpythonでDynamoDBのキーを可変で取得したい

Otazoman

総合スコア44

AWS Lambda

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/29 05:32

編集2018/11/01 07:06

前提・実現したいこと

DynamoDBをキーで検索し、データをjsonで取得して表示するサンプルを
作成しています。以下の点で躓いていて何とかしたいのですがお助けいただけますでしょうか。

1.複数のKeyを受けた際でも対応できるようにしたい。

 以下のコードの__Key={keyname: id}__の箇所について
複号キーを受付けた場合に対応できるようにしたいと考えているのですが
どうすればいいでしょうか。

lambdafunction

1import boto3 2 3def get_data(id,tablename,keyname): 4 try: 5 dynamodb = boto3.resource('dynamodb') 6 table = dynamodb.Table(tablename) 7 response = table.get_item( 8 Key={ 9 keyname: id 10 } 11 ) 12 return response['Item'] 13 except Exception as e: 14 print(e) 15 raise e 16 17def lambda_handler(event, context): 18 category = '2' 19 tablename = 'item' 20 keyname = 'item-category' 21 22 item = get_data(category,tablename,keyname) 23 return item

(解決済)2.レスポンスを受けたitemから一部の内容を取得したい

受取った値からは以下の様なレスポンスを取得できます。itemcode__は__item-category
によって数が不変となっています。上記の__return item__の箇所については__item_codeN__内の文字列__"222-0001"__等を取得しその値を変数に格納して別の用途に使用したいと考えて
おります。どうすれば可変する項目の文字列を取得して変数に格納することができるでしょうか?

JSON

1{ 2 "itemcode_1": "222-0001", 3 "itemcode_2": "222-0002", 4 "item-category": "2" 5}

テーブル構造は以下の様な形です。
https://teratail.com/questions/154614

つたない説明で恐縮ですがよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

何とか自己解決しました。

1について美しいやり方ではないですが複合キーで検索する関数を準備し、id2のパラメータで制御するようにして対応できました。ハッシュキーのみ分も1つにまとめられたらよかったのですが、こちらについてはいいアイデアがありませんでした。引数が可変にできてモードを付けられればできそうですが、あまり美しくありません。こうすればもっとシンプルになるよというご指摘などあればご教示いただけると幸いです。

python

1#複合キーで検索 2def get_table_val(id1,id2,key1,key2,tablename): 3 try: 4 table = dynamodb.Table(tablename) 5 #検索キーが指定書式の場合はid1とid2で検索する。 6 if id2==0: 7 response = table.query( 8 KeyConditionExpression=Key(key1).eq(id1) 9 ) 10 else: 11 response = table.query( 12 KeyConditionExpression=Key(key1).eq(id1) & Key(key2).eq(id2) 13 ) 14 return response['Items'] 15 except Exception as e: 16 raise(e)

投稿2019/01/22 05:35

Otazoman

総合スコア44

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

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

0

2の質問については自己解決できました。
以下のコードで値が取得できたのでこちらを応用できそうです。

import boto3 import json import os import re def get_data(id,tablename,keyname): try: dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(tablename) response = table.get_item( Key={ keyname: id } ) return response['Item'] except Exception as e: print(e) raise e def lambda_handler(event, context): category = '1' tablename = os.getenv('TABLE_NAME') keyname = os.getenv('KEY_NAME') item = get_data(category,tablename,keyname) #ループで辞書のvalueを取得する for i_key,i_val in item.items(): m = re.match(keyname,i_key) if (m is None): print(i_val)

投稿2018/11/01 07:01

Otazoman

総合スコア44

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問