下記の記事で試したKMS(AWS Key Management Service)を用いたデータの暗号化を
Boto3(Python)でKMS(AWS Key Management Service)を使って暗号化と復号化をしてみた
次の記事などで作り込んでいる仕組みに導入してみました。
“Scheduled Event”の”Lambda”の処理を並列化する
具体的にはAPI GatewayにPOSTされたデータ(valueの部分)をバックエンドの
LamndaにてKMSで暗号化して、SQS、DynamoDBに登録するようにしています。
(下図参照)
API GatewayのバックエンドLambdaの設定(test-api)
コードはこんな感じです。
import base64 import json import boto3 import logging logger = logging.getLogger() logger.setLevel(logging.INFO) queueName = 'test' keyId = 'arn:aws:kms:ap-northeast-1:000000000000:key/00000000-0000-0000-0000-000000000000' def lambda_handler(event, context): try: logger.info(event) responses = [] data = {} kms = boto3.client('kms') data['key1'] = base64.b64encode(kms.encrypt( KeyId = keyId, Plaintext = event['key1'] )['CiphertextBlob']) data['key2'] = base64.b64encode(kms.encrypt( KeyId = keyId, Plaintext = event['key2'] )['CiphertextBlob']) data['key3'] = base64.b64encode(kms.encrypt( KeyId = keyId, Plaintext = event['key3'] )['CiphertextBlob']) responses.append( boto3.resource('sqs').get_queue_by_name( QueueName = queueName ).send_message( MessageBody = json.dumps(data) ) ) logger.info(responses) return responses except Exception as e: logger.error(e) raise e
Base64でエンコードもした後にSQSに登録しています。
IAMの設定
このコードを実行するにはIAMロール(lambda_basic_execution)に
KMSを利用するためのポリシーをアタッチする必要があります。
今回は適当なManaged Policyが見つからなかったので、
インラインポリシーで作ってみました
便利なPolicy Generatorで作成します。
KMSのencryptとdecryptを許可してます。
下部に反映されてます。
JSONで確認です。
無事、適用完了です。
テスト
実際にAPI GatewayにデータをポストするとSQSにも暗号化&エンコードされたデータが
登録されていることがわかります。
少し時間が経つと、DynamoDBにも登録出来てることが確認できます。
下記コードでちゃんとデコードできていることも確認できました。
import base64 import boto3 enc = 'CiD+fWEsUQkbgIsZNTlu6jTa91Y8XRllZzJVCz1uc4HFhRKNAQEBAgB4/n1hLFEJG4CLGTU5buo02vdWPF0ZZWcyVQs9bnOBxYUAAABkMGIGCSqGSIb3DQEHBqBVMFMCAQAwTgYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAy1eSlsvIUbBtyBQbICARCAIVkgWVVTG1ca5HlBS93sN7Fp9jqveQsu3BWUtpMsEP2dGA==' kms = boto3.client('kms') dec = kms.decrypt( CiphertextBlob = base64.b64decode(enc) )['Plaintext'] logger.info(dec) print(dec)
ちゃんと”value1″が表示されました。