下記の記事で試したKMS(AWS Key Management Service)を用いたデータの暗号化を

Boto3(Python)でKMS(AWS Key Management Service)を使って暗号化と復号化をしてみた

次の記事などで作り込んでいる仕組みに導入してみました。

“Scheduled Event”の”Lambda”の処理を並列化する

具体的にはAPI GatewayにPOSTされたデータ(valueの部分)をバックエンドの
LamndaにてKMSで暗号化して、SQS、DynamoDBに登録するようにしています。
(下図参照)

Untitled(8) (2)

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が見つからなかったので、
インラインポリシーで作ってみました

2015-10-11_21-34-05

便利なPolicy Generatorで作成します。

2015-10-11_21-35-14

KMSのencryptとdecryptを許可してます。

2015-10-11_21-36-57

下部に反映されてます。

2015-10-11_21-38-51

JSONで確認です。

2015-10-11_21-39-42

無事、適用完了です。

2015-10-11_21-40-50

テスト

実際にAPI GatewayにデータをポストするとSQSにも暗号化&エンコードされたデータが
登録されていることがわかります。

2015-10-12_00-02-06

少し時間が経つと、DynamoDBにも登録出来てることが確認できます。

2015-10-12_01-10-12

下記コードでちゃんとデコードできていることも確認できました。

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″が表示されました。

元記事はこちら

Lambda(Python)でデータをKMSで暗号化してSQSに登録する