🌲

【初心者向け】AWS Lambda 環境変数の転送時の暗号化

2024/08/22に公開

はじめに

本ページは個人の勉強で使用することを目的に作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報についてはAWS公式ドキュメントをご参照ください。

やること

  • AWS Lambdaで環境変数を使用して"Hello World"を出力する関数を作成する。
  • 環境変数はKMSのAWSマネージドキーで転送時の暗号化をする。

1. KMS CMK(カスタマーマネージドキー)の作成

  1. KMSコンソールから以下のCMKを作成します。
  • エイリアス:/mori/lambda/env
  • キーのタイプ:対称
  • キーの仕様:SYMMETRIC_DEFAULT
  • キーの使用法:暗号化および復号化
  • リージョンごと:単一リージョンキー
  1. 作成したKMS CMKキーのARNを控えておきます。

2. Lambda関数用のIAMロール作成

  1. IAMコンソールから以下のIAMロールを作成します。
  • IAMロール名:mori-role-lambda
  • 信頼されたエンティティタイプを選択
    • 信頼されたエンティティタイプ:AWSのサービス
    • ユースケース:Lambda
  • 許可を追加
    • 許可ポリシー:mori-policy-kms


mori-policy-kms

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "kms:ListAliases",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:CreateGrant"
            ],
            "Resource": "${KMSのARN}"
        }
    ]
}

3. Lambda関数の作成

  1. Lambdaコンソールから関数の作成をクリックします。
  2. 以下の設定値を選択して関数の作成をクリックします。
  • 関数の作成:一から作成
  • 基本的な情報
    • 関数名:lambda-env-test
    • ランタイム:Python 3.12
    • アーキテクチャ:x86_64
  • デフォルトの実行ロールの変更
    • 実行ロール:mori-role-lambda ※手順2で作成したロール

4. ソースコードの作成

  1. Lambda関数lambda-env-testのコードソースを作成します。

lambda_function.py

import json
import message

def lambda_handler(event, context):
    
    msg = message.hello()
    
    return {
        'statusCode':200,
        'body':json.dumps(msg)
    }

message.py

import os

def hello():
    greet = os.environ['GREET']
    return greet

5. 環境変数の設定

  1. 設定タブの環境変数から編集をクリックします。

  2. 環境変数の編集画面で以下の環境変数を設定します。

  • キー:GREET
  • 値:Hello World
  • 暗号化の設定
    • 転送時の暗号化
      • 転送時の暗号化に使用するヘルパーの有効化:選択
    • 保管時に暗号化するAWS KMSキー:(デフォルト)aws/lambda


  1. 転送時の暗号化の暗号化ボタンが現れるのでクリックします。

  2. 転送時の暗号化画面で、転送時の暗号化を行うためのAWS KMSキーに/mori/lambda/envを選択します。

  3. シークレットスニペットの復号コードを控え、暗号化をクリックします。

※コード内で暗号化/復号化を行う処理が記載されている。

  1. 元の環境変数の編集画面で、環境変数の値が暗号化されている事を確認して保存をクリックします。

6. ソースコードの修正

  1. message.pyを手順5.5で確認したシークレットスニペットの復号コードを参考に修正し、Deployをクリックする

message.py(修正後)

import boto3
import os
from base64 import b64decode

ENCRYPTED = os.environ['GREET']
# Decrypt code should run once and variables stored outside of the function
# handler so that these are decrypted once per container
DECRYPTED = boto3.client('kms').decrypt(
    CiphertextBlob=b64decode(ENCRYPTED),
    EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']}
)['Plaintext'].decode('utf-8')

def hello():
    return DECRYPTED

コードについて

  • os.environ['GREET']GREETというキーに一致する暗号化された環境変数の値を取得し、変数ENCRYPTEDに代入しています。
ENCRYPTED = os.environ['GREET']


  • boto3.client('kms').decrypt()で暗号化された環境変数の値を復号・デコードし、変数DECRYPTEDに代入しています。
    • 暗号化コンテキストに予約済みの環境変数os.environ['AWS_LAMBDA_FUNCTION_NAME']を使用しています。

予約済みの環境変数

DECRYPTED = boto3.client('kms').decrypt(
    CiphertextBlob=b64decode(ENCRYPTED),
    EncryptionContext={'LambdaFunctionName': os.environ['AWS_LAMBDA_FUNCTION_NAME']}
)['Plaintext'].decode('utf-8')

7. Lambda関数のテスト

  1. テスト実行後、Execution resultタブにHello worldが出力されます。

おわりに

  • 転送時の暗号化の際に使用するAWS KMSキーは**CMK(カスタマーマネージドキー)**のみ選択できます。
    • 保存時の暗号化の場合AWSマネージドキーも使用可能です。
  • Lambdaには予約済みの環境変数がいくつか存在しているようです。

参考

  • Lambdaの環境変数について

https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html?icmpid=docs_lambda_help

  • Lambda予約済みの環境変数について

https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html

  • boto3 kms -decrypt

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/kms/client/decrypt.html

Discussion