Amazon web services AWS CDK:如何从Route53定位API网关API

Amazon web services AWS CDK:如何从Route53定位API网关API,amazon-web-services,aws-cdk,Amazon Web Services,Aws Cdk,我已经在AWS Route53注册了一个现有域名,并且在API网关中设置了一个自定义域名。在控制台中,我可以进行配置,使xxxxxx.zenxxxxxxfoundry.com从外部实际到达API网关API,然后通过Lambda函数 现在我想用AWS CDK实现这一点 我尝试了以下方法: const zone=route53.HostedZone.fromHostedZoneId(这是'ZenithWebFoundryZone','ZXXXXXX04V8134'); 新路由53.AliasReco

我已经在AWS Route53注册了一个现有域名,并且在API网关中设置了一个自定义域名。在控制台中,我可以进行配置,使xxxxxx.zenxxxxxxfoundry.com从外部实际到达API网关API,然后通过Lambda函数

现在我想用AWS CDK实现这一点

我尝试了以下方法:

const zone=route53.HostedZone.fromHostedZoneId(这是'ZenithWebFoundryZone','ZXXXXXX04V8134');
新路由53.AliasRecord(这是“BlogAPIRecord”{
地带:地带,,
记录名:“xxxxxx.zenxxxxxxfoundry.com”,
目标:{
绑定:():route53.AliasRecordTargetProps=>({
dnsName:'d-xxxxxx y00g.execute api.ap-southerast-2.amazonaws.com',
hostedZoneId:'ZXXXXXX04V8134'
})
}
});
哪个版本正常
npm运行build
,但当我运行
cdk synth
时,我得到一个相当迟钝的错误:

$ cdk synth
HostedZone.fromHostedZoneId doesn't support "zoneName"
Subprocess exited with error 1
打开
--trace
并没有多大帮助:附加信息:

Error: Subprocess exited with error 1
    at ChildProcess.proc.on.code (/Users/mikecoxon/.npm-packages/lib/node_modules/aws-cdk/lib/api/cxapp/exec.ts:108:23)
    at ChildProcess.emit (events.js:189:13)
    at ChildProcess.EventEmitter.emit (domain.js:441:20)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)

我浏览了整个堆栈脚本,没有任何地方提到
zoneName
。有人知道这个错误是从哪里来的吗?

我得到了与以下相同的错误:

const zone=route53.HostedZone.fromHostedZoneId(这是'MyZone','zxxxxxxxxxxxx');
我在53号公路上有一个类似于以下的区域:

Domain Name:    example.com.
Type:           Public Hosted Zone
Hosted Zone ID: ZXXXXXXXXXXXXX
我改为以下内容,它成功了(CDK 0.34.0):

const zone=新路由53.HostedZone提供程序(此{
域名:“example.com”,
}).findAndImport(此“MyZone”);

使用aws cdkv1应能够执行以下操作:

const zone=route53.HostedZone.fromHostedZoneAttributes(这是“ZenithWebFoundryZone”{
hostedZoneId:'ZXXXXXX04V8134',
zoneName:'zenxxxxxxfoundry.com'//此处是您的区域名称
});
新路线53.A记录(这是“BlogAPIRecord”{
区
记录名:“xxxxxx.zenxxxxxxfoundry.com”,
目标:route53.RecordTarget.fromAlias({
绑定(){
返回{
dnsName:'d-xxxxxx y00g.execute api.ap-southest-2.amazonaws.com',//为您的api指定适用的域名。,
hostedZoneId:'XXXX',//指定API的托管区域ID。
};
},
}),
});
如果API位于同一堆栈/代码库中,则可以从中获取
dnsName
hostedZoneId
(它是一个CF属性)

否则,请参阅中的和


注意:别名记录的
hostedZoneId
与您自己区域的托管区域id不相同。

在AWS CDK 0.36.1中,您可以使用@AWS CDK/AWS-route53-targets包创建别名

import { HostedZone, RecordSet, RecordType, RecordTarget } from '@aws-cdk/aws-route53'
import { ApiGatewayDomain } from '@aws-cdk/aws-route53-targets'
import { Certificate } from '@aws-cdk/aws-certificatemanager'

