Why do we need an internet gateway, I guess the nat has the elastic IP address !!!
Internet gateways are for public subnets that need inbound and outbound access to/from the Internet. NAT gateways only allow outbound traffic from the private subnet to the Internet. Subnets connected to a NAT gateway are not directly accessible from the Internet. In practice you would put publicly-facing apps and services in a public subnet with an Internet gateway (like a web server). In a private subnet behind a NAT gateway you would have services like an app server or database.
Also, notice that NAT gateways are setup in public subnets that have an Internet gateway. NAT GW’s themselves do not have direct access to the Internet. They rely on the Internet gateway in the public subnet to route traffic to and from the Internet.
Internet Gateways provide highly available and scalable access to the public internet when connected to your VPC. The IGW is connected to a subnet via the routing table and the NACL and any security groups must allow the traffic on the relevant ports. An EC2 instances that want to connect directly to the internet must have a public IP address. However there are cases where we want EC2 instances that are in a private subnet and only have a private IP address but still want the ability to download patches. Here we use a NAT gateway in a public subnet and configure the private subnet so that traffic we want to go out to the internet will use the NAT gateway. By design the NAT gateway will only allow our instances to initiate a connection but not vice versa. It’s also hardened to be internet facing.