Hono + Lambda で cdkd(CDK Direct)を試してみた
cdkd(CDK Direct)をXで見かけて、Hono + Lambdaの最小構成でbootstrapからdestroyまで一通り試した記録。deployが体感で速く、一方でCloudFormationを経由しないぶんadmin-equivalentな権限が要る。本格採用はまだ決めていない。
目次
cdkd(CDK Direct)が気になったので触ってみました。Hono の aws-lambda テンプレートの上に CDK スタックを追加し、bootstrap から deployまでを動かしてみました。
やりたかったこと
cdkd は CloudFormation を経由せず AWS SDK を直接呼び出すことでデプロイを高速化する CDK 互換の CLI です。既存の CDK アプリコードはそのままに、cdk deploy を cdkd deploy に置き換えるだけで使える設計になっています。今回は、この一連の流れを Hono + Lambda の最小構成で確かめてみました。
セットアップなどは、CDKとほぼ同じ
まず npm create hono で aws-lambda テンプレートを選び、プロジェクトの雛形を作りました。
npm create hono
✔ Target directory … demo-hono-cdkd
✔ Which template do you want to use? › aws-lambda
続けて cdkd を devDependencies としてローカルにインストールしています。
npm i -D @go-to-k/cdkd
npx cdkd --version
0.283.20
cdkd bootstrap を初回実行すると、state 用・asset 用の S3 バケットと、コンテナアセット用の ECR リポジトリが自動で作られました。
Creating S3 bucket: cdkd-state-11111 in region us-west-2
✓ Enabled bucket versioning
✓ Enabled bucket encryption (AES-256)
✓ Set bucket policy (deny external access)
Creating asset bucket: cdkd-assets-111111-us-west-2 in region us-west-2
Creating container-asset ECR repository: cdkd-container-assets-11111-us-west-2
✓ Bootstrap completed successfully
CDK 側は npx aws-cdk init app --language=typescript でブランクプロジェクトを作り、Lambda 1つと Function URL だけを持つ HonoStack を定義しました。スタック定義自体は普段の CDK と変わりません。
export class HonoStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props)
const handler = new NodejsFunction(this, 'HonoFunction', {
entry: join(__dirname, '../src/index.ts'),
handler: 'handler',
runtime: Runtime.NODEJS_24_X,
architecture: Architecture.ARM_64,
})
const functionUrl = handler.addFunctionUrl({
authType: FunctionUrlAuthType.NONE,
})
}
}
cdkd synth は 71.3kb の index.js を5msでバンドルしました。cdkd deploy は IAM Role・Lambda Function・Function URL など5リソースを、15.15秒で作成しました。
[1/5] ✓ HonoFunctionServiceRoleD3F73849 (AWS::IAM::Role) created
[2/5] ✓ HonoFunctionAFF086E5 (AWS::Lambda::Function) created
[5/5] ✓ HonoFunctioninvokefunctionurl9B400D83 (AWS::Lambda::Permission) created
Duration: 15.15s
Outputs:
HonoStack.FunctionUrl = https://xidg2lprnon3rllb3a3c76br740wpkqo.lambda-url.us-west-2.on.aws/
cdk と cdkd を2回ずつ実行して試してみる
せっかく検証用のスタックを作ったので、CDKとcdkdを比較してみました。とはいえ、npx cdk deploy / npx cdkd deploy / npx cdk destroy / npx cdkd destroy を、それぞれ time を付けて2回ずつ実行するという簡単なものです。
実行結果はこちらでした。
| コマンド | 1回目 | 2回目 |
|---|---|---|
| cdk deploy | 65.23s | 56.30s |
| cdkd deploy | 22.36s | 24.96s |
| cdk destroy | 31.49s | 31.49s |
| cdkd destroy | 13.79s | 13.61s |
deploy も destroy も、cdkd の方が cdk より速い結果になりました。出力を見ている感じとしては、changesetの作成など、CloudFormationをUpdateする前のステップをCDKが処理している段階でcdkdはデプロイが完了しているように感じました。
まとめ
CDKを使ったことがある人なら、本当に手軽に試せそうな感じです。cdkdのBootstrapだけは事前にやっておくほうがいいのかもしれません。あと、CDKのExpress Modeはまだ他mせていないので、その辺の比較も実案件では必要かもしれませんね。
のちほど既存のCDKプロジェクトの移行も試してみようと思います。