the-ldk
Version:
Welcome to the LDK! A collection of custom AWS CDK constructs to help you build serverless applications faster.
144 lines (127 loc) • 3.73 kB
text/typescript
import { Construct } from 'constructs';
import {
ApiKey,
BasePathMapping,
DomainName,
Resource,
RestApi,
UsagePlan,
AuthorizationType,
} from 'aws-cdk-lib/aws-apigateway';
import { ApiGatewayProps } from '../../types/APIGateway.type';
export class APIGateway extends Construct {
public readonly restAPI: RestApi;
public readonly apiKey: ApiKey;
public readonly usagePlan: UsagePlan;
public readonly versionPath: Resource | undefined;
constructor(scope: Construct, id: string, props: ApiGatewayProps) {
super(scope, id);
const {
serviceName,
rateLimit = 100000,
burstLimit = 1000,
restApiProps,
apiKeyRequired = true,
version,
customDomainName,
domainNameAliasTarget,
domainNameAliasHostedZoneId,
corsOptions,
customDomainCertificate,
enableTracing = false,
loggingLevel = 'INFO',
dataTraceEnabled = false,
authorizer,
env,
} = props;
const defaultDeployOptions = {
stageName: env,
tracingEnabled: enableTracing,
loggingLevel: loggingLevel.toUpperCase() as any,
dataTraceEnabled: dataTraceEnabled,
};
const defaultMethodOptions = {
apiKeyRequired,
authorizer: authorizer,
authorizationType: authorizer ? AuthorizationType.CUSTOM : undefined,
};
this.restAPI = new RestApi(this, `${serviceName}-restAPI-${env}`, {
...restApiProps,
deployOptions: {
...defaultDeployOptions,
...(restApiProps && restApiProps.deployOptions),
},
defaultMethodOptions: {
...defaultMethodOptions,
...(restApiProps && restApiProps.defaultMethodOptions),
},
});
this.apiKey = new ApiKey(this, `${serviceName}-apiKey-${env}`, {
apiKeyName: `${serviceName}-apiKey-${env}`,
generateDistinctId: true,
stages: [this.restAPI.deploymentStage],
});
this.usagePlan = new UsagePlan(this, `${serviceName}-usagePlan-${env}`, {
name: `${serviceName}-${env}`,
throttle: {
rateLimit,
burstLimit,
},
apiStages: [
{
stage: this.restAPI.deploymentStage,
},
],
});
this.usagePlan.addApiKey(this.apiKey);
if (customDomainName) {
if (!domainNameAliasTarget || !domainNameAliasHostedZoneId) {
throw new Error(
'domainNameAliasTarget and domainNameAliasHostedZoneId must be provided when customDomainName is provided'
);
}
const domainProps: any = {
domainName: customDomainName,
domainNameAliasTarget,
domainNameAliasHostedZoneId,
};
if (customDomainCertificate) {
domainProps.certificate = customDomainCertificate;
}
const customDomain = DomainName.fromDomainNameAttributes(
this,
`${serviceName}-customDomain-${env}`,
domainProps
);
new BasePathMapping(this, `${serviceName}-basePathMapping-${env}`, {
domainName: customDomain,
restApi: this.restAPI,
stage: this.restAPI.deploymentStage,
});
}
if (corsOptions) {
this.restAPI.root.addCorsPreflight({
allowOrigins: corsOptions.allowOrigins,
allowMethods: corsOptions.allowMethods ?? [
'GET',
'POST',
'PUT',
'DELETE',
'OPTIONS',
],
allowHeaders: corsOptions.allowHeaders ?? [
'Content-Type',
'X-Amz-Date',
'Authorization',
'X-Api-Key',
],
});
}
if (version) {
this.versionPath = new Resource(this.restAPI, `${version}Resource`, {
parent: this.restAPI.root,
pathPart: version,
});
}
}
}