Qiita Advent Calendar 2025
今年もこの季節がいよいよ始まりました ![]()
![]()
![]()
誰よりもこの日を待ちわびていたと自負しております。
2024年12月26日から首を長くして楽しみにしておりました。
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
はじめに
2025年10月、AWSからLambda関数URLの認可モデル変更に関する重要な通知が届きました。この記事では、CDKのバージョンによる挙動の違いを実際に検証します。
- Lambda security notification: 2025年10月27日 午後 4:50:00 UTC+9
- Control access to Lambda function URLs
Amazon Q Developer CLIの全面協力により、作成をしております。
変更内容のサマリー
従来の認可モデル(2025年10月以前)
-
lambda:InvokeFunctionUrlのみで関数URL経由の呼び出しが可能
新しい認可モデル(2025年10月以降)
-
lambda:InvokeFunctionUrlANDlambda:InvokeFunctionの両方が必要 - 2026年11月1日までに対応が必要
CDKでの対応
-
CDK 2.217.0以前: 旧モデル(
lambda:InvokeFunctionUrlのみ) - CDK 2.218.0以降: 新モデル(両方のパーミッション)
検証の目的
- CDK 2.217.0でデプロイした際のリソースポリシーを確認
- CDK 2.218.0+にアップグレード後のリソースポリシーの変化を確認
- 新旧モデルの違いを可視化
検証環境
- AWS CDK: 2.217.0 → 2.218.0+
- Node.js: 22.x
- Lambda Runtime: Python 3.13
- 関数URL AuthType: NONE(パブリックアクセス)
検証用CDKプロジェクトの構成
プロジェクト構造:
lambda-furl-auth-verification/
├── bin/
│ └── app.ts
├── lib/
│ └── lambda-furl-stack.ts
├── lambda/
│ └── handler.py
├── package.json
├── cdk.json
└── tsconfig.json
1. Lambda関数のコード
シンプルなHello World関数:
import json
def handler(event, context):
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
'body': json.dumps({
'message': 'Hello from Lambda Function URL!',
'requestId': context.request_id
})
}
2. CDK Stack定義
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { Construct } from 'constructs';
import * as path from 'path';
export class LambdaFurlStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Lambda関数の作成
const fn = new lambda.Function(this, 'FunctionUrlTestFunction', {
runtime: lambda.Runtime.PYTHON_3_13,
handler: 'handler.handler',
code: lambda.Code.fromAsset(path.join(__dirname, '../lambda')),
timeout: cdk.Duration.seconds(30),
memorySize: 128,
});
// 関数URLの作成(AuthType: NONE)
const fnUrl = fn.addFunctionUrl({
authType: lambda.FunctionUrlAuthType.NONE,
});
// 関数URLを出力
new cdk.CfnOutput(this, 'FunctionUrl', {
value: fnUrl.url,
description: 'Lambda Function URL',
});
// 関数ARNを出力
new cdk.CfnOutput(this, 'FunctionArn', {
value: fn.functionArn,
description: 'Lambda Function ARN',
});
}
}
3. アプリケーションエントリーポイント
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { LambdaFurlStack } from '../lib/lambda-furl-stack';
const app = new cdk.App();
new LambdaFurlStack(app, 'LambdaFurlStack', {
env: {
account: process.env.CDK_DEFAULT_ACCOUNT,
region: process.env.CDK_DEFAULT_REGION,
},
});
4. package.json(CDK 2.217.0固定)
{
"name": "lambda-furl-auth-verification",
"version": "1.0.0",
"description": "Lambda Function URL Authorization Model Change Verification",
"devDependencies": {
"@types/node": "^22.0.0",
"typescript": "^5.0.0",
"aws-cdk": "^2.160.0"
},
"dependencies": {
"aws-cdk-lib": "2.217.0",
"constructs": "^10.0.0",
"source-map-support": "^0.5.21"
}
}
5. その他の設定ファイル
{
"app": "npx ts-node --prefer-ts-exts bin/app.ts",
"context": {
"@aws-cdk/aws-lambda:recognizeLayerVersion": true,
"@aws-cdk/core:checkSecretUsage": true,
"@aws-cdk/core:target-partitions": ["aws", "aws-cn"]
}
}
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"lib": ["es2020"],
"declaration": true,
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"noImplicitThis": true,
"alwaysStrict": true,
"noUnusedLocals": false,
"noUnusedParameters": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": false,
"inlineSourceMap": true,
"inlineSources": true,
"experimentalDecorators": true,
"strictPropertyInitialization": false,
"typeRoots": ["./node_modules/@types"]
},
"exclude": ["node_modules", "cdk.out"]
}
検証手順
Phase 1: CDK 2.217.0でのCloudFormationテンプレート生成
# プロジェクトのセットアップ
cd lambda-furl-auth-verification
npm install
# TypeScriptコンパイル確認
npx tsc
# CloudFormationテンプレート生成
npx cdk synth
Phase 2: Permissionリソースの確認(CDK 2.217.0)
# 生成されたテンプレートからPermissionリソースを抽出
cat cdk.out/LambdaFurlStack.template.json | jq '.Resources | to_entries | .[] | select(.value.Type == "AWS::Lambda::Permission")'
期待される結果(CDK 2.217.0):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "FunctionURLAllowPublicAccess",
"Effect": "Allow",
"Principal": "*",
"Action": "lambda:InvokeFunctionUrl",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:LambdaFurlStack-FunctionUrlTestFunction-XXXXX",
"Condition": {
"StringEquals": {
"lambda:FunctionUrlAuthType": "NONE"
}
}
}
]
}
重要ポイント: lambda:InvokeFunctionUrl のみが付与されている
Phase 3: CDK 2.218.0+へのアップグレード
# package.jsonを編集
# "aws-cdk-lib": "2.217.0" → "aws-cdk-lib": "^2.218.0" (2.218.0以上)
# 注意: aws-cdk (CLI) はそのままでOK
rm -rf node_modules
# 依存関係の更新
npm install
# CloudFormationテンプレート再生成
npx cdk synth
Phase 4: Permissionリソースの再確認(CDK 2.218.0+)
# 生成されたテンプレートを確認(Permissionが2つになっているはず)
cat cdk.out/LambdaFurlStack.template.json | jq '.Resources | to_entries | .[] | select(.value.Type == "AWS::Lambda::Permission")'
期待される結果(CDK 2.218.0+):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "FunctionURLAllowPublicAccess",
"Effect": "Allow",
"Principal": "*",
"Action": "lambda:InvokeFunctionUrl",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:LambdaFurlStack-FunctionUrlTestFunction-XXXXX",
"Condition": {
"StringEquals": {
"lambda:FunctionUrlAuthType": "NONE"
}
}
},
{
"Sid": "FunctionURLInvokeAllowPublicAccess",
"Effect": "Allow",
"Principal": "*",
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:LambdaFurlStack-FunctionUrlTestFunction-XXXXX",
"Condition": {
"Bool": {
"lambda:InvokedViaFunctionUrl": "true"
}
}
}
]
}
重要ポイント: lambda:InvokeFunction が追加されている
AWS Consoleでの確認方法
実際にデプロイした場合、AWS Consoleでも確認できます:
Lambda関数 > Configuration > Permissions > Resource-based policy statements
ここに表示されるポリシーが、CloudFormationのAWS::Lambda::Permissionリソースに対応します。
-
CDK 2.217.0: Statement が 1つ(
lambda:InvokeFunctionUrlのみ) -
CDK 2.218.0+: Statement が 2つ(
lambda:InvokeFunctionUrl+lambda:InvokeFunction)
検証結果の比較表
| 項目 | CDK 2.217.0 | CDK 2.218.0+ |
|---|---|---|
lambda:InvokeFunctionUrl |
✅ 付与 | ✅ 付与 |
lambda:InvokeFunction |
❌ なし | ✅ 付与 |
lambda:InvokedViaFunctionUrl 条件 |
❌ なし | ✅ あり |
| Permissionリソース数 | 1個 | 2個 |
| 2026年11月以降の動作 | ⚠️ 非推奨 | ✅ 推奨 |
重要な考察
1. lambda:InvokedViaFunctionUrl 条件の意味
新しいモデルでは、lambda:InvokeFunction に lambda:InvokedViaFunctionUrl: true という条件が付与されます。これにより:
- ✅ 関数URL経由の呼び出しは許可
- ❌ AWS SDK/CLI経由の直接呼び出しは拒否
つまり、関数URLのみに限定したアクセス制御が実現されます。
2. セキュリティ上の改善点
旧モデルでは lambda:InvokeFunctionUrl のみで呼び出し可能でしたが、新モデルでは:
- より明示的な権限管理
- 呼び出し経路の制限が可能
- 意図しない呼び出し方法の防止
3. 移行期間と猶予措置
- 2025年10月: 新モデル開始
- 2026年11月1日: 移行期限
- 既存の関数URLには一時的な例外措置が適用されている
まとめ
この記事で確認できたこと
- ✅ CDK 2.217.0では
lambda:InvokeFunctionUrlのみ生成される - ✅ CDK 2.218.0+では
lambda:InvokeFunctionも追加される - ✅
npx cdk synthだけで検証可能(AWSデプロイ不要)
やるべきこと
- ✅ CDK 2.218.0以上にアップグレード
- ✅
npx cdk synthでCloudFormationテンプレート確認 - ✅ 既存の関数URLをデプロイし直す
やってはいけないこと
- ❌ CDK 2.217.0以前のまま放置
- ❌ 2026年11月1日を過ぎてから対応
参考リンク
おわりに
Lambda関数URLの認可モデル変更は、セキュリティ強化のための重要なアップデートです。CDK 2.218.0以降を使用することで、自動的に新しいモデルに対応できます。
2026年11月1日までに対応を完了させましょう!🔥
来年の話をすると、鬼に笑われますが、動かなくなるまで放置すると、上司に鬼のように怒られますので、早めの対策を!
さいごにタイトル「AWSを使うならCDK使ったほうがよいと思った事例」の回収です。CDKを使うとベストプラクティスやセキュリティアップデートがライブラリに組み込まれています。ですから、AWSを使うならCDK使ったほうがよいと思いました。
