CognitoのカスタムEメール送信者のLambdaトリガーで、AWS Encryption SDK for Pythonを利用して復号してみた

2022.08.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

アノテーションの小川です。

Cognito のカスタムEメール送信者のLambdaトリガーのドキュメントには、 Node.js のサンプルが載っています。
Python のサンプルが載っていなかったので、Python を利用して暗号化された内容を復号してみました。
なお、このブログでは KMS でのキーの作成や Cognito の設定には触れていません。

Lambda

ランタイムは Python3.9 で作成しています。

ソースコード

import aws_encryption_sdk
from aws_encryption_sdk import CommitmentPolicy
import base64

client = aws_encryption_sdk.EncryptionSDKClient(
    commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_ALLOW_DECRYPT
    )

kms_key_provider = aws_encryption_sdk.StrictAwsKmsMasterKeyProvider(key_ids=[
  'arn:aws:kms:ap-northeast-1:xxx:key/xxx'
])

def lambda_handler(event, context):

  code = event["request"]["code"]
  ciphertext = base64.b64decode(code)
  
  plaintext, header = client.decrypt(
                      source=ciphertext,
                      key_provider=kms_key_provider
                    )
  print(plaintext)

主に参考にしたドキュメントは以下です。

カスタム E メール送信者の Lambda トリガー

AWS Encryption SDK for Python のコードの例

レイヤー

上記のソースコードでインポートしている aws_encryption_sdk はデフォルトのLambdaには存在しないため、レイヤーで追加します。
以下の方法でレイヤーを追加しました。

Docker でシミュレートされた Lambda 環境を使用して、Lambda レイヤーを作成する方法を教えてください。

実際には以下のコマンドを実行し、作成した layer.zip を使用してコンソールからレイヤーを作成しました。

mkdir layer
cd layer
echo aws_encryption_sdk > requirements.txt
docker run -v "$PWD":/var/task "public.ecr.aws/sam/build-python3.9" \
/bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"
zip -r layer.zip python > /dev/null

IAM ロール

Lambda を作成する際にデフォルトで付与されるポリシー(CloudWatch Logs へログ出力する権限)に加え、kms:Decrypt も許可しています。

復号できるか試してみた

Cognito のホストされた UI から SignUp を行い、Lambda に渡される暗号化された検証コードを復号できるか試してみます。

Lambda のログを確認すると、b'187857'がログ出力されていました。
187857を入力してみます。

設定していたリダイレクトURLにリダイレクトされ、無事復号できたことがわかりました。

参考資料

カスタム E メール送信者の Lambda トリガー

AWS Encryption SDK とは

AWS Encryption SDK for Python のコードの例

GitHub - aws/aws-encryption-sdk-python

aws-encryption-sdk-python/examples/src

Docker でシミュレートされた Lambda 環境を使用して、Lambda レイヤーを作成する方法を教えてください。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。