AWS VPC with both internet gateway and NAT - amazon-web-services

I am lost on how to provide outbound internet access to AWS Lambda in our VPC while also having internet gateway to support inbound access (from Internet) to certain resources in our VPC.
From the documentation provided (below), I understand we need to create a private and public subnet (with NAT), and have one route table pointing to IGW, and another to the NAT.
https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/
Our setup is as follows.
VPC
Private subnet
Public subnet
Route Table
Table1
Public subnet
0.0.0.0/0 - IGW
Table2
Private subnet
0.0.0.0/0 - NAT
Lambda
VPC
Private subnet
RDS (Need access from outside of VPC)
Under VPC
With this setup, Lambda can access internet but the setup stops external inbound access to our resources in the VPC.
If we reroute our 0.0.0.0/0 in our private subnet to IGW, we can access our resources in VPC from external network but the Lambda loses connectivity to Internet.
Any one has clarity on how to set this up?
Appreciate any views on this.

Just move the resources that need to be publicly accessible into a public subnet (a subnet with a route to the Internet Gateway). The Lambda function has to remain in a private subnet (a subnet with a route to a NAT Gateway).
So in your case the RDS instance should be in the public subnet, and the Lambda function should be in the private subnet.

Related

what is the usage of CIDR notation route rule in aws

I have created a VPC and internet gate way. And attached internet gateway to the vpc. Create two subnets one is public subnet and another is private subnet. And created a route table to route the traffic. In route table added a route rule 0.0.0.0/0 to IGW(internet gatway). To test this I launch a EC2 instance in public subnet. I have generated a public IP address example : (554.6.8.24). Using that IP address do ssh and I am connecting from local machine to EC2 instance.
My question is I am connecting to the EC2 instance from my local machine using public IP. What is the point of adding route rule in 0.0.0.0/0 to IGW(internet gatway) in route table?. With out route rule can I connect to Ec2?
If an Internet Gateway is not present in an Amazon VPC, then that VPC has no connection to the Internet. This can be very useful for creating private networks.
If you want to connect a VPC to the Internet, then you need to:
Create an Internet Gateway for that VPC
Create a Route Table that sends traffic to the Internet Gateway
Attach the Route Table to a Subnet (thereby making that subnet a Public Subnet since it routes to the Internet Gateway)
Put resources inside the Public Subnet (eg EC2 instances)
In contrast, Private subnets do not have a Route Table entry that points to an Internet Gateway. Therefore, those subnets cannot access the Internet. This is an added layer of security to prevent access to private resources.
The only difference between a Public Subnet and a Private Subnet is having the Route Table entry that points to an Internet Gateway. Without that entry, a subnet will remain private.

Peering AWS VPC private to NAT

I have two VPC's in VPC1 in public subnet there is NAT GAteway for private subnet to go to internet... in VPC2 private subnet I have EC2 instance that needs to go to internet but i don't want to put NAT gateway or NAT instance in the public subnet of VPC2 if there is a way to sent traffic through peering and use NAT gateway in VPC1?
Unfortunately there is not supported as VPC peering is not transitive as explained here:
If either VPC in a peering relationship has one of the following connections, you cannot extend the peering relationship to that connection:
An internet connection in a private subnet through a NAT device
Also:
Similarly, if VPC A has a NAT device that provides internet access to instances in private subnets in VPC A, instances in VPC B cannot use the NAT device to access the internet.

AWS VPC - Private subnet added to the public route table attached to internet gateway

