В CDK (Typescript) я создаю Lambda с шлюзом API перед ним.
Консоль AWS показывает мне что-то под названием «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
, чтобы убедиться, что значения кэшированной зоны актуальны.
Я получаю
{"message":"Forbidden"}%
с URL-адреса d-y;
Это ожидаемо. Это значение «Доменное имя шлюза API», а не общедоступная конечная точка. См. ниже.
Обратите внимание, что — обозначает TTL, который по какой-то причине не установлен.
Это ожидаемо. Как сказано в документации : «Если запись псевдонима указывает на ресурс 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
в конструкции Rest API.Конечная точка по умолчанию — это общедоступная конечная точка. Это https://wi4a95skjk.execute-api.us-east-1.amazonaws.com/prod
, который вы отметили в своем вопросе, где префикс wi4a95skjk
— это идентификатор Rest API (свойство CDK api.apiId
), а путь /prod/
— это этап. Вероятно, вы захотите отключить конечную точку по умолчанию, потому что у вас есть (надеюсь 🤔) собственный домен перед API. В CDK это можно сделать с помощью disableExecuteApiEndpoint: true
в конструкции RestAPI.
// Tip: print the URL to the console at deploy time
new cdk.CfnOutput(this, "RestApiUrl", { value: api.url ?? "DISABLED",});
Извините, после 3 часов ругани я понял, что в моем тесте была небольшая опечатка. Я устанавливал разрешения на своем шлюзе, а затем пытался получить доступ к URL-адресу Cloudfront. Моя вина, почти полностью. (Я говорю «почти», потому что барочная собачья нашивка, которую представляет собой AWS, дает так много возможностей для поиска…