Python
AWS
DynamoDB
+

AWS DynamoDB + pythonで暗号化&複合化にハマった話

やりたいこと

①pythonで引数をkmsで暗号化してdynamoDBにぶちこむ。

②ぶちこまれた値を取り出して複合化してふにゃふにゃする。

①はできたよ

ここを参考にしてできたよ
http://blog.suz-lab.com/2015/10/lambdapythonkmssqs.html

https://api.wp-kyoto.net/save-secret-data-into-dynamodb-by-kms/

(引数keyで与えた項目を暗号化して、tableテーブルのkeyにいれる)

set.py
import boto3
from boto3.session import Session
from boto3.dynamodb.conditions import Key, Attr
import base64

# lambdaからはこっち
try:
    kms = boto3.client('kms')  
    dynamodb = boto3.resource('dynamodb')
except:
# 手元からはこっち
    kms = session.client('kms')    
    dynamodb = session.resource('dynamodb')

table= dynamodb.Table('table')
keyId = 'key'

def lambda_handler(event, context):
    key = base64.b64encode(kms.encrypt(KeyId = keyId,Plaintext = event['key'])['CiphertextBlob'])            
    response = table.put_item(Item={'key':key})
    return response

複合化にはまる

あとは取り出して複合化すればいいのねーと思いきや、取り出したるは意味不明なboto3.dynamodb.types.Binary型

様々なバイナリエンコードをごり押して、最終的にreprで文字列化⇒replaceできれいに整形⇒b64でBytes型に⇒複合化⇒utf-8でdecodeをして複合化した文字列をゲッツ
(2018/3/11 追記)boto3.dynamodb.types.Binary.valueで取り出したBytesを複合化してutf-8 でdecodeで文字列をゲッツできます!これならきもいreplaceなど不要!

get.py
import boto3
from boto3.session import Session
from boto3.dynamodb.conditions import Key, Attr
import base64

# lambdaからはこっち
try:
    kms = boto3.client('kms')  
    dynamodb = boto3.resource('dynamodb')
except:
# 手元からはこっち
    kms = session.client('kms')    
    dynamodb = session.resource('dynamodb')

table= dynamodb.Table('table')

def lambda_handler(event, context):
    beforekey = table.get_item(Key={'key': event['key']})
    afterkey = kms.decrypt(CiphertextBlob=base64.b64decode(beforekey['Item']['key'].value)['Plaintext'].decode()
    ikasuFunction(afterkey)

def ikasuFunction(key):
    # hoge

情報モトム

いいやり方あったら教えてください