34
votes

I am creating an api using API Gateway and Lambda. Using the url designated in the API Gateway Stage editor everything works fine; however, when I try and move to a custom domain I am running into some issues.

The first thing I tried was using a CNAME record in Route 53 straight from my domain onto the domain that I got from the API Gateway. That was returning some errors and I think it is the incorrect solution is that correct?

Next I tried the Custom Domain Names feature in API Gateway. My understanding is this will roll up a CloudFront distribution that I can then map onto from Route 53. When I created the custom domain and added a Domain Mapping it provides me with a url to what I assume is a CloudFront distribution. The link is returning a 403 response and no distribution has been made in CloudFront. What is a good way of debugging this problem?

3
You always have a CloudFront distribution when you are using API Gateway, not just when you enable custom URLs. You won't see it in your CloudFront dashboard because it is managed behind the scenes and you don't have direct access to it.Mark B
Okay that makes sense. That and the fact that I wasn't waiting long enough for CloudFront to roll up were the problems. I came in this morning and it was working.BBS
I had this issue and found that waiting till the next morning "resolved" it. I think that the process of creating and assigning the edge domain is very asynchronous.Rich

3 Answers

25
votes

Here is the developer guide if you haven't seen it. http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-custom-domains.html

All you need to do is set up a CNAME with your DNS provider pointing at the CF distribution that API Gateway gives you. You won't be able to make API calls directly to the CF distribution. API Gateway maps the API/stage from the Base Path mapping you set up in API Gateway so only API calls directed at the domain name will work correctly.

28
votes

You need to use host header in your request. Host should be your custom domain.

curl https://<cf-id>.cloudfront.net/myapi -H "Host: api.myapi.com"
12
votes

In my case I had to add base path mapping.