Lambda Durable Functions の新機能「耐久実行データの暗号化」を試してみた
はじめに
2026年7月22日、AWS Lambda Durable Functions の耐久実行データをカスタマーマネージドキー(CMK)で暗号化できるようになりました。
Lambda Durable Functions の概要は、以下の記事を参照してください。
今回のアップデートによる変更点をまとめます。
| 項目 | 従来(AWS 所有キー) | 新機能(CMK) |
|---|---|---|
| 暗号化方式 | AWS 所有キーで自動暗号化 | カスタマーマネージドキーを指定可能 |
| キーの管理 | AWS 側で完全管理 | ユーザーがキーポリシー・ローテーション・無効化を制御 |
| 参照制御 | 常に全データ返却(制御不可) | IncludeExecutionData パラメータで入出力データの返却を制御 |
| キー無効化時 | 不可(AWS 管理) | 全データアクセス不可(メタデータ含む、本検証時点) |
| CloudTrail 監査 | KMS イベントなし | GenerateDataKey / Decrypt イベント記録 |
| 追加費用 | なし | CMK 保管 $1/月 + API 料金(月 20,000 件まで無料) |
以下、設定から監査までを順に検証します。
検証内容
検証環境
| 項目 | 値 |
|---|---|
| リージョン | ap-northeast-1(東京) |
| Lambda ランタイム | nodejs24.x |
| 関数名 | durable-cmk-test |
| CMK | alias/durable-cmk-test(対称暗号化、単一リージョン) |
| 実行ロール | durable-cmk-test-role |
| 検証日 | 2026-07-23 |
CMK の作成とキーポリシー
耐久実行データの暗号化に使用する対称暗号化キーを作成しました。
aws kms create-key \
--description "Durable Functions CMK test" \
--key-usage ENCRYPT_DECRYPT \
--key-spec SYMMETRIC_DEFAULT
aws kms create-alias \
--alias-name alias/durable-cmk-test \
--target-key-id EXAMPLE-KEY-ID
キーポリシーでは以下の 4 者に権限を付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnableRootAccountAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "AllowLambdaServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": [
"kms:GenerateDataKey",
"kms:Decrypt",
"kms:DescribeKey"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012"
}
}
},
{
"Sid": "AllowExecutionRoleDecrypt",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/durable-cmk-test-role"
},
"Action": "kms:Decrypt",
"Resource": "*"
},
{
"Sid": "AllowCallerDecrypt",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/durable-cmk-test-user"
},
"Action": "kms:Decrypt",
"Resource": "*"
}
]
}
各ステートメントの役割です。
EnableRootAccountAccess— ルートアカウント(アカウント内の IAM ポリシーによる権限委任を含む)にキーの全操作を許可します。キーがロックアウトされることを防ぐための一般的な設定ですAllowLambdaServicePrincipal— Lambda サービスプリンシパルに GenerateDataKey、Decrypt、DescribeKey を許可します。aws:SourceAccount条件で自アカウントからのリクエストに限定していますAllowExecutionRoleDecrypt— Lambda 関数の実行ロールに Decrypt を許可します。リプレイやチェックポイント読み取り時にデータキーを復号するために必要ですAllowCallerDecrypt— GetDurableExecution API の呼び出し元に Decrypt を許可します。IncludeExecutionDataを有効にして実行データを取得する際に必要です
DurableConfig.KMSKeyArn の設定
公式ドキュメントに従い、update-function-configuration で既存の Durable Function に CMK を設定しました。--durable-config は DurableConfig オブジェクト全体を置き換えるため、既存の ExecutionTimeout と RetentionPeriodInDays もあわせて指定します。
aws lambda update-function-configuration \
--function-name durable-cmk-test \
--durable-config '{
"KMSKeyArn":"arn:aws:kms:ap-northeast-1:123456789012:key/EXAMPLE-KEY-ID",
"ExecutionTimeout":3600,
"RetentionPeriodInDays":7
}'
設定後の出力で DurableConfig に KMSKeyArn が追加されていることを確認できます。
update-function-configuration の出力
{
"FunctionName": "durable-cmk-test",
"State": "Active",
"LastUpdateStatus": "Successful",
"DurableConfig": {
"KMSKeyArn": "arn:aws:kms:ap-northeast-1:123456789012:key/EXAMPLE-KEY-ID",
"RetentionPeriodInDays": 7,
"ExecutionTimeout": 3600
}
}
CMK 付き耐久実行の動作確認
CMK 設定後にバージョンを発行し、非同期呼び出しで耐久実行を開始しました。
aws lambda publish-version --function-name durable-cmk-test
aws lambda invoke \
--function-name durable-cmk-test:2 \
--invocation-type Event \
--cli-binary-format raw-in-base64-out \
--payload '{"orderId":"order-12345"}' \
response.json
耐久実行の完了後、list-durable-executions-by-function で耐久実行 ARN を取得します。
aws lambda list-durable-executions-by-function \
--function-name durable-cmk-test:2 \
--statuses SUCCEEDED
取得した ARN を使って get-durable-execution で結果を確認しました。
DURABLE_EXECUTION_ARN="arn:aws:lambda:ap-northeast-1:123456789012:function:durable-cmk-test:2/durable-execution/EXAMPLE-EXECUTION-NAME/EXAMPLE-EXECUTION-ID"
aws lambda get-durable-execution \
--durable-execution-arn "$DURABLE_EXECUTION_ARN" \
--include-execution-data
3 ステップと 10 秒の wait を含む耐久実行が正常に完了し、DurableConfig.KMSKeyArn が結果に含まれていることを確認できました。
get-durable-execution の出力
{
"DurableExecutionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:durable-cmk-test:2/durable-execution/EXAMPLE-EXECUTION-NAME/EXAMPLE-EXECUTION-ID",
"InputPayload": "{\"orderId\":\"order-12345\"}",
"Result": "{\"orderId\":\"order-12345\",\"status\":\"completed\",\"steps\":[...]}",
"Status": "SUCCEEDED",
"StartTimestamp": "2026-07-23T10:13:58.463000+09:00",
"EndTimestamp": "2026-07-23T10:14:10.524000+09:00",
"Version": "2",
"ExecutionDataIncluded": true,
"DurableConfig": {
"KMSKeyArn": "arn:aws:kms:ap-northeast-1:123456789012:key/EXAMPLE-KEY-ID",
"RetentionPeriodInDays": 7,
"ExecutionTimeout": 3600
}
}
キー無効化時のエラー確認
CMK を無効化した場合に耐久実行データへのアクセスがどうなるかを確認しました。
aws kms disable-key --key-id EXAMPLE-KEY-ID
キー無効化後に get-durable-execution を実行すると、即座にエラーが返りました。
An error occurred (KMSDisabledException) when calling the GetDurableExecution operation:
Lambda was unable to access your execution data because the KMS key used is disabled.
Check the KMS key configured in the function's durable config.
KMS Exception: DisabledException
KMS Message: arn:aws:kms:ap-northeast-1:123456789012:key/EXAMPLE-KEY-ID is disabled.
--no-include-execution-data を指定してメタデータのみの取得を試みた場合も、同じ KMSDisabledException が発生します。ドキュメント上は IncludeExecutionData=false で KMS を呼ばないとされていますが、本検証時点では API 自体がエラーを返しました(今後サービス側の挙動が変わる可能性があります)。本検証では、キー無効化前に正常完了していた耐久実行のデータについても、無効化後は同様に KMSDisabledException となりアクセスできませんでした。
IncludeExecutionData の比較
キーを再有効化してから、--include-execution-data と --no-include-execution-data で返却されるフィールドの差を確認しました。
get-durable-execution では、指定値によって返却内容が次のように変わります。
| パラメータ | 返却内容 |
|---|---|
--include-execution-data |
InputPayload, Result, ExecutionDataIncluded=true, メタデータ全て |
--no-include-execution-data |
メタデータのみ(Status, 時刻, Version, DurableConfig)。InputPayload/Result なし。ExecutionDataIncluded=false |
| 指定なし(CLI デフォルト) | --include-execution-data と同じ動作(CLI デフォルトは true) |
同様に get-durable-execution-history でも確認しました。
| パラメータ | Payload フィールド |
|---|---|
--include-execution-data |
各イベントの Payload に JSON 平文 + "Truncated": false |
--no-include-execution-data |
Payload 非表示、"Truncated": true のみ |
--no-include-execution-data を指定した場合、CloudTrail 上で呼び出し元ロールの Decrypt イベントは記録されませんでした(詳細は次節の表を参照)。
CloudTrail での KMS イベント確認
CMK を使用した耐久実行では、CloudTrail に以下の KMS イベントが記録されます。本検証で観測したパターンを示します(データキーキャッシュにより、耐久実行ごとに毎回発生するとは限りません)。
| イベント | 呼び出し元 | タイミング |
|---|---|---|
| GenerateDataKey | AWSService (lambda.amazonaws.com) | 耐久実行開始時(データキー生成) |
| Decrypt | AWSService (lambda.amazonaws.com) | 耐久実行の処理時(データキーの復号) |
| Decrypt | 実行ロール | リプレイ/チェックポイント読み取り時 |
| Decrypt | 呼び出し元ロール | GetDurableExecution(IncludeExecutionData=true)時 |
| Decrypt (DisabledException) | 呼び出し元ロール | キー無効化後の GetDurableExecution 時 |
耐久実行データに対する GenerateDataKey および Decrypt イベントには、以下の encryptionContext が含まれています(キー設定時の DescribeKey イベントには含まれません)。
{
"aws:lambda:FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:durable-cmk-test"
}
実行ロールの Decrypt イベントには inScopeOf フィールドが含まれ、クレデンシャルの発行元関数がバージョン付き ARN で記録されます。どのバージョンの関数からの Decrypt リクエストであるかを追跡できます。
費用
CMK を利用する場合の費用です。
| 項目 | 料金 |
|---|---|
| CMK 保管 | $1/月/キー(時間按分、約 $0.00137/時間) |
| KMS API リクエスト | 月 20,000 件まで無料、超過分 $0.03/10,000 件 |
| Durable Functions CMK 機能 | 追加料金なし |
| 本検証の実コスト | $0.01 未満(API リクエスト計 10 件程度) |
削除予定状態(PendingDeletion)のキーには保管料金が発生しません。料金の詳細は AWS KMS の料金ページ を参照してください。
まとめ
Lambda Durable Functions で、耐久実行データの暗号化にカスタマーマネージドキー(CMK)を利用できるようになりました。
CMK を利用することで、キー管理、アクセス制御、CloudTrail による KMS 操作の監査を、自組織の要件に合わせて行えます。機微な実行データを扱う場合や、暗号化キーの管理・監査要件がある場合に有用です。
一方で、キーの無効化やキーポリシーの変更は、耐久実行の実行やデータ参照へ影響します。本検証では、キー無効化時の IncludeExecutionData=false の挙動にドキュメントとの差異も見られました。
CMK の制御性と、キー管理が耐久実行データの可用性に与える影響を踏まえ、要件に応じて慎重に採用を検討してください。





