AWS CDKでLambda関数URLを使う

はじめに

先日Lambda関数URL(Function URLs)という機能を試してみました。

これを使うとAPI Gatewayを使わずに、Lambdaの設定からURLの発行ができます。

詳しくは公式ドキュメントを確認してください。

Lambda 関数 URL - AWS Lambda

今回は、最初にマネジメントコンソールで機能を試した後、同様の環境をAWS CDKで実装します。

環境

関数URLの有効化(マネジメントコンソール)

早速、機能確認のためマネジメントコンソールから関数URLを有効化してみます。

Lambda関数の作成

まずはLambdaで関数を作成します。

  • 関数名: HelloFunctionURL

  • ランタイム: Python 3.9

詳細設定

詳細設定を確認すると関数URLを有効化があるので有効化します。

  • 認証タイプ: NONE

  • オリジン間リソース共有(CORS): 有効化

これらを入力した後、関数の作成をクリックします。

"Hello from Lambda!"とレスポンスを返すシンプルな関数が作成されます。

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

動作確認

早速、設定タブから関数URLを開くと既に有効化されたURLが記載されています。

URLをクリックすると実行結果が表示されます。

関数URLの有効化にチェックするだけなのでお手軽で良い感じです。

関数URLの有効化(AWS CDK)

同様の実装をCDKでも試してみます。

実装はAWS公式のbuilders.flashの記事を参考にさせて頂きました。

aws.amazon.com

mkdir cdk-lambda-url-test
  • CDKの初期化
cdk init app --language typescript
  • cdk.jsonにリージョン情報を追記
〜〜省略〜〜

    ],
    "context": {
      "region": "ap-northeast-1"
    }
  }
}
  • bin/cdk-lambda-url-test.tsにリージョン情報を追記
const app = new cdk.App();
const stack_region = app.node.tryGetContext("region");
new CdkLambdaUrlTestStack(app, 'CdkLambdaUrlTestStack', {
  env: {
    region: stack_region,
  }
});

CDKのプロジェクト直下にlambdaディレクトリを作成します。

hello.pyの内容は冒頭のサンプルコードをそのまま流用します。

mkdir lambda && touch lambda/hello.py
  • lib/cdk-lambda-url-test-stack.tsにリソースを定義

Lambdaのランタイム設定や関数URLの有効化などを定義します。

デプロイ後に関数URLを知る必要があるのでCfnOutputで出力します。

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { CfnOutput } from 'aws-cdk-lib';


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

    // Lambdaの設定
    const hello = new lambda.Function(this, 'HelloHandler', {
      runtime: lambda.Runtime.PYTHON_3_9,
      code: lambda.Code.fromAsset('lambda'),
      handler: 'hello.handler'
    });

    // 関数URLの設定
    const fnUrl = hello.addFunctionUrl({
      authType: lambda.FunctionUrlAuthType.NONE,
      cors: {
        allowedMethods: [lambda.HttpMethod.ALL],
        allowedOrigins: ["*"],
      },
    });

    // 関数URLの出力
    new CfnOutput(this, 'FuntionUrl', {
      value: fnUrl.url
    });
  }
}
  • cdk Toolkitのデプロイ
cdk bootstrap
  • CDKのデプロイ
cdk deploy

動作確認

デプロイ完了時、コンソールに関数URLが出力されます。

実際にアクセスして"Hello from Lambda!"が表示されることを確認します。

参考

aws.amazon.com