はじめに
皆さん、あけましておめでとうございます。(もう2月ですが...)
今年もよろしくお願い致します。
先日、今年初の活動として、1/24(土)に群馬県高崎市で開催された「JAWS-UG 北陸新幹線 #5 in 群馬」にて、Lambda Durable Functionsについて発表しました。
https://jawsug-gunma.connpass.com/event/373298/jawsug-gunma.connpass.com
※発表資料はこちら
speakerdeck.com
ただこの発表では実装、特にAWS CDKについて触れられなかったので、この記事で「AWS CDKでLambda Durable Functionsを作成する方法」を紹介したいと思います。
参考サイト
やること
- AWS CDK(aws-cdk-lib)のバージョンアップ&@aws/durable-execution-sdkのインストール
- CDKのコードを書く
- 動作確認
AWS CDK(aws-cdk-lib)のバージョンアップ&@aws/durable-execution-sdkのインストール
Lambda Durable Functionsの作成にはAWS CDKのバージョン2.232以上が必要なので、必要に応じてバージョンアップをしてください。
またLambda Durable Functionのソース作成では「@aws/durable-execution-sdk」が必要なので、上記「参考サイト」のLambda durable functions(AWS公式サイト)を参考にインストールを行ってください。(TypeScriptとPythonがあります)
CDKのコードを書く
Lambda Durable Functionsについては、AWS CDKに専用のコンストラクタがあるわけではなく、Lambdaコンストラクタに専用のpropsを設定する形になります。
詳細は下のソースコードをベースに説明します。 (必要な定義のみ記載)
const durableRole = new Role(this, 'DurableFunctionRole', {
assumedBy: new ServicePrincipal('lambda.amazonaws.com'),
managedPolicies: [
ManagedPolicy.fromAwsManagedPolicyName(
'service-role/AWSLambdaBasicDurableExecutionRolePolicy'
),
],
});
const durableFunc = new NodejsFunction(this, 'DurableFunction', {
entry: path.resolve(__dirname, '../lambda/durable.ts'),
runtime: Runtime.NODEJS_24_X,
timeout: cdk.Duration.seconds(30),
durableConfig: {
executionTimeout: cdk.Duration.minutes(15),
retentionPeriod: cdk.Duration.days(1),
},
role: durableRole,
});
const durableFuncAlias = durableFunc.addAlias("latest");
1.ロールを作成する
Lambda Durable Functionsの実行には、下記アクションの実行権限が必要になります。
- lambda:CheckpointDurableExecution
- lambda:GetDurableExecutionState
これはAWS管理ポリシー「AWSLambdaBasicDurableExecutionRolePolicy」で設定されているので、このポリシーをアタッチしたロールを作成しておきます。
※なお、この「AWSLambdaBasicDurableExecutionRolePolicy」ポリシーには「AWSLambdaBasicExecutionRole」ポリシーの設定も含まれています
2. Lambda Durable Functionsを作成
先述の通り、CDKにはLambda Durable Functions専用のコンストラクタはありません。
ポイントは durableConfig propsで、この定義があるLambda関数はLambda Durable Functionsとして認識されます。
この durableConfig で設定する項目は以下2項目です。(最後の「Q&A」で補足説明をしています)
| 項目 |
説明 |
必須or任意 |
設定範囲 |
| executionTimeout |
Lambda Durable Functionsで作成したワークフローを実行できる最大期間(=ワークフローの生存期間) |
必須 |
1~31,622,400秒(=366日) |
| retentionPeriod |
チェックポイントなどの情報を保存可能な期間 |
任意 |
1~90日(デフォルト14日) |
durableConfig の注意点は、以下2つです。
- 該当Lambda関数の新規作成時に設定する必要があります。
- 一度作成した(デプロイした)Lambda関数に後から「durableConfig」を追加しても、Lambda Durable Functionsとはなりません。
- 逆に、一度作成したLambda Durable Functionsの定義から「durableConfig」を削除しても、通常のLambda関数になるわけではありません。
- その場合「Construct IDが同じ別のLambda関数が定義された」という扱いになり、デプロイエラーになります。
- 上記対策として「Construct IDを変える」「一度Lambda Durable Functionsを削除する」などが必要です。(前者の場合、元のLambda Durable Functionsは手作業で削除が必要)
また実際のLambda Durable Functionsのソースコードですが、下記AWS公式サイトの「2. Paste the following code into the index.mjs tab, replacing the code that Lambda created」に記載のコードをそのままコピペします。
docs.aws.amazon.com
その後 const orderId = event.orderId; のevent.orderId の箇所に、何か適当なorderIdの値を決め打ちで設定しておきます。
Lambda Durable Functionsの実行には「修飾ARN」(バージョン番号付きのARN)が必須となるため、エイリアス(=最新バージョンのエイリアス)を必ず作成しておきます。
なお「修飾ARN」については、最後の「Q&A」で説明します。
動作確認
ここまで来たら、cdk deploy などでデプロイを実施します。
正常にデプロイ出来たら、マネジメントコンソールで該当のLambda Durable Functionsを開き「イベント名」に適当な名前を入れてテストを実行します。
※ durableConfig.executionTimeout を15分より大きい値に設定した場合、非同期実行しかできません

