AWS API Gateway Private API Custom Domain Name - amazon-web-services

AWS Document says,
Custom domain names are not supported for private APIs.
Source: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html
What does this exactly mean? I am able to attach a custom domain name to the Private API.
However I am facing issues with SSL Certificates.

API Gateway has 4 options:
HTTP API
WebSockets API
REST API
REST API Private
REST API Private is the same as REST APIs except it is only accessible from within a VPC. To access the REST API from within the VPC an interface VPC endpoint is required. If you do not use an interface VPC endpoint then you can access the REST API on API Gateway via NAT which goes via the internet gateway or just an internet gateway. In either case this would be a public REST API over the internet.
When using the VPC interface endpoint, AWS generates a custom domain name. This domain name is used within the VPC to locate the endpoint and redirect to the REST API. For this reason you cannot specify your own custom domain name at this time. You can specify a custom domain name for a public facing REST API.
Because you cannot specify your own custom domain name, you cannot use your own custom certificates.
Because the VPC interface endpoint is called API Gateway internally TLS 1.2 is used. This cannot be changed either.
If you want to use your own certificates, then you would need to define your own domain name, and use a public facing REST API defined in API Gateway.
Alternatively you could use a custom domain name internal to your VPC, generate a certificate for this domain name. Put the certificate on a proxy server like NGINX, use the proxy to front the interface endpoint. The interface endpoint uses an Elastic Network Interface (ENI) and therefor has a Security Group, and you can restrict traffic to originate from the proxy using the Security Group. In this case the certificate will reside on the proxy, and TLS will terminate on the proxy server. The proxy server will then access the REST API over a new connection.

One option of using custom domain for private endpoint is to put an (internal facing) application load balancer in front of the API gateway.
When you add a listener to your ALB, you have the option to specify a certificate. Then you point to your ALB with your domain as an alias in Route53.
To summarise:
Create target group that points to the ENI IP addresses of
com.amazonaws.eu-west-1.execute-api
Create internal facing Application Load Balancer
Add the target group as a listener, specify Default SSL/TLS cert
with your domain.
Point your domain to the ALB alias in Route53
Optionally, you could put a Network Load Balancer in front of your
ALB if you need to give the ALB some on-prem address. In that case,
you point your domain to the on-prem (private) address instead of
the ALB alias. Create a new target group that points to your ALB and add it as a listener in NLB.

Related

Is it possible in AWS to put a Network Load Balancer in front of the API Gateway that has private endpoints?

I have the following challenge: we have a VPC with an ApiGateway::RestApi with PRIVATE endpoints (they are only accessible via the VPC,- this is our client's requirement). So the idea is that NLB (accessible from anywhere in the world) will translate the traffic to the API. Is it possible to implement it in AWS?
After reading the documentation, I made the following conclusions.
There is no technical ability to add NLB in front of the API Gateway in AWS. In the documentation they provide approach when API Gateway connects to the Network Load Balancer via VPCLink, but not vice versa. If you try putting NLB in front of API Gateway you should add this API Gateway to a NLB Target group. NLB routes requests to the registered targets in its target group. But API Gateway does not belong to any available target type: Instances, IP addresses, Lambda function, Application Load Balancer. So, it can not be added to any target group.
I will suggest considering the alternative of using NLB in front of API Gateway.

Is it possible to make an AWS HTTP API gateway private?

Using AWS Direct Connect, we've built a network between our on-premise and our AWS VPC. We've developed a web application that users will access from within the on-prem network. We're using the HTTP API Gateway, which uses a VPC Link to connect to the private ALB. We've used a Custom Domain Name with the HTTP API Gateway and disabled the default endpoint. The domain name is registered in a private hosted zone on Route 53.
We want to keep all the traffic between the clients and the API Gateway within our private network. However, we can see that the requests going to the HTTP API Gateway leave our network because the custom domain name for the API Gateway resolves to a public IP address.
Is there a way to assign a private IP address to the HTTP API Gateway? Or any other way to keep the traffic within our network?
One option is to switch to the REST API Gateway and make its endpoint type Private. However, the HTTP API Gateway suits our needs much better with its simplicity. It also has the option for connectivity to an ALB using VPC Link, which the REST Gateway lacks.
Sadly no, the HTTP APIs do not support Private APIs. Whatever solution you will use, HTTP API endpoint must be public.
You have to use REST API, or create your own fully custom solution if REST API is out of question.
I want to provide an update to this topic.
AWS updated its product and private endpoints are available right now.
AWS - Private API endpoint
There are also a couple of examples out there also for CDK, Cloudformation or management console.
I hope this helps

AWS API Gateway with VPC Load Balancer redirects to incorrect path (prefix not omitted)

I want to use API Gateway to route between multiple microservices. E.g: domain.com/app1, domain.com/app2 etc.
Each service has an internal Application Load Balancer (ALB).
API Gateway has a VPC Link configured correctly.
The problem is that routes such as domain.com/app1/hello are redirected to internal.app1/app1/hello instead of internal.app1/hello.
Notice that the prefix app1 is not removed.
It can be solved when I use HTTP redirection in API Gateway, but that requires an external load balancer which I want to avoid. I didn't see an option to use path variables with private ALB integration.
Please advise. Thank you in advance.
Problem is solved.
The solution is to use a REST API Gateway (instead of HTTP Gateway) integrated with a Network Load Balancer (NLB) via a VPC Link.
The AWS REST API in AWS API Gateway allows using path variables with private integration (in this case, the NLB).
Summary of the solution:
API Gateway REST API
Private Network Load Balancer
REST API VPC Link (to the NLB)
Use a proxy resource with private integration in the routes configuration

Call AWS Lambda function via public IP address

I am building a webserver with AWS Lambda and I need a public IP address that I can call to request the Lambda function. My users need to put this IP address as an A record into their DNS.
Is it somehow possible, for example, to associate an Elastic IP to a single Lambda function for incoming traffic? Maybe through a load balancer?
For the outgoing traffic I have my NAT and Internet Gateways, which are working fine.
You have 2 choices that can provide this functionality:
API Gateway - This is made for traditional API calls, you will need to create a custom domain mapping to your API within AWS for each domain that will use the API Gateway.
Application Load Balancer - You can use an ALB to have your Lambda as a target for all requests. However, without path based pattern matching be aware that all requests will arrive at the same Lambda.
Both of the above will require that the subdomain is mapped by a CNAME rather than an A Record. This is because both of these domains recycle IP addresses on an infrequent basis.
If you absolutely must have the record resolve to an IP you would need to use an NLB in front of you ALB. The NLB supports a static IP per subnet, the ALB would then become its target through IP mapping and an existing AWS service. If you can use CNAMEs then you do not need to do this.

API Gateway with Static Elastic IP

Hi We have an aws API gateway configured with lambda and now want to integrate with a vendor wherein vendor want us to provide him with a Static IP against the API Gateway that we have. As per my knowledge API gateway serves request through Dynamic Elastic IP which are listed here
Is there a way to achieve this other than putting a forward proxy or NLB.
You cannot get a static IP if you are using a public API Gateway endpoint (Regional or Edge-optimized). The IPs allocated for APIs in any AWS region can be changed at any time and are a very wide range.
However, if you were to use a private API Gateway endpoint, you could use the below set up -
Client --> NLB(public static IP) --> VPC endpoint for API Gateway --> Private API
The execute-api VPC endpoint have a fixed IP address allocated from the VPC CIDR range. Having a NLB as a front-end(with a public static IP), you can add these IP addresses as targets in your NLB config.
You can also use a static IP proxy service such as QuotaGuard. I use that to deal with services that want to whitelist my IP when using dynamic DNS.