Daniel Birowsky Popeski
Daniel Birowsky Popeski

Reputation: 9286

How to target Route53 A record to ApiGateway v2

There's an alias for ApiGateway 1, but it's interface doesn't conform to V2:

enter image description here

Here's domainName:

  const domainName = new apigw2.DomainName(config.scope, config.id + 'DomainName', {
    domainName: config.domainName,
    certificate: config.certificate,
  });
  

Upvotes: 2

Views: 1925

Answers (3)

Greg Wozniak
Greg Wozniak

Reputation: 7192

The documentation for Custom Domain is the starting point. However, it does not generate any record in Route53 by default.

To get this sorted for ApiGatewayV2:

  1. Follow the steps as in the mentioned documentation and set up your API Gateway.
  2. You need to use @aws-cdk/aws-route53 and @aws-cdk/aws-route53-targets and the example that mentions API Gateway V2.

So that:

// From the API Gateway setup (step 1)
const apiProdDomain = new DomainName(this, '...', {...})
...  

new r53.ARecord(this, 'YourDomainAliasRecord', {
   zone: yourDomainHostedZone,
   recordName: yourDomainPrefix, // i.e 'api' for api.xxx.com
   target: r53.RecordTarget.fromAlias(new ApiGatewayv2DomainProperties(apiProdDomain.regionalDomainName, apiProdDomain.regionalHostedZoneId)
 })

That's it.

Upvotes: 5

Martin Trenker
Martin Trenker

Reputation: 86

You could try it the way it's described in the documentation for Custom Domain

const certArn = 'arn:aws:acm:us-east-1:111111111111:certificate';
const domainName = 'example.com';

const dn = new DomainName(stack, 'DN', {
  domainName,
  certificate: acm.Certificate.fromCertificateArn(stack, 'cert', certArn),
});
const api = new HttpApi(stack, 'HttpProxyProdApi', {
  defaultIntegration: new LambdaProxyIntegration({ handler }),
  // https://${dn.domainName}/foo goes to prodApi $default stage
  defaultDomainMapping: {
    domainName: dn,
    mappingKey: 'foo',
  },
});

Upvotes: 0

Max Schenkelberg
Max Schenkelberg

Reputation: 855

It doesn't look like aws-route53-targets packages supports apigatewayv2 yet. In the meantime you can probably wrap the v2 object in the v1 interface like this:

new route53.ARecord(config.scope, config.id + "AliasRecord", {
  recordName: config.domainName,
  target: route53.RecordTarget.fromAlias(
    new route53targets.ApiGatewayDomain({
      ...domainName,
      domainNameAliasDomainName: domainName.regionalDomainName,
      domainNameAliasHostedZoneId: domainName.regionalHostedZoneId
    })
  ),
  zone: config.hostedZone
});

Upvotes: 3

Related Questions