何もなければ、正常終了するはずです。
これでAWS CDKでのLambda Durable Functionsの作成が完了しました。お疲れさまでした。
Q&A
timeoutとexecutionTimeoutの違いは?
それぞれ、下記のとおりです。
| 項目 |
説明 |
最大値 |
| timeout |
(Lambda Durable Functionsの)Lambda関数自体の1回あたりの最大実行時間 |
15分 |
| executionTimeout |
Lambda Durable Functionsで作成したワークフローを実行できる最大期間 |
366日(≒1年) |
注意すべき点として、Lambda Durable Functionsの「最長1年」というのは「waitなどによる実行→中断→再開→中断→再開...を繰り返しながらワークフローを完了させられる期間」(=ワークフローが存在できる期間)が最長1年という事です。
よく「Lambda単体の実行時間が1年になった」と勘違いされますが「Lambda単体の実行時間」は今まで通り最長15分のままです。
retentionPeriodの最大が3か月だけど、ワークフローの実行は最長1年じゃないの?
ワークフローの実行自体は最長1年ですが、各チェックポイントの情報を保存できる期間は(retentionPeriodの)「最長3か月」になります。
これについては「3か月以上も放置されるワークフローなら、むしろ一度リセットして最初からやり直した方が良い」という事かもしれません。(あるいはチェックポイントの情報の保存にかかるコストを加味しての挙動かも)
「修飾ARN」と「非修飾ARN」って何?
「3. エイリアスの作成」で触れた「修飾ARN」について、ARNには「修飾ARN」と「非修飾ARN」の2つがあり、それぞれ以下の通りです。
| 項目 |
説明 |
例 |
| 修飾ARN |
末尾にバージョン番号やエイリアスなどが付いたARN |
arn:aws:lambda:us-east-1:123456789012:function:hogehogefunction:10 |
| 被修飾ARN |
末尾にバージョン番号やエイリアスなどが付かないARN |
arn:aws:lambda:us-east-1:123456789012:function:hogehogefunction |
一般的に「ARN」としてよく利用されるのは「非修飾ARN」ですが、Lambda Durable Functionsの実行には「修飾ARN」での指定が必須となります。
ただ、Lambda関数を変更するたびに変わるバージョン番号を毎回設定するのは面倒なので、エイリアスを作成して毎回最新バージョンが指定されるようにしています。
ちなみに、被修飾ARNでLambda Durable Functionsを実行しようとすると「You cannot invoke a durable function using an unqualified ARN」というエラーが発生します。
また通常のLambdaトリガ起動の設定(API Gateway, S3, Lambda関数URLなど)をCDKに設定した際も、デプロイ時にこのエラーが出ます。
この対策については、次回のブログで記載予定です。
まとめ
以上、AWS CDKでLambda Durable Functionsを作成する方法でした。
今回色々書きましたが、正直AWS CDKでLambda Durable Functionsを作成すること自体はそこまで難しくないと思います。(むしろ難しいのはソースコードの方)
なので、これを機会にまだLambda Durable Functionsに触れたことがない方は、ぜひLambda Durable Functionsに触れてみてはいかがでしょうか?
宣伝
今週2/16(月)~ 2/20(金)のお昼に、弊社(KDDIアジャイル開発センター)にて「KAG AI WEEK」というオンラインイベントを5日連続で開催します。
https://kddi-agile.connpass.com/event/384248/kddi-agile.connpass.com
私も4日目の2/19(木)に「ブログを手書きするのが大変だから、音声AIツール『Wispr Flow』を使って音声入力させてみた話」というタイトルでお話しさせていただきますので、よろしくお願いいたします。(なおタイトルからもわかる通り、AI技術にdeep diveするような内容ではありません)
では、今回はこの辺で。