Cloudformation中如何获取Regional AWS API Gateway自定义域的目标域名?

How to get the target domain name of a custom domain for Regional AWS API Gateway in Cloudformation?

我正在尝试在 AWS 上创建一个多区域无服务器应用程序。我已按照 here 给出的说明进行操作。我正在使用无服务器框架,它使用 Cloudformation 脚本在 AWS 上创建所有资源。

我想为 API 网关创建自定义域作为区域端点。当它创建一个区域端点时,它会生成一个目标域。我想知道如何在我的 Cloudformation 脚本中获取目标域的值?

创建边缘优化端点时,我使用 DistributionDomainName 属性获取 CloudFront 部署的值。但是在创建区域端点时,我没有看到目标域名的任何属性。我尝试对区域端点使用 DistributionDomainName 属性,但它抛出一个错误,指出没有 DistributionDomainName.

下面是我的脚本的一部分 -

# Creates a custom domain for the ApiGateway
customDomain:
  Type: 'AWS::ApiGateway::DomainName'
  Properties:
    DomainName: ${self:custom.domain}
    EndpointConfiguration:
      Types:
        - REGIONAL
    RegionalCertificateArn: ${self:custom.certificateArn}

# Insert a DNS record in route53 hosted zone to redirect from the custom domain to CF distribution
dnsRecord:
  Type: AWS::Route53::RecordSet
  Properties:
    Region: ${self:provider.region}
    SetIdentifier: ${self:provider.region}
    HostedZoneId: ${self:custom.hostedZoneId}
    Name: ${self:custom.domain}
    Type: CNAME
    TTL: 60
    ResourceRecords:
      - "Fn::GetAtt": [customDomain, DistributionDomainName]

请帮忙。谢谢!

更新

Cloudformation现在returns区域域名通过RegionalDomainName属性。它可以用作 Fn:GetAtt : [customDomain, RegionalDomainName].

我在云编队中编写脚本时遇到了同样的问题。当我阅读更多相关信息时,根据我的研究,到目前为止,区域端点没有受支持的 Return 值。

您可以通过 Python 脚本使用 AWS Lambda 创建自定义资源来读取区域端点,这样您的自动化就不会因 return 值不可用而中断。

client = boto3.client('apigateway') response = client.get_domain_name( domainName='api.example.com' ) print(response['regionalDomainName'])

目前无法做到。

如您所述,唯一公开的参数是 DistributionDomainName,这仅适用于边缘优化端点。

作为解决方法(直到它将在 CloudFormation 中实施),您可以使用 CustomResource backed up by your own Lambda function to return the regionalDomainName 属性。

这是执行此操作的示例 CloudFormation YAML 代码:

Resources:
  # The workaround Lambda that returns the regionalDomainName property
  RegionalDomainLambda:
    Type: AWS::Lambda::Function
    Properties:
      Runtime: python2.7
      Handler: index.handler
      Role:
        'Fn::GetAtt': [YOUR_ROLE_GOES_HERE, Arn] # make sure you include apigateway:GET
      Timeout: 50
      Code:
        ZipFile: |
          import cfnresponse
          import json
          import boto3

          client = boto3.client('apigateway')
          def handler(event, context):
              response_data = {}
              try:
                  domainName = event['ResourceProperties']['DomainName']
                  regional_domain_name = client.get_domain_name(domainName=domainName)['regionalDomainName']
                  response_data['value'] = regional_domain_name

                  cfnresponse.send(event, context, cfnresponse.SUCCESS,response_data, "RegionalDomainNameString")
              except Exception as e:
                  response_data['exception'] = e
                  cfnresponse.send(event, context, cfnresponse.FAILED, response_data, "RegionalDomainNameString")

  # The resource that serves as a placeholder
  RegionalDomain:
    Type: Custom::CustomResource
    Properties:
      ServiceToken:
        'Fn::GetAtt': [RegionalDomainLambda, Arn]
      DomainName: {Ref: YOUR_API_GATEWAY_DOMAIN_NAME_GOES_HERE}

  # And here's how to use it
  SomeOtherResource:
    SomeOtherProperty: {'Fn::GetAtt': [RegionalDomain, value]}