2015年10月12日月曜日

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


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


便利な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"が表示されました。

0 コメント: