Mirror of static site repo git.pfy.ch/pfych/static
Something went wrong. Try again.
2.7 kB · 83 lines
TypeScript
at rewrite
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384import { Stack, StackProps, CfnOutput, Duration, Fn } from 'aws-cdk-lib';import { PolicyStatement } from 'aws-cdk-lib/aws-iam';import { Construct } from 'constructs';import { Runtime, FunctionUrlAuthType, InvokeMode,} from 'aws-cdk-lib/aws-lambda';import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';import { Distribution, CachePolicy, AllowedMethods, CacheHeaderBehavior, CacheQueryStringBehavior, CacheCookieBehavior, OriginRequestPolicy,} from 'aws-cdk-lib/aws-cloudfront';import { HttpOrigin } from 'aws-cdk-lib/aws-cloudfront-origins';
export class ApiStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props);
const lambdaFunction = new NodejsFunction(this, 'lambda', { entry: '../packages/api/src/index.lambda.ts', handler: 'handler', runtime: Runtime.NODEJS_22_X, memorySize: 512, timeout: Duration.minutes(1), initialPolicy: [ new PolicyStatement({ actions: ['ssm:GetParameter', 'kms:Decrypt'], resources: [ `arn:aws:ssm:${this.region}:${this.account}:parameter/web-api*`, `arn:aws:kms:${this.region}:${this.account}:alias/aws/ssm`, ], }), ], });
const fnUrl = lambdaFunction.addFunctionUrl({ authType: FunctionUrlAuthType.NONE, invokeMode: InvokeMode.RESPONSE_STREAM, });
const originDomain = Fn.select(2, Fn.split('/', fnUrl.url)); const lambdaOrigin = new HttpOrigin(originDomain);
const distribution = new Distribution(this, 'ApiDistribution', { defaultBehavior: { origin: lambdaOrigin, allowedMethods: AllowedMethods.ALLOW_ALL, cachePolicy: CachePolicy.CACHING_DISABLED, originRequestPolicy: OriginRequestPolicy.ALL_VIEWER_EXCEPT_HOST_HEADER, }, additionalBehaviors: { '/plex/artwork/*': { origin: lambdaOrigin, allowedMethods: AllowedMethods.ALLOW_GET_HEAD, cachePolicy: new CachePolicy(this, 'ArtworkCachePolicy', { cachePolicyName: 'ArtworkCaching', defaultTtl: Duration.days(7), maxTtl: Duration.days(30), minTtl: Duration.seconds(0), headerBehavior: CacheHeaderBehavior.none(), queryStringBehavior: CacheQueryStringBehavior.none(), cookieBehavior: CacheCookieBehavior.none(), }), originRequestPolicy: OriginRequestPolicy.CORS_S3_ORIGIN, }, }, });
new CfnOutput(this, 'lambdaUrl', { value: fnUrl.url!, });
new CfnOutput(this, 'cloudfrontUrl', { value: `https://${distribution.distributionDomainName}`, }); }}