Lambda Function URLs を AWS CDK で設定する (v2.21.0 以降)

2022.04.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS CDK v2.21.0 の新機能として、Lambda Function URLs の L2 Construct が実装されました。

これにより AWS CDK 環境でも Lambda 関数に Function URL を設定するのが簡単になりました。

やってみる

以下のようなスタックを作成します。

lib/my-stack.ts

import { Stack, StackProps } from "aws-cdk-lib";
import { Architecture, FunctionUrlAuthType } from "aws-cdk-lib/aws-lambda";
import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
import { Construct } from "constructs";

export class MyStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const lambda = new NodejsFunction(this, "main", {
      entry: "./src/index.ts",
      handler: "handler",
      architecture: Architecture.ARM_64,
    });
    const url = lambda.addFunctionUrl({
      authType: FunctionUrlAuthType.NONE,
      cors: {
        allowedMethods: [HttpMethod.ALL],
        allowedOrigins: ["https://dev.classmethod.jp"],
      },
    });
  }
}

authType はデフォルトでは AWS_IAM ですが、今回のアプリに認証は不要なので NONE を指定しています。
CORS の設定も cors プロパティで可能です。

src/index.ts に Lambda 関数のハンドラを記述します。

src/index.ts

import { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from "aws-lambda";

export const handler = async (
  event: APIGatewayProxyEventV2
): Promise<APIGatewayProxyResultV2> => {
  return {
    headers: {
      "Content-Type": "application/json",
    },
    statusCode: 200,
    body: JSON.stringify({
      message: "hello, world",
      path: event.rawPath,
    }),
  };
};

適当なメッセージと URL のパスを JSON で返すだけのかんたんなプログラムです。
Lambda Function URLs のイベントの形式は API Gateway V2 と同じ形式のため、API Gateway 用のハンドラをそのまま流用できます。

あとは cdk deploy をして待つだけです。

実行

マネジメントコンソールなどから関数 URL を確認して、ブラウザなどでアクセスしてみましょう。

きちんとパスも取れていますね。

まとめ

AWS CDK での L2 Construct のサポートによって Lambda Function URLs がより簡単に利用できるようになりました。
Webhook アプリなどがより一層かんたんに構築できるようになると思います。

参考記事