aws-cdk apigateway lambda cors対応
aws-cdkのApigateway&LambdaでCORS対応で詰まったのでメモ。OriginやMethodは適宜修正してください。
- resourceにdefaultCorsPreflightOptionsを渡す
- lambda内で必要なheaderを設定する
フォルダ構成
バージョン
package.json
{ "name": "cdk-test", "version": "0.1.0", "bin": { "cdk-test": "bin/cdk-test.js" }, "scripts": { "build": "tsc", "watch": "tsc -w", "test": "jest", "cdk": "cdk" }, "devDependencies": { "@aws-cdk/assert": "1.95.1", "@types/aws-lambda": "^8.10.73", "@types/aws-sdk": "^2.7.0", "@types/jest": "^26.0.10", "@types/node": "10.17.27", "aws-cdk": "1.95.1", "esbuild": "0", "jest": "^26.4.2", "ts-jest": "^26.2.0", "ts-node": "^9.0.0", "typescript": "~3.9.7" }, "dependencies": { "@aws-cdk/aws-apigateway": "^1.95.1", "@aws-cdk/aws-lambda": "^1.95.1", "@aws-cdk/aws-lambda-nodejs": "^1.95.1", "@aws-cdk/core": "1.95.1", "source-map-support": "^0.5.16" } }
スタック
cdk-test-stack.ts
import * as cdk from "@aws-cdk/core"; import * as apigateway from "@aws-cdk/aws-apigateway"; import * as lambda from "@aws-cdk/aws-lambda"; import { NodejsFunction } from "@aws-cdk/aws-lambda-nodejs"; export class CdkTestStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // The code that defines your stack goes here const prefix = "Playground"; const api = new apigateway.RestApi(this, `${prefix}-Api`, { restApiName: `${prefix}-Api`, }); api.root.addMethod("ANY"); const lambdaFunction = new NodejsFunction( this, `${prefix}-lambdaFunction`, { functionName: `${prefix}-hello`, runtime: lambda.Runtime.NODEJS_14_X, entry: "lambda/hello.ts", handler: "handler", } ); const integration = new apigateway.LambdaIntegration(lambdaFunction); const resource = api.root.addResource("user", { defaultCorsPreflightOptions: { allowOrigins: apigateway.Cors.ALL_ORIGINS, allowMethods: apigateway.Cors.ALL_METHODS, allowHeaders: apigateway.Cors.DEFAULT_HEADERS, disableCache: true, }, }); const getMethod = resource.addMethod("GET", integration); const patchMethod = resource.addMethod("PATCH", integration); } }
Lambda
hello.ts
import { APIGatewayEventRequestContext, APIGatewayProxyEvent, APIGatewayProxyResult, } from "aws-lambda"; export const handler = async ( event: APIGatewayProxyEvent, context: APIGatewayEventRequestContext ): Promise=> { return { statusCode: 200, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD", "Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'", }, body: JSON.stringify({ message: "Hello World", method: event.httpMethod, query: event.queryStringParameters, path: event.path, pathParameters: event.pathParameters, context, }), }; };