CDKを使ってAPI Gateway + Lambda を作成する方法
API Gatewayの作成
API Gatewayの作成には RestApiクラス で作成します。 LambdaをAPI Gatewayと連携する場合、RestApiオブジェクト の addResouce メソッドで許可するパスを追加します。
例 API Gatewayの作成サンプル
const apiGateway = new RestApi(this, `${PREFIX}TestApiGateway`, {
restApiName: `${PREFIX}TestApiGateway`,
deployOptions: {
stageName: 'v1',
loggingLevel: MethodLoggingLevel.INFO,
metricsEnabled: true,
},
defaultCorsPreflightOptions: {
allowOrigins: Cors.ALL_ORIGINS,
allowMethods: Cors.ALL_METHODS,
allowHeaders: [...Cors.DEFAULT_HEADERS, 'x-requested-witdh'],
exposeHeaders: ['content-dispoition'],
statusCode: 200,
},
// cloudWatchRole: true,
});
const api = apiGateway.root;
// LambdaIntegrationは、API Gateway の Lambda プロキシ統合
api.addResource('hello').addMethod('GET', new LambdaIntegration(lambda));
return apiGateway;
サンプル
VPCとLambdaも含めたサンプル
参考
例 lib/user-stack.ts
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Cors, LambdaIntegration, MethodLoggingLevel, RestApi } from 'aws-cdk-lib/aws-apigateway';
import { Vpc } from 'aws-cdk-lib/aws-ec2';
import { Runtime } from 'aws-cdk-lib/aws-lambda';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
const PREFIX = "TestCA-"
export class CognitoLambdaStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const vpc = this.getVpc();
const lambda = this.getLambda(vpc);
const apiGateway = this.getApiGateway(vpc, lambda);
}
private getVpc(): Vpc {
const vpc = new Vpc(this, `${PREFIX}TestVpc`, {
vpcName: `${PREFIX}TestApiVpc`,
natGateways: 1,
availabilityZones: ['ap-northeast-1a'],
});
return vpc;
}
private getLambda(vpc: Vpc) {
const lambda = new NodejsFunction(this, `${PREFIX}TestLambda`, {
functionName: `${PREFIX}TestLambda`,
entry: 'app/src/lambdaHandler.ts',
depsLockFilePath: 'app/package-lock.json',
handler: 'lambdaHandler',
runtime: Runtime.NODEJS_20_X,
timeout: cdk.Duration.minutes(1),
vpc,
vpcSubnets: {
subnets: vpc.privateSubnets,
},
});
return lambda;
}
private getApiGateway(vpc: Vpc, lambda: NodejsFunction) {
const apiGateway = new RestApi(this, `${PREFIX}TestApiGateway`, {
restApiName: `${PREFIX}TestApiGateway`,
deployOptions: {
stageName: 'v1',
loggingLevel: MethodLoggingLevel.INFO,
metricsEnabled: true,
},
defaultCorsPreflightOptions: {
allowOrigins: Cors.ALL_ORIGINS,
allowMethods: Cors.ALL_METHODS,
allowHeaders: [...Cors.DEFAULT_HEADERS, 'x-requested-witdh'],
exposeHeaders: ['content-dispoition'],
statusCode: 200,
},
// cloudWatchRole: true,
});
const api = apiGateway.root;
// LambdaIntegrationは、API Gateway の Lambda プロキシ統合
api.addResource('hello').addMethod('GET', new LambdaIntegration(lambda));
return apiGateway;
}
}