Crear un ambiente en AWS (VPC, Subnets, Internet Gateway, Network ACL, Security Groups, EC2) para tu proyecto
Contexto
Cuando creamos nuestras apps, es normal que necesitemos una arquitectura y estructura confiable y ordenada para lanzar las mismas a producción, o contar con un ambiente de desarrollo que nos permita probar nuestros desarrollos, o simplemente brindar el acceso a las herramientas que estamos creando para los demás devs del team o el usuario final.
Puede realizar este tutorial tanto si lo requiere en su trabajo como si siente curiosidad o pasión en el tema.
Agradezco a Diego Pacheco porque él me brindó el conocimiento sólido para ser DevOps hace ya buen tiempo. Por ello, he decidido compartir este conocimiento y hacerlo orientado para principiantes y no tan principiantes que deseen contar con una infraestructura mas solida basada en AWS.
Diego también tiene un tutorial pensado desde la creación del VPC hasta instalar Laravel en AWS y configuración de RDS en este link: https://diegooo.com/instala-laravel-en-aws-vpc-load-balancer-rds-elasticcache-s3-paso-a-paso/
Antes de iniciar, esta imagen nos da una idea de lo que vamos a construir (a excepción de las EC2 en este tutorial y los recursos dentro de cada subnet):

VPC
- Acceder a tu consola de AWS, buscar VPC en tu region(https://tu-region.console.aws.amazon.com/vpc/home?region=us-west-2#vpcs:)
En nuestro ejemplo usaremos Oregon (us-west-2)debido a que ofrece costes más bajos que otras regiones.

2. Crear un nuevo VPC (https://us-west-2.console.aws.amazon.com/vpc/home?region=us-west-2#CreateVpc:)
En este caso vamos a crear una VPC para Producción y la nombraremos Production, usaremos la ip: 10.0.0.0/16 y hacemos click en Create VPC.

Subnet
Las subnets son sub redes dentro de la región en donde está creado su VPC. Se definen en general acorde a la cantidad de availability zones de la región. AWS muestra la cantidad de regiones disponibles al acceder a subnets (https://us-west-2.console.aws.amazon.com/vpc/home?region=us-west-2#subnets:sort=desc:SubnetId), las opciones default creadas son muestras de las opciones que puede usar.

En nuestro caso, vamos a crear subnets públicas (con acceso a internet) y subnets privadas, pensadas para alojar servicios mas sensibles como bases de datos sql o servicios de cache, o algún servidor que pueda requerir estar más aislado.
3. Crear Subnets Públicas
Vamos a Create Subnet (https://us-west-2.console.aws.amazon.com/vpc/home?region=us-west-2#CreateSubnet:)
En este punto puede crear todas las subnets publicas que pueda requerir. Para el ejemplo sugiero contar con al menos una. Para efectos de un Load Balancer mi recomendación es contar con al menos dos.
El nombre a usar se sugiere de esta manera (Ip de la subnet, nombre del ambiente o del VPC, region, Availability Zone, y PUB):
Creamos una subnet en la zona 2a 10.0.1.0_PROD_WEST_2A_PUB:

Creamos otra subnet pública en la zona 2b 10.0.2.0_PROD_WEST_2B_PUB:

3. Crear Subnets Privadas
De forma similar, puede crear las subnets privadas que requiera.
Creamos otra subnet privada en la zona 2c 10.0.3.0_PROD_WEST_2C_PRV:

Internet Gateway
El Internet Gateway (igw) permite al VPC tener acceso inicialmente a Internet.
4. Hacemos click en Create internet gateway (https://us-west-2.console.aws.amazon.com/vpc/home?region=us-west-2#CreateInternetGateway:)

5. Una vez creado volvemos a la lista de Internet Gateway (https://us-west-2.console.aws.amazon.com/vpc/home?region=us-west-2#igws:) y hacemos click derecho -> Attach to VPC y escogemos nuestro VPC.

Route Tables
Si bien es cierto, uno asumiría que un Internet Gateway brindaría full acceso a internet a todo el VPC y eso bastaría, lo cierto, es que AWS cuenta con una capa adicional -a mas capas que veremos en un momento- que permiten definir que subnets tienen o no acceso a internet. Ahi es donde entran en juego las route tables y nos ayudarán a brindar acceso a internet a nuestras subnets públicas.
6. Ir a Route Tables (https://us-west-2.console.aws.amazon.com/vpc/home?region=us-west-2#RouteTables:sort=routeTableId)
Buscamos la Route Table ya creada por default para nuestro VPC.(Podemos nombrarla para que sea mas fácil reconocerla luego, tipo PROD-RT)

Click en el tab de Routes y luego en Edit Routes, agregamos la ip 0.0.0.0/0 y seleccionamos el internet gateway que creamos anteriormente como target. Click en save routes.

Seguimos con seleccionar las Subnets que van a tener acceso a internet (las subnets públicas para nuestro caso).
Click en el tab de Subnet Associations, Edit y seleccionamos las subnets públicas, click en save.

Network ACL
El Network ACL brinda una capa de seguridad adicional a nuestras subnets. Nos permite elegir los puertos a abrir de manera más global.
7. Ir a Network ACL (https://us-west-2.console.aws.amazon.com/vpc/home?region=us-west-2#acls:sort=networkAclId)
Escogemos la default creada para nuestro VPC, y aprovechamos a nombrarla (PROD-NetworkACL).

Vamos Inbound Rules.
Abrimos los puertos que vamos a requerir en nuestra public subnets. (Por lo general son el puerto 80 y 443), importante abrir tanto para ipv4 (0.0.0.0/0) como para ipv6 (::/0), además, de abrir el puerto 22 para ssh, es recomendable que se haga solo a tu ip actual o a una ip de un vpn (tu-ip-vpn/32)

Vamos a outbound rules y de manera similar abrimos los puertos requeridos

8. Repetimos el proceso, pero esta ves para nuestra subnet privada. Es necesario que creemos una nueva Network ACL:

Asociamos esta nueva Network ACL a las subnet privadas:

De manera similar vamos a escoger los puertos a abrir (por lo general el puerto 3306, 6379 o de algún server con mongodb o que sea requerido por nuestras apps.)
El source si cambia en este caso, pues serian las subnets publicas que vamos a permitirle entrar hacia esta subnet privada. (En este caso se puede ser especifico, crear una regla para cada subnet publica, o una regla mas general, autorizando a todo el VPC con 10.0.0.0/16)

En el caso de outbound rules, se puede aplicar las mismas reglas. Ahora bien, si usted usa una instancia ec2 que maneja algún recurso tipo mongodb, en dicho caso le recomiendo abrir más outbound rules para permitir a esa instancia conectarse a repositorios apt de linux.

Security Groups
AWS ofrece una capa adicional de seguridad para nuestros proyectos. Esta es la mas cercana a nuestras instancias y recursos (excepto que implementemos firewalls a nivel de linux o de nuestras web apps).
9. Editamos el Security Group (SG) default de nuestro VPC. Podemos nombrarlo como el que asume de Público.

10. Creamos uno nuevo para Privado.
(https://us-west-2.console.aws.amazon.com/vpc/home?region=us-west-2#CreateSecurityGroup:)

Editamos las reglas del SG Público


Editamos las reglas del SG Privado


En general, estos pasos le van a permitir contar con un nuevo VPC. Este a su vez va a tener lo necesario para que usted tenga sus web apps, bases de datos o servicios ordenados y más asegurados.
Al crear una nueva instancia deberá escoger este nuevo VPC y colocarlo en una subnet según el uso a darle (Privado o Público), similar con bases de datos RDS o Redis.
En otros artículos explicaré como montar Integración Continua (Continuos Integration) para ambientes de desarrollo con circleci.
Además, una guía breve para ayudarnos a clonar nuestros repositorios en servidores LEMP desde Github, pues aunque no es tan difícil de realizar, algunos pasos suelen complicarse o olvidarse.
Cualquier duda o comentario es bien recibida.
Saludos Cordiales!