TL;DR
- Lambdaからhttpsエンドポイントを生やしてcurlを叩く
- CDKでIaC化する
概要
去年の4月のアップデートでAPI Gatewayを挟まずに、Lambdaから直接httpsエンドポイントを生やすことができるようリリースがありました。
AWS Lambda 関数 URL: Lambda 関数用の組み込み HTTPS エンドポイント
AWS Lambda Function URLs の提供開始: 単一機能のマイクロサービス向けの組み込み HTTPS エンドポイント | Amazon Web Services ブログ
今更ですが、Lambdaでhttpsエンドポイントを生やす機能を利用したいと思います。
Versions
- node
- v20.3.1
- aws-cdk
- 2.86.0
- awscli
- 2.12.6
- Lambda Node.js Runtime
- 18
Repository
learn-aws/lambda-url-function at main · y-ohgi/learn-aws
手順
初期構築
CDKのプロジェクト作成
npx cdk init lambda-url-function --language typescript
CFnのステータスを保管するためのS3を作成
npx cdk bootstrap
Lambdaのコードを用意
以下のJSONをレスポンスとして返すことを目的としたlambda関数を作成します
{"id":1,"name":"john"}
functions/index.ts
import { Handler } from "aws-cdk-lib/aws-lambda" export const handler: Handler = async (event: any, context: any) => { return { "id": 1, "name": "john" } }
CDKでIaCを記述
cdk init
を行った時点で以下のようなディレクトリ/ファイルが作成されます
$ tree -I 'node_modules|cdk.out' . ├── README.md ├── bin │ └── share.ts ├── cdk.json ├── jest.config.js ├── lib │ └── share-stack.ts ├── package-lock.json ├── package.json ├── test │ └── share.test.ts └── tsconfig.json
今回はそのまま bin/share.ts
を使用し、 lib/lambda.ts
というStackを作成し、使用します。
bin/share.ts
がキックスクリプトなので、まずは lib/lambda.ts
でLambdaのStackを定義します。
lib/lambda.ts
import path = require('path'); import * as cdk from 'aws-cdk-lib'; import { FunctionUrlAuthType, Runtime } from 'aws-cdk-lib/aws-lambda'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { Construct } from 'constructs'; export class LambdaStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const lambda = new NodejsFunction(this, "UrlFunction", { entry: path.join(__dirname, "../functions/index.ts"), runtime: Runtime.NODEJS_18_X, handler: "handler", }) lambda.addFunctionUrl({ authType: FunctionUrlAuthType.NONE, }) } }
キックスクリプトへ作成したStackを呼び出し、Lambdaを作成します。キックスクリプトは適宜 cdk.json
の編集を行ってください。
bin/share.ts
#!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import { LambdaStack } from '../lib/lambda'; const app = new cdk.App(); new LambdaStack(app, "LambdaStack")
プロビジョニング
CDKをプロビジョニング
npx cdk deploy
AWSのマネージドコンソールでLambdaが作成されているかを確認し、LambdaのURLを取得します。
取得したURLへローカルからcurlで動作確認をします
$ curl https://<YOUR LAMBDA FUNCTION URL>.lambda-url.ap-northeast-1.on.aws/ | jq { "name": "john", "id": 1 }
削除
CDKでLambdaを削除します
npx cdk destroy
bootstrapで作成したS3の削除は現在Issueが上がっている状態です。
cdk bootstrap - no destroy option · Issue #986 · aws/aws-cdk
料金
Lambdaの関数URL機能はLambdaの実行時間のみで、追加料金は発生しません。
以下、料金ドキュメントからの引用です
AWS Lambda の無料利用枠には、1 か月あたり 100 万件の無料リクエストと、1 か月あたり 40 万 GB-s のコンピューティングタイムが含まれており
最初の60億GB秒/月 | GB-秒あたり 0.0000166667USD | リクエスト 100 万件あたり 0.20USD |
所感
カジュアルに使い捨てのAPIエンドポイントをひとつだけ作りたいというタイミングにピッタリだと感じました。
ただ、そういったユースケースが今まで無かったため利用することがなかったのですが、今後なにかあればmock用途などでスッっと使用したいなと感じました。