// ...

  const customDomain = new apigateway.DomainName(this, 'CustomDomain', {
    domainName: props.apiDomain,
    certificate: Certificate.fromCertificateArn(this, 'Certificate', props.certificateArn),
    endpointType: apigateway.EndpointType.EDGE,
  })

  const hostedZone = HostedZone.fromHostedZoneAttributes(this, 'HostedZone', {
    hostedZoneId: props.hostedZoneId,
    zoneName: props.hostedZoneName,
  })

  new RecordSet(this, 'ApiRecordSetA', {
    zone: hostedZone,
    recordType: RecordType.A,
    recordName: 'api',
    target: RecordTarget.fromAlias(new ApiGatewayDomain(customDomain))
  })

  new RecordSet(this, 'ApiRecordSetAAAA', {
    zone: hostedZone,
    recordType: RecordType.AAAA,
    recordName: 'api',
    target: RecordTarget.fromAlias(new ApiGatewayDomain(customDomain))
  })

我设法让它工作,但被发现托管区域名称需要在结尾处使用“.”

这适用于手动创建的现有托管区域,需要通过CDK查找以添加别名记录

const hostedZone = route53.HostedZone.fromHostedZoneAttributes(this, 'HostedZone', {
  hostedZoneId: config.apiHostedZoneId,
  name: `${config.apiDomainName}.`,
});

new route53.RecordSet(this, 'ApiRecordSetA', {
  zone: hostedZone,
  recordType: route53.RecordType.A,
  recordName: config.apiDomainName,
  target: route53.RecordTarget.fromAlias(new route53Targets.ApiGatewayDomain(apiDomain))
});

new route53.RecordSet(this, 'ApiRecordSetAAAA', {
  zone: hostedZone,
  recordType: route53.RecordType.AAAA,
  recordName: config.apiDomainName,
  target: route53.RecordTarget.fromAlias(new route53Targets.ApiGatewayDomain(apiDomain))
});

我在使用cdk 1.36.1时也遇到了同样的问题,并在ApiGateway中使用了一个新的自定义域名,以及基本路径映射,然后在route53上的现有托管区域中添加一个CName记录,指向新的自定义域:

从'@aws cdk/aws apigateway'导入{BasePathMapping,DomainName,EndpointType,LambdaRestApi};
从'@aws cdk/aws certificatemanager'导入{Certificate};
从'@aws cdk/aws-route53'导入{HostedZone,CnameRecord}
//首先创建自定义域:
const customDomain=新域名(此“customDomain”{
域名:“api.xxxxxxx.com”,
证书:certificate.fromCertificateEarn(这是“ACM_证书”,ACM_证书),
endpointType:endpointType.EDGE
});
//创建新的ApiGateway实例并将lambda函数与其关联:
const api=new LambdaRestApi(这是“MainGatewayEndpoint”{
handler:toyFunction,
});
//使用BasePathMapping将我们创建的自定义域与新APIGateway关联:
新的BasePathMapping(这是“CustomBasePathMapping”{
域名:自定义,
restApi:api
});
//使用托管分区ID获取对现有托管分区的引用。您可以从route53获取此引用
const hostedZone=hostedZone.fromHostedZoneAttributes(这个'hostedZone'{
hostedZoneId:PROD_HOSTED_ZONE_ID,
zoneName:'xxxxxxx.com'
});
//最后,在托管区域中添加一条CName记录,其值为上面创建的新自定义域:
新的CNAMECORD(这是“ApiGatewayRecordSet”{
地区:霍斯特佐内,,
recordName:'api',
域名:customDomain.domainNameAliasDomainName
});

ZenithWebFoundryZone
是从HostedZoneId方法传入的区域名称吗?文档中说,hostedzoneid的第二个参数是
id
,但没有解释什么的id。不,它实际上是第三个参数。“id”似乎始终是这些工厂方法的第二个参数,大多数示例似乎都将其作为正在生成的构造的句柄。然而,大多数示例实际上并不使用句柄,因此我假设它在生成的云形成模板中有一些应用程序。。。。因为第三个参数是
hostedZoneId
。。。。但是没有关于
id
参数的解释。我在考虑这个问题,我只是害怕尝试,因为我认为它可能会破坏我当前的托管区域,该区域已设置并正在运行。也许我应该闭上眼睛试试?我马上就要确认你的建议了,但是,我似乎是,现在不能执行
cdk synth
。确认这是有效的-非常感谢。我在通过npm更新到0.34.0时遇到了很多问题。我发现
AddressRecordTarget
在我的编辑器中被弃用了。我还不知道用什么替换它-如果可以的话,我会在这里更新。@halfer use
RecordTarget
,更新了