CDKでやる Lambda Function URLs

最近、CDKいじってなかったのでリハビリを兼ねて前からやってみたかったネタを。

Lambda Function URLs

AWS LambdaはAPIエンドポイントとして利用するケースも多いと思いますが、Lambda Function URLsを利用することでAPI Gatewayを追加することなくHTTPSエンドポイントを設定することができます。API Gatewayの機能を必要としないAPIエンドポイントであればこれ使っておけばOKというものらしいです。

Announcing AWS Lambda Function URLs: Built-in HTTPS Endpoints for Single-Function Microservices | Amazon Web Services
Organizations are adopting microservices architectures to build resilient and scalable applications using AWS Lambda. Th...

CDKでやる

CDKのバージョンは以下。

cdk --version
2.54.0 (build 9f41881)

CDKでは、FunctionUrlが用意されているのでそれを使用します。

class FunctionUrl (construct) · AWS CDK
# class FunctionUrl (construct)
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';

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

    const fn =  new lambda.Function(this, 'LambdaFunction', {
      runtime: lambda.Runtime.PYTHON_3_9,
      handler: 'app.lambda_handler',
      code: lambda.Code.fromAsset('./lambda'),
    });

    const fnUrl = fn.addFunctionUrl({
      authType: lambda.FunctionUrlAuthType.NONE,
    });
    new cdk.CfnOutput(this, 'TheUrl', {
      value: fnUrl.url,
    });
  }
}

Pythonは適当に。

def lambda_handler(event, context):
    return "Hello  world!!"

build後、cdk deploy を行うとURLが出力されます。curl実行でFunctionが実行されていることが確認できます。

Outputs:
LambdaFunctionUrlsStack.TheUrl = https://xxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/

curl https://xxxxxxxxxx.lambda-url.ap-northeast-1.on.aws/
Hello  world!!%

IAM認証する場合

APIエンドポイントを公開する必要がない場合はIAM認証として設定することができます。以下の通り authType をAWS_IAMに変更するだけでOKです。

const fnUrl = fn.addFunctionUrl({
  authType: lambda.FunctionUrlAuthType.AWS_IAM,
});

ポリシーは lambda:InvokeFunctionUrl への許可があればOKだそうです。

Lambda 関数 URL の呼び出し - AWS Lambda
ウェブブラウザ、curl、Postman、または任意の HTTP クライアントを使用して、専用の HTTP エンドポイントを介して Lambda 関数を呼び出します。
Lambda 関数 URL におけるセキュリティと認証モデル - AWS Lambda
リソースベースのポリシーに加え AuthType パラメータを使用して、Lambda 関数 URL へのアクセスを保護および制限します。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunctionUrl",
            "Resource": "*"
        }
    ]
}

署名付きAPIへのアクセスが必要になるのですが、今回はPostmanでやってみました。
適当なIAMユーザーを作ってAccessKey, SecretAccessKeyを作成し、入力していきます。

Postmanでの実行結果

リクエストを投げると無事レスポンスが返ってきました。

タイトルとURLをコピーしました