AWS CDK 2: Package subpath './aws-cloudfront/lib/experimental' is not defined by "exports" in xxx/node_modules/aws-cdk-lib/package.json

0

I tried creating a demo for VueJS SSR using Lambda@Edge and using AWS CDK v2. The code is below

import { CfnOutput, Duration, RemovalPolicy, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { Bucket } from 'aws-cdk-lib/aws-s3';
import { BucketDeployment, Source } from 'aws-cdk-lib/aws-s3-deployment'
import { CloudFrontWebDistribution, LambdaEdgeEventType, OriginAccessIdentity } from 'aws-cdk-lib/aws-cloudfront';
import { Code, Function, Runtime } from 'aws-cdk-lib/aws-lambda';
import { EdgeFunction } from 'aws-cdk-lib/aws-cloudfront/lib/experimental';

export class SsrStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const bucket = new Bucket(this, 'DeploymentsBucket', {
      websiteIndexDocument: "index.html",
      websiteErrorDocument: "index.html",
      publicReadAccess: false,
      //only for demo not to use in production
      removalPolicy: RemovalPolicy.DESTROY,
    });

    //
    new BucketDeployment(this, "App", {
      sources: [Source.asset("../../web/dist/")],
      destinationBucket: bucket
    });

    //
    const originAccessIdentity = new OriginAccessIdentity(
      this,
      'DeploymentsOriginAccessIdentity',
    );
    bucket.grantRead(originAccessIdentity);

    const ssrEdgeFunction = new EdgeFunction(this, "ssrHandler", {
      runtime: Runtime.NODEJS_14_X,
      code: Code.fromAsset("../../lambda/ssr-at-edge/"),
      memorySize: 128,
      timeout: Duration.seconds(5),
      handler: "index.handler"
    });

    const distribution = new CloudFrontWebDistribution(
      this,
      'DeploymentsDistribution',
      {
        originConfigs: [
          {
            s3OriginSource: {
              s3BucketSource: bucket,
              originAccessIdentity: originAccessIdentity
            },
            behaviors: [
              {
                isDefaultBehavior: true,
                lambdaFunctionAssociations: [
                  {
                    eventType: LambdaEdgeEventType.ORIGIN_REQUEST,
                    lambdaFunction: ssrEdgeFunction.currentVersion,
                  }
                ]
              }
            ]
          }
        ],
        errorConfigurations: [
          {
            errorCode: 403,
            responseCode: 200,
            responsePagePath: '/index.html',
            errorCachingMinTtl: 0,
          },
          {
            errorCode: 404,
            responseCode: 200,
            responsePagePath: '/index.html',
            errorCachingMinTtl: 0,
          }
        ]
      }
    );

    new CfnOutput(this, 'CloudFrontURL', { value: distribution.distributionDomainName });
  }
}

However when I tried deploying it shows something like this

Package subpath './aws-cloudfront/lib/experimental' is not defined by "exports" in /Users/petrabarus/Projects/kodingbarengpetra/vue-lambda-ssr/deployments/cdk/node_modules/aws-cdk-lib/package.json

Here's the content of the package.json

{
  "name": "ssr-at-edge",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "jest --verbose",
    "build": "tsc",
    "watch": "tsc -w",
    "start": "npm run build -- -w"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/aws-lambda": "^8.10.89",
    "@types/node": "^17.0.5",
    "ts-node": "^10.4.0",
    "typescript": "^4.5.4"
  },
  "dependencies": {
    "vue": "^2.6.14",
    "vue-server-renderer": "^2.6.14"
  }
}

Is there anything I miss?

1개 답변
0

The import path for EdgeFunction is aws-cdk-lib/aws-cloudfront/experimental. You can see the api documentation here. https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_cloudfront.experimental.EdgeFunction.html

This means that in code you need to reference it from as below.

...
import { CloudFrontWebDistribution, LambdaEdgeEventType, OriginAccessIdentity, experimental} from 'aws-cdk-lib/aws-cloudfront';
...
const ssrEdgeFunction = new experimental.EdgeFunction(this, 
...

I would also note that it looks like you overwrote your cdk package.json with a vue package.json. It is recommended that you have a separate directory for CDK or init and run your Vue code in a separate sub directory in the CDK directory. An example of this where cdk project is at the root and "application code" like where you would put your Vuejs code is located in the src directory. https://github.com/aws-samples/aws-cdk-examples/tree/master/typescript/lambda-api-ci

AWS
답변함 2년 전

로그인하지 않았습니다. 로그인해야 답변을 게시할 수 있습니다.

좋은 답변은 질문에 명확하게 답하고 건설적인 피드백을 제공하며 질문자의 전문적인 성장을 장려합니다.

질문 답변하기에 대한 가이드라인

관련 콘텐츠