🌲
【初心者向け】AWS Lambda 環境変数の転送時の暗号化
はじめに
本ページは個人の勉強で使用することを目的に作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報についてはAWS公式ドキュメントをご参照ください。
やること
- AWS Lambdaで環境変数を使用して
"Hello World"
を出力する関数を作成する。 - 環境変数はKMSのAWSマネージドキーで転送時の暗号化をする。
1. KMS CMK(カスタマーマネージドキー)の作成
- KMSコンソールから以下のCMKを作成します。
- エイリアス:
/mori/lambda/env
- キーのタイプ:
対称
- キーの仕様:
SYMMETRIC_DEFAULT
- キーの使用法:
暗号化および復号化
- リージョンごと:
単一リージョンキー
- 作成したKMS CMKキーのARNを控えておきます。
2. Lambda関数用のIAMロール作成
- 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関数の作成
- Lambdaコンソールから関数の作成をクリックします。
- 以下の設定値を選択して関数の作成をクリックします。
- 関数の作成:
一から作成
- 基本的な情報
- 関数名:
lambda-env-test
- ランタイム:
Python 3.12
- アーキテクチャ:
x86_64
- 関数名:
- デフォルトの実行ロールの変更
- 実行ロール:
mori-role-lambda
※手順2で作成したロール
- 実行ロール:
4. ソースコードの作成
- 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. 環境変数の設定
-
設定タブの環境変数から編集をクリックします。
-
環境変数の編集画面で以下の環境変数を設定します。
- キー:
GREET
- 値:
Hello World
- 暗号化の設定
- 転送時の暗号化
- 転送時の暗号化に使用するヘルパーの有効化:
選択
- 転送時の暗号化に使用するヘルパーの有効化:
- 保管時に暗号化するAWS KMSキー:
(デフォルト)aws/lambda
- 転送時の暗号化
-
転送時の暗号化の暗号化ボタンが現れるのでクリックします。
-
転送時の暗号化画面で、転送時の暗号化を行うためのAWS KMSキーに
/mori/lambda/env
を選択します。 -
シークレットスニペットの復号コードを控え、暗号化をクリックします。
※コード内で暗号化/復号化を行う処理が記載されている。
- 元の環境変数の編集画面で、環境変数の値が暗号化されている事を確認して保存をクリックします。
6. ソースコードの修正
- 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関数のテスト
- テスト実行後、Execution resultタブに
Hello world
が出力されます。
おわりに
- 転送時の暗号化の際に使用するAWS KMSキーは**CMK(カスタマーマネージドキー)**のみ選択できます。
- 保存時の暗号化の場合AWSマネージドキーも使用可能です。
- Lambdaには予約済みの環境変数がいくつか存在しているようです。
参考
- Lambdaの環境変数について
- Lambda予約済みの環境変数について
- boto3 kms -decrypt
Discussion