在 CDK (Typescript) 中,我正在创建一个 Lambda,前面有一个 API 网关。
AWS 控制台向我显示了一个名为“Invoke URL”的内容,类似于
https://wi4a95skjk.execute-api.us-east-1.amazonaws.com/prod
,它工作正常,正是我所需要的。
然后我尝试将我的自定义 URL 附加到它,如下所示:
const certificate = Certificate.fromCertificateArn(
scope,
`${id}-cert`,
props.certificateArn
);
const domainName = this.addDomainName(`${id}-dn`, {
domainName: `${props.subDomainName}.${props.domainName}`,
certificate,
});
const zone = HostedZone.fromLookup(this, `${id}-hz`, {
domainName: props.domainName,
});
new ARecord(this, `${id}-arecord`, {
zone,
recordName: props.subDomainName,
target: RecordTarget.fromAlias(new ApiGateway(this)),
ttl: Duration.minutes(3),
});
这成功地在区域中创建了一条 A 记录,如下所示:
mysub.example.org A Simple - Yes d-ywfxof47wi.execute-api.us-east-1.amazonaws.com.
(请注意,
—
代表由于某种原因未设置的 TTL。)
我的 URL
mysub.example.org
和 d-ywfx...
废话(指向不同的 IP 地址)当我尝试使用 curl
访问它们时,它们都只是挂起并且不执行任何操作。
这里出了什么问题?
编辑::现在我从
{"message":"Forbidden"}%
url 获取 d-y
;我自己的还挂着。
我的 URL
...只是挂起并且什么也不做mysub.example.org
嗯,我认为没有确凿的证据。您的 CDK 代码包含必要的部分。您的托管区域别名记录指向 API 网关域名。仔细检查引用的证书和托管区域资源。 ARN 使用
fromCertificateArn
引用您的现有证书,CDK 不会验证其值。您现有的托管区域信息通过 fromLookup
引用,CDK 通过 SDK 调用获取一次,然后缓存。检查 cdk.context.json
以确保缓存的区域值是最新的。
我从 d-y 网址获取
;{"message":"Forbidden"}%
这是预料之中的。它是“API 网关域名”值,而不是公开可用的端点。见下文。
请注意,- 代表由于某种原因未设置的 TTL。
这是预料之中的。正如 docs 所说: “如果别名记录指向 AWS 资源,则无法设置生存时间 (TTL);Route 53 使用资源的默认 TTL。”
回顾一下:
domainName
支持RestApi
AWS::ApiGateway::DomainName
资源“API 网关域名”被用作托管区域别名记录的值(见下文)。它的格式为
d-73loomnpd7.execute-api.us-east-1.amazonaws.com
。这不是公开曝光的。
route53.ARecord
构建AWS::Route53::RecordSet
资源有问题中显示的信息。该值引用 API 网关域名(见上文)。
api.url
属性。默认端点是可公开访问的端点。这是您在问题中注意到的
https://wi4a95skjk.execute-api.us-east-1.amazonaws.com/prod
,其中 wi4a95skjk
前缀是 Rest API ID(CDK api.apiId
属性),/prod/
路径是阶段。您可能想要禁用默认端点,因为您(希望🤔)在API前面有一个自定义域。在 CDK 中,您可以在 RestAPI 构造上使用 disableExecuteApiEndpoint: true
来完成此操作。
// Tip: print the URL to the console at deploy time
new cdk.CfnOutput(this, "RestApiUrl", { value: api.url ?? "DISABLED",});