如何在 CloudFormation 模板中将多个 URL 传递给 AllowOrigins

How to Pass Multiple URLs to AllowOrigins in CloudFormation Template

我正在使用 YML 格式的 CloudFormation 模板。

根据环境,我需要能够为我的 CorsConfiguration 的 Allowed Origins 属性使用不同的 URL。理想情况下,我想使用这样定义的参数:

  AllowedOrigins:
    Description: Allowed Origins
    Type: String
    AllowedPattern: '.+'

我尝试传入一个分隔字符串(即“http://localhost:4200,http://localhost:4201”),并像这样拆分值:

  OnboardingHttpApi:
    Type: AWS::Serverless::HttpApi
    Properties:
      CorsConfiguration:
        AllowOrigins: !Split [ ",", !Ref AllowedOrigins ]

CloudFormation 中的响应是:

导入期间发现警告:CORS 方案格式错误,忽略。 (服务:AmazonApiGatewayV2;状态代码:400;错误代码:BadRequestException;请求 ID:21072c02-70c3-473d-9629-784005226bd4;代理:null)(服务:null;状态代码:404;错误代码:BadRequestException;请求 ID:空;代理:空)

这是我从 AWS Support 得到的答案:

Split 函数用于将字符串拆分为列表,但不用于引用属性。它旨在与 Select 函数或其他函数一起使用。所以它不是用于引用的 stand-alone 函数。为此,您可以使用 CommaDelimitedList 参数类型。您可以使用 CommaDelimitedList 参数类型在单个参数中指定多个字符串值。传递 CommaDelimitedList 参数值后,您可以稍后在模板中引用它。这是一个有效的 CloudFormation 模板:

AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::Serverless-2016-10-31'
Parameters:
 AllowedOriginsURLs:
   Type: CommaDelimitedList
   Default: 'https://example.com,https://example2.com'
   Description: Please enter your URLs
Resources:
 HttpApi:
   Type: 'AWS::Serverless::HttpApi'
   Properties:
     StageName: my-stage-name
     Tags:
       Tag: MyTag
     StageVariables:
       StageVar: Value
     CorsConfiguration:
       AllowOrigins: !Ref AllowedOriginsURLs
       AllowHeaders: [ x-apigateway-header ]
       AllowMethods: [ GET ]
       MaxAge: 600
       AllowCredentials: true

AllowedOriginsURLs 参数的类型为 CommaDelimitedList,默认值为 'http://localhost:4200,http://localhost:4201'。您可以在启动时更改此参数,然后您可以在 AllowOrigins 上引用 AllowedOriginsURLs。