Mirror of static site repo git.pfy.ch/pfych/static
Something went wrong. Try again.
3.1 kB · 97 lines
TypeScript
at aria
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798import { 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 { public readonly apiDomain: string;
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`, ], }), ], bundling: { nodeModules: ['@takumi-rs/wasm'], }, });
const fnUrl = lambdaFunction.addFunctionUrl({ authType: FunctionUrlAuthType.NONE, invokeMode: InvokeMode.RESPONSE_STREAM, });
const originDomain = Fn.select(2, Fn.split('/', fnUrl.url)); this.apiDomain = originDomain; const lambdaOrigin = new HttpOrigin(originDomain);
const ArtworkCachePolicy = new CachePolicy(this, 'ArtworkCachePolicy', { cachePolicyName: 'ArtworkCaching', defaultTtl: Duration.days(7), maxTtl: Duration.days(30), minTtl: Duration.minutes(15), headerBehavior: CacheHeaderBehavior.none(), queryStringBehavior: CacheQueryStringBehavior.none(), cookieBehavior: CacheCookieBehavior.none(), });
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: ArtworkCachePolicy, originRequestPolicy: OriginRequestPolicy.CORS_S3_ORIGIN, }, '/og-image/*': { origin: lambdaOrigin, allowedMethods: AllowedMethods.ALLOW_GET_HEAD, cachePolicy: ArtworkCachePolicy, originRequestPolicy: OriginRequestPolicy.CORS_S3_ORIGIN, }, }, });
new CfnOutput(this, 'lambdaUrl', { value: fnUrl.url!, });
new CfnOutput(this, 'cloudfrontUrl', { value: `https://${distribution.distributionDomainName}`, }); }}