代码之家  ›  专栏  ›  技术社区  ›  Shorn

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

  •  0
  • Shorn  · 技术社区  · 4 年前

    正在尝试设置 Cloudfront 使用 Lambda function 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,
            },
    

    这个 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)
          }
        });
    

    上述代码失败,因为“参数源名称不能包含冒号”。 大概是因为 functionUrl.url 评估为 https://xxx.lambda-url.ap-southeast-2.on.aws/ (注意 https:// )而 HttpOrigin 参数应该只是域名 xxx.lambda-url.ap-southeast-2.on.aws 。

    不过,我不能只写代码来破解网址(即。 functionUrl.url.replace("https://", "") )因为当我的代码执行时 url 属性类似于 ${Token[TOKEN.350]} 。

    函数url工作正常:如果我硬编码 HttpOrigin 到函数url的值(例如 xxx.lambda-url.ap-东南-2.on.aws )-效果很好。

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

    我正在使用 aws-cdk 版本2.21.1。


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

    0 回复  |  直到 4 年前
        1
  •  8
  •   fedonev    4 年前

    使用 CloudFormation Intrinsic Functions 要解析url字符串:

    cdk.Fn.select(2, cdk.Fn.split('/', functionUrl.url));
    
    // -> 7w3ryzihloepxxxxxxxapzpagi0ojzwo.lambda-url.us-east-1.on.aws