Hope you are all doing good.
AWS allows us to attach a private subnet (created in a Customer VPC) with a route table having route to the internet via internet gateway. Does it make any difference to the instance launched in the private sub-net? or it is as good as having the private subnet not linked to the route table having route to the internet
Regards
AJ
A subnet is not private if it has routes to/from the internet. The instances launched in a private subnet cannot access the internet and cannot be reached from the internet.
For e.g if you have a database instance and you don't want anyone but the instances to access the instance, you can launch the instance in the private subnets.
Also if you want the instances in the private subnet to access internet, you need to setup a Nat Gateway (or a Nat Instance)
Hope this helps
First, we need to know what's the difference between a public subnet and a private subnet.
Public Subnet means this subnet has an Internet Gateway attached to it.
Private Subnet means this subnet has a NAT Gateway attached to it.
And the Internet Gateway can have both inbound and outbound but the NAT only can have outbound to the Internet.
And A NAT will be built in a public subnet but attach to a private subnet.
You can have lots of public/private subnets at the same time and attached NAT or IGW for them, but the IGW only can have one in each VPC.
In some use cases, we will not attach any kinds of NAT and IGW for a subnet. that's because it might be a database subnet and won't expect it to communicate with the Internet.
Normally, we will use a subnet with NAT attached for our application such as EC2 or ECS, Internal Load Balancers.
On the other hand, we will use a subnet with IGW attached for Internet-facing Load balancers, Nginx, Apache.
AWS VPC Design:
https://aws.amazon.com/tw/answers/networking/aws-single-vpc-design/
I think the hidden magic here is that the instance in the private subnet needs a public IP to communicate with outside, we never ever think this an issue in our lives. When our computer connect to the router, it get access to internet without any issue, why it works so smoothly? All because the router handles everything for us, including allocating a private IP for us, making recursively DNS query for us, and the most important, translating the private IP using the router's public IP so that our computer can communicate with the outside bidirectionally.
Let's go back to this AWS VPC scenario, you attached a route table with a default route to the Internet Gateway to your private subnet, which makes it looks like a public subnet. However, the instances still have no public IPs, and, not like our router, the Internet Gateway of AWS VPC doesn't do NAT works! So how can an instance with no public IP and no NAT access the internet? It's impossible.

NAT Gateway with Internet Gateway and lambda

We use elastic beanstalk to run our main application out of EC2, we also have an RDS instance in that VPC. Those instances have public IPs so it can use a standard internet gateway to access the internet. No problems there.
Now I have created a lambda function, associated it with the 3 subnets corresponding to the 3 AZs the EC2 instances live in. Everything is still good. My lambda can connect to those resources just fine.
My problem is I need my lambda to reach the internet. Normally I'd route the subnets it's in to 0.0.0.0/0 and route it out through a NAT gateway. However, because the EC2 and RDS instances in the subnets of the VPC my lambda is associated with have public IPs putting a NAT gateway in breaks their internet connectivity. How should I go about giving my lambda internet access, without breaking the IGW for the other Ec2 instances?
I was thinking of maybe creating 3 new subnets within the 3 AZs, associating that with my lambda function, create a NAT gateway in each AZ subnet, make the corresponding routes for each subnet. If I did that would my lambda still be able to access the EC2\RDS instances within the other subnets? I have a lambda sg and an ec2 sg and the lambda sg is permitted access to the ec2 sg. Hopefully this makes sense!
As it is not possible to attach public IP addresses to Lambda functions, you have to launch them in private subnets and forward internet traffic to a NAT gateway/instance to let your functions access the Internet.
It looks like you have only created public subnets in your VPC. As you have already suggested, you need to create private subnets that hosts your lambda functions.
Create 1 public and 1 private subnet per AZ.
Launch NAT Gateways in public subnets.
Update the routing table of the private subnets and forward all internet traffic to the NAT GW.
Private subnet RT
0.0.0.0/0 --> NAT GW
Public subnet RT
0.0.0.0/0 --> IGW

Mailing isn't working in Django AWS Lambda (Zappa) behind a VPC

I have an AWS lambda function (Django zappa) that is running inside a VPC thus I'm not able to send emails because Lambda isn't connected to the internet, I tried NAT Gatway but with no hope.
I created a NAT Gatway using one public subnet of the VPC.
Created another private subnet with a route table that routes 0.0.0.0/0 to the NAT Gateway.
I would appreciate any help.
Go to VPC Dashboard and use the Launch VPC Dashboard
Create (Allocate) an elastic IP address and keep it handy. Select the option VPC with Public and Private Subnets
Configure the subnet CIDRs and associate the elastic IP created in the previous step in the form. This will create a NAT Gateway and set it up automatically with correct route tables.
Things to note:
NAT Gateway should always be in the public subnet.
Route table of Private Subnet should have a route 0.0.0.0/0 to NAT Gateway
Route table of Public Subnet should have a route 0.0.0.0/0 to Internet Gateway
Lambda function should be configured with the Private Subnet and not the Public Subnet
Security Group configured in the lambda function should allow outbound to 0.0.0.0/0 (which is there by default, but you should verify)