如何为 Cloudfront 创建 HttpOrigin 以使用 Lambda 函数 URL?

Sho*_*orn 3 amazon-cloudfront aws-lambda aws-cdk

尝试设置一个Cloudfront行为来使用Lambda 函数 url,代码如下:

    this.distribution = new Distribution(this, id + "Distro", {
      comment: id + "Distro",
      defaultBehavior: {
        origin: new S3Origin(s3Site),
        viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
      },
      additionalBehaviors: {
        [`api-prd-v2/*`]: {
          compress: true,
          originRequestPolicy: originRequestPolicy,
          origin: new HttpOrigin(functionUrl.url, {
            protocolPolicy: OriginProtocolPolicy.HTTPS_ONLY,
            originSslProtocols: [OriginSslPolicy.TLS_V1_2],
          }),
          allowedMethods: AllowedMethods.ALLOW_ALL,
          viewerProtocolPolicy: ViewerProtocolPolicy.HTTPS_ONLY,
          cachePolicy: apiCachePolicy,
        },
Run Code Online (Sandbox Code Playgroud)

functionUrl对象在不同的​​堆栈中创建并传入堆栈cloudformation,定义如下:

    this.functionUrl = new FunctionUrl(this, 'LambdaApiUrl', {
      function: this.lambdaFunction,
      authType: FunctionUrlAuthType.NONE,
      cors: {
        allowedOrigins: ["*"],
        allowedMethods: [HttpMethod.GET, HttpMethod.POST],
        allowCredentials: true,
        maxAge: Duration.minutes(1)
      }
    });
Run Code Online (Sandbox Code Playgroud)

上面的代码失败,因为“参数源名称不能包含冒号”。据推测,这是因为functionUrl.url计算结果类似于https://xxx.lambda-url.ap-southeast-2.on.aws/(注意https://),而HttpOrigin参数应该只是域名,例如xxx.lambda-url.ap-southeast-2.on.aws.

我不能只是编写代码来破解 url (即functionUrl.url.replace("https://", "")),因为当我的代码执行时,值或url属性是像${Token[TOKEN.350]}.

函数 url 工作正常:如果我将 硬编码HttpOrigin为函数 url 的值(即像xxx.lambda-url.ap-southeast-2.on.aws) - 它工作正常。

如何使用 CDK 代码设置从 Cloudfront 到函数 url 的引用?

我使用的是aws-cdk2.21.1版本。


有一个未解决的问题需要添加支持:https ://github.com/aws/aws-cdk/issues/20090

fed*_*nev 11

使用CloudFormation 内部函数解析 url 字符串:

cdk.Fn.select(2, cdk.Fn.split('/', functionUrl.url));

// -> 7w3ryzihloepxxxxxxxapzpagi0ojzwo.lambda-url.us-east-1.on.aws
Run Code Online (Sandbox Code Playgroud)