Solución:
Sé que esta es una pregunta antigua, pero estaba enfrentando el mismo problema al usar cdk 1.36.1 y logré resolverlo usando un nuevo nombre de dominio personalizado en ApiGateway, junto con el mapeo de BasePath y luego agregando un registro CName en una zona alojada existente en route53 apuntando al nuevo dominio personalizado:
import {BasePathMapping, DomainName, EndpointType, LambdaRestApi} from '@aws-cdk/aws-apigateway';
import {Certificate} from '@aws-cdk/aws-certificatemanager';
import {HostedZone, CnameRecord} from '@aws-cdk/aws-route53'
// First create a custom domain:
const customDomain = new DomainName(this, 'customDomain', {
domainName: 'api.xxxxxxx.com',
certificate: Certificate.fromCertificateArn(this, 'ACM_Certificate', ACM_CERTIFICATE_ARN),
endpointType: EndpointType.EDGE
});
// create a new ApiGateway instance and associate a lambda function with it:
const api = new LambdaRestApi(this, 'MainGatewayEndpoint', {
handler: toyFunction,
});
// Associate the Custom domain that we created with new APIGateway using BasePathMapping:
new BasePathMapping(this, 'CustomBasePathMapping', {
domainName: custom,
restApi: api
});
// Get a reference to AN EXISTING hosted zone using the HOSTED_ZONE_ID. You can get this from route53
const hostedZone = HostedZone.fromHostedZoneAttributes(this, 'HostedZone', {
hostedZoneId: PROD_HOSTED_ZONE_ID,
zoneName: 'xxxxxxx.com'
});
// Finally, add a CName record in the hosted zone with a value of the new custom domain that was created above:
new CnameRecord(this, 'ApiGatewayRecordSet', {
zone: hostedZone,
recordName: 'api',
domainName: customDomain.domainNameAliasDomainName
});
Con aws-cdk
v0.34.0 debería poder hacer lo siguiente:
const zone = route53.HostedZone.fromHostedZoneAttributes(this, 'ZenithWebFoundryZone', {
hostedZoneId: 'ZXXXXXX04V8134',
zoneName: 'zenxxxxxxfoundry.com' // your zone name here
});
new route53.ARecord(this, 'BlogAPIRecord', {
zone,
recordName: 'xxxxxx.zenxxxxxxfoundry.com',
target: route53.AddressRecordTarget.fromAlias({
bind: (): route53.AliasRecordTargetConfig => ({
dnsName: 'd-xxxxxxy00g.execute-api.ap-southeast-2.amazonaws.com', // Specify the applicable domain name for your API.
hostedZoneId: 'XXXX', // Specify the hosted zone ID for your API.
}),
}),
});
Si su API está en la misma pila / código base, puede obtener el dnsName
y hostedZoneId
de él (es un atributo CF).
De lo contrario, consulte DNSName
y HostedZoneId
en la documentación de AWS :: Route53 :: RecordSet AliasTarget.
Nota: los hostedZoneId
para su registro de alias es no el mismo que el ID de la zona alojada de su propia zona.
En AWS CDK 0.36.1, puede utilizar el paquete @ aws-cdk / aws-route53-targets para crear alias.
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))
})