y-ohgi's blog

TODO: ここになにかかく

Lambdaから直接httpsエンドポイントを生やす

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

料金 - AWS Lambda |AWS

所感

カジュアルに使い捨てのAPIエンドポイントをひとつだけ作りたいというタイミングにピッタリだと感じました。
ただ、そういったユースケースが今まで無かったため利用することがなかったのですが、今後なにかあればmock用途などでスッっと使用したいなと感じました。