share facebook facebook twitter menu hatena pocket slack

2015.12.14 MON

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

鈴木 宏康

WRITTEN BY 鈴木 宏康

下記の記事で試した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に登録する

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。