最近、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が用意されているのでそれを使用します。
ERROR: The request could not be satisfied
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だそうです。
ERROR: The request could not be satisfied
ERROR: The request could not be satisfied
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunctionUrl",
"Resource": "*"
}
]
}
署名付きAPIへのアクセスが必要になるのですが、今回はPostmanでやってみました。
適当なIAMユーザーを作ってAccessKey, SecretAccessKeyを作成し、入力していきます。
リクエストを投げると無事レスポンスが返ってきました。