Introducción a Amazon VPC mediante la CLI de AWS - Amazon Virtual Private Cloud

Introducción a Amazon VPC mediante la CLI de AWS

En este tutorial, se explica cómo crear una nube privada virtual (VPC) mediante la interfaz de la línea de comandos (AWS CLI) de AWS. Aprenderá a configurar una VPC con subredes públicas y privadas, configurar la conectividad a Internet e implementar instancias de EC2 para demostrar una arquitectura de aplicaciones web común.

Requisitos previos

Antes de comenzar este tutorial, asegúrese de tener lo siguiente:

  1. La AWS CLI. Si necesita instalarla, siga la guía de instalación de la AWS CLI.

  2. La AWS CLI debe estar configurada con las credenciales apropiadas. Si aún no ha configurado sus credenciales, ejecute aws configure.

  3. Comprensión básica de los conceptos sobre redes.

  4. Identity and Access Management para Amazon VPC para crear y administrar los recursos de VPC en su cuenta de AWS.

Consideraciones sobre costos

En este tutorial, se crean recursos de AWS que pueden suponer costos en su cuenta. El costo principal proviene de la puerta de enlace de NAT (0,045 USD por hora más gastos de procesamiento de datos) y de las instancias de EC2 (t2.micro, aproximadamente 0,0116 USD por hora cada una). Si completa este tutorial en una hora y, a continuación, limpia todos los recursos, el costo total será de aproximadamente 0,07 USD. Para optimizar los costos en los entornos de desarrollo, considere la posibilidad de utilizar una instancia de NAT en lugar de una puerta de enlace de NAT, lo que puede reducir los costos de forma significativa.

Comprobemos que su AWS CLI está correctamente configurada antes de continuar.

aws configure list

Debería ver su clave de acceso, su clave secreta y la región predeterminada de AWS. Además, compruebe que tiene los permisos necesarios para crear recursos de VPC.

aws sts get-caller-identity

Este comando muestra su ID de cuenta, su ID de usuario y su ARN de AWS, lo que confirma que sus credenciales son válidas.

Creación de una VPC

Una nube privada virtual (VPC) es una red virtual dedicada para su cuenta de AWS. En esta sección, creará una VPC con un bloque CIDR de 10.0.0.0/16, que proporciona hasta 65 536 direcciones IP.

Creación de la VPC

El siguiente comando crea una nueva VPC y le asigna una etiqueta de nombre.

aws ec2 create-vpc --cidr-block 10.0.0.0/16 --tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=MyVPC}]'

En la salida, tome nota del ID de la VPC. Lo necesitará para comandos posteriores. Para el propósito de este tutorial, utilizaremos “vpc-0123456789abcdef0” como un ejemplo de ID de la VPC. Reemplácelo con su ID de la VPC real en todos los comandos.

Habilitación de la compatibilidad y los nombres de host de DNS

De forma predeterminada, la resolución de DNS y los nombres de host de DNS están deshabilitados en una VPC nueva. Active estas características para permitir que las instancias de su VPC resuelvan los nombres de dominio.

aws ec2 modify-vpc-attribute --vpc-id vpc-0123456789abcdef0 --enable-dns-support aws ec2 modify-vpc-attribute --vpc-id vpc-0123456789abcdef0 --enable-dns-hostnames

Estos comandos no producen ninguna salida si se ejecutan correctamente. Su VPC ahora tiene habilitada la resolución de compatibilidad y nombres de host de DNS.

Creación de subredes

Las subredes son segmentos del rango de direcciones IP de una VPC en los que puede colocar grupos de recursos aislados. En esta sección, creará subredes públicas y privadas en dos zonas de disponibilidad para obtener alta disponibilidad.

Obtención de las zonas de disponibilidad disponibles

En primer lugar, recupere las zonas de disponibilidad disponibles en su región.

aws ec2 describe-availability-zones

Para este tutorial, utilizaremos las dos primeras zonas de disponibilidad. Cuando vea la salida, anote sus nombres (por ejemplo, “us-east-1a” y “us-east-1b”).

Creación de dos subredes públicas

Las subredes públicas se utilizan para los recursos que deben ser accesibles desde Internet, como los servidores web.

aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.0.0/24 \ --availability-zone us-east-1a \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Public-Subnet-AZ1}]'

Cuando vea la salida, anote el ID de la subred. En este tutorial, usaremos “subnet-0123456789abcdef0” como ejemplo de la primera subred pública.

aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.1.0/24 \ --availability-zone us-east-1b \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Public-Subnet-AZ2}]'

Cuando vea la salida, anote el ID de la subred. En este tutorial, usaremos “subnet-0123456789abcdef1” como ejemplo de la segunda subred pública.

Crear subredes privadas

Las subredes privadas se utilizan para recursos que no deben ser accesibles directamente desde Internet, como las bases de datos.

aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.2.0/24 \ --availability-zone us-east-1a \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Private-Subnet-AZ1}]'

Cuando vea la salida, anote el ID de la subred. En este tutorial, usaremos “subnet-0123456789abcdef2” como ejemplo de la primera subred privada.

aws ec2 create-subnet \ --vpc-id vpc-0123456789abcdef0 \ --cidr-block 10.0.3.0/24 \ --availability-zone us-east-1b \ --tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=Private-Subnet-AZ2}]'

Cuando vea la salida, anote el ID de la subred. En este tutorial, usaremos “subnet-0123456789abcdef3” como ejemplo de la segunda subred privada.

Ahora tiene cuatro subredes: dos públicas y dos privadas, distribuidas en dos zonas de disponibilidad.

Consejo: Cuando planifique sus bloques de CIDR, asegúrese de que no se superpongan con las redes existentes. Para los entornos de producción, asigne suficientes direcciones IP para el crecimiento futuro y, al mismo tiempo, mantenga las subredes de un tamaño razonable para la seguridad y la administración.

Configuración de la conectividad a Internet

Para permitir que los recursos de su VPC se comuniquen con Internet, debe crear y conectar una puerta de enlace de Internet. En esta sección, configurará la conectividad a Internet para su VPC.

Crear una gateway de Internet

Una puerta de enlace de Internet permite la comunicación entre su VPC e Internet.

aws ec2 create-internet-gateway \ --tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=MyIGW}]'

Cuando vea la salida, anote el ID de la puerta de enlace de Internet. Para este tutorial, usaremos “igw-0123456789abcdef0” como ejemplo.

Conexión de una puerta de enlace de Internet a su VPC

Después de crear la puerta de enlace de Internet, adjúntela a su VPC.

aws ec2 attach-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --vpc-id vpc-0123456789abcdef0

Creación y configuración de tablas de enrutamiento

Las tablas de enrutamiento contienen reglas (rutas) que determinan la dirección del tráfico de la red. En primer lugar, cree una tabla de enrutamiento para las subredes públicas.

aws ec2 create-route-table \ --vpc-id vpc-0123456789abcdef0 \ --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=Public-RT}]'

Cuando vea la salida, anote el ID de la tabla de enrutamiento. En este tutorial, usaremos “rtb-0123456789abcdef0” como ejemplo de la tabla de enrutamiento pública.

Añada una ruta a la puerta de enlace de Internet en la tabla de enrutamiento pública.

aws ec2 create-route --route-table-id rtb-0123456789abcdef0 --destination-cidr-block 0.0.0.0/0 --gateway-id igw-0123456789abcdef0

Asocie las subredes públicas con la tabla de enrutamiento pública.

aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef0 --subnet-id subnet-0123456789abcdef0 aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef0 --subnet-id subnet-0123456789abcdef1

Ahora, cree una tabla de enrutamiento para sus subredes privadas.

aws ec2 create-route-table \ --vpc-id vpc-0123456789abcdef0 \ --tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=Private-RT}]'

Cuando vea la salida, anote el ID de la tabla de enrutamiento. En este tutorial, usaremos “rtb-0123456789abcdef1” como ejemplo de la tabla de enrutamiento privada.

Asocie las subredes privadas con la tabla de enrutamiento privada.

aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef1 --subnet-id subnet-0123456789abcdef2 aws ec2 associate-route-table --route-table-id rtb-0123456789abcdef1 --subnet-id subnet-0123456789abcdef3

Creación de una puerta de enlace NAT

Una puerta de enlace de NAT permite que las instancias en subredes privadas inicien el tráfico saliente a Internet a la vez que evita el tráfico entrante desde Internet. Esto es esencial para las instancias que necesitan descargar actualizaciones o acceder a servicios externos.

Asignación de una IP elástica

En primer lugar, asigne una dirección IP elástica a su puerta de enlace NAT.

aws ec2 allocate-address --domain vpc

Cuando vea la salida, anote el ID de la asignación. Para este tutorial, usaremos “eipalloc-0123456789abcdef0” como ejemplo.

Creación de la puerta de enlace NAT

Cree una puerta de enlace de NAT en una de sus subredes públicas utilizando la IP elástica asignada.

aws ec2 create-nat-gateway \ --subnet-id subnet-0123456789abcdef0 \ --allocation-id eipalloc-0123456789abcdef0 \ --tag-specifications 'ResourceType=natgateway,Tags=[{Key=Name,Value=MyNATGateway}]'

Cuando vea la salida, anote el ID de la puerta de enlace NAT. Para este tutorial, usaremos “nat-0123456789abcdef0” como ejemplo.

Espere a que la puerta de enlace de NAT esté disponible antes de continuar.

aws ec2 wait nat-gateway-available --nat-gateway-ids nat-0123456789abcdef0

Adición de una ruta a la puerta de enlace de NAT

Agregue una ruta a la puerta de enlace de NAT en la tabla de enrutamiento privada para permitir que las instancias de las subredes privadas accedan a Internet.

aws ec2 create-route --route-table-id rtb-0123456789abcdef1 --destination-cidr-block 0.0.0.0/0 --nat-gateway-id nat-0123456789abcdef0

Nota: Para los entornos de producción, considere la posibilidad de crear una puerta de enlace de NAT en cada zona de disponibilidad en la que tenga subredes privadas para eliminar los puntos únicos de error.

Configuración de los ajustes de la subred

Configure las subredes públicas para asignar de forma automática direcciones IP públicas a instancias iniciadas en ellas.

aws ec2 modify-subnet-attribute --subnet-id subnet-0123456789abcdef0 --map-public-ip-on-launch aws ec2 modify-subnet-attribute --subnet-id subnet-0123456789abcdef1 --map-public-ip-on-launch

Esto garantiza que las instancias lanzadas en las subredes públicas reciban una dirección IP pública de forma predeterminada, lo que permite acceder a ellas desde Internet.

Creación de grupos de seguridad

Los grupos de seguridad funcionan como firewalls virtuales para que las instancias controlen el tráfico entrante y saliente. En esta sección, creará grupos de seguridad para servidores web y servidores de bases de datos.

Creación de un grupo de seguridad para los servidores web

aws ec2 create-security-group \ --group-name WebServerSG \ --description "Security group for web servers" \ --vpc-id vpc-0123456789abcdef0

Cuando vea la salida, anote el ID del grupo de seguridad. En este tutorial, usaremos “sg-0123456789abcdef0” como ejemplo del grupo de seguridad del servidor web.

Permita que el tráfico HTTP y HTTPS llegue a sus servidores web.

aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef0 --protocol tcp --port 80 --cidr 0.0.0.0/0 aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef0 --protocol tcp --port 443 --cidr 0.0.0.0/0

Nota: Para los entornos de producción, restrinja el tráfico entrante a rangos de IP específicos en lugar de permitir el tráfico desde 0.0.0.0/0 (cualquier dirección IP).

Creación de un grupo de seguridad para los servidores de base de datos

aws ec2 create-security-group \ --group-name DBServerSG \ --description "Security group for database servers" \ --vpc-id vpc-0123456789abcdef0

Cuando vea la salida, anote el ID del grupo de seguridad. En este tutorial, usaremos “sg-0123456789abcdef1” como ejemplo del grupo de seguridad del servidor de la base de datos.

Permita el tráfico de MySQL/Aurora únicamente desde servidores web.

aws ec2 authorize-security-group-ingress --group-id sg-0123456789abcdef1 --protocol tcp --port 3306 --source-group sg-0123456789abcdef0

Esta configuración garantiza que solo las instancias del grupo de seguridad del servidor web puedan conectarse a los servidores de bases de datos en el puerto 3306, siguiendo el principio de privilegio mínimo.

Verificación de la configuración VPC

Tras crear todos los componentes necesarios, compruebe la configuración de la VPC para asegurarse de que todo está correcto.

Compruebe su VPC

aws ec2 describe-vpcs --vpc-id vpc-0123456789abcdef0

Compruebe sus subredes

aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-0123456789abcdef0"

Compruebe sus tablas de enrutamiento

aws ec2 describe-route-tables --filters "Name=vpc-id,Values=vpc-0123456789abcdef0"

Compruebe su puerta de enlace de Internet

aws ec2 describe-internet-gateways --filters "Name=attachment.vpc-id,Values=vpc-0123456789abcdef0"

Compruebe su puerta de enlace de NAT

aws ec2 describe-nat-gateways --filter "Name=vpc-id,Values=vpc-0123456789abcdef0"

Compruebe sus grupos de seguridad

aws ec2 describe-security-groups --filters "Name=vpc-id,Values=vpc-0123456789abcdef0"

Estos comandos proporcionan información detallada sobre cada componente de su VPC, lo que le permite verificar que todo está configurado correctamente.

Implementación de las instancias de EC2

Ahora que ha creado la infraestructura de su VPC, puede implementar instancias de EC2 para demostrar cómo funciona. Lanzará un servidor web en una subred pública y un servidor de bases de datos en una subred privada.

Creación de un par de claves para el acceso SSH

En primer lugar, cree un par de claves para conectarse de forma segura a las instancias:

aws ec2 create-key-pair --key-name vpc-tutorial-key --query 'KeyMaterial' --output text > vpc-tutorial-key.pem chmod 400 vpc-tutorial-key.pem

Este comando crea un nuevo par de claves y guarda la clave privada en un archivo con permisos restringidos.

Hallazgo de la AMI de Amazon Linux 2 más reciente

Busque la AMI de Amazon Linux 2 más reciente para utilizarla en las instancias:

aws ec2 describe-images --owners amazon \ --filters "Name=name,Values=amzn2-ami-hvm-*-x86_64-gp2" "Name=state,Values=available" \ --query "sort_by(Images, &CreationDate)[-1].ImageId" --output text

Cuando vea la salida, anote el ID de la AMI. Para este tutorial, usaremos “ami-0123456789abcdef0” como ejemplo.

Lanzamiento de un servidor web en la subred pública

Ahora, inicie una instancia de EC2 en la subred pública para que sirva como servidor web.

aws ec2 run-instances \ --image-id ami-0123456789abcdef0 \ --count 1 \ --instance-type t2.micro \ --key-name vpc-tutorial-key \ --security-group-ids sg-0123456789abcdef0 \ --subnet-id subnet-0123456789abcdef0 \ --associate-public-ip-address \ --user-data '#!/bin/bash yum update -y yum install -y httpd systemctl start httpd systemctl enable httpd echo "<h1>Hello from $(hostname -f)</h1>" > /var/www/html/index.html' \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=WebServer}]'

Cuando vea la salida, anote el ID de la instancia. En este tutorial, usaremos “i-0123456789abcdef0” como ejemplo de la instancia del servidor web.

Lanzamiento de un servidor de base de datos en la subred privada

A continuación, inicie una instancia de EC2 en la subred privada para que sirva como servidor de base de datos:

aws ec2 run-instances \ --image-id ami-0123456789abcdef0 \ --count 1 \ --instance-type t2.micro \ --key-name vpc-tutorial-key \ --security-group-ids sg-0123456789abcdef1 \ --subnet-id subnet-0123456789abcdef2 \ --user-data '#!/bin/bash yum update -y yum install -y mariadb-server systemctl start mariadb systemctl enable mariadb' \ --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=DBServer}]'

Cuando vea la salida, anote el ID de la instancia. En este tutorial, usaremos “i-0123456789abcdef1” como ejemplo de la instancia de la base de datos.

Acceso a su servidor web

Una vez que la instancia de su servidor web esté en ejecución, podrá acceder a ella mediante su dirección IP pública:

aws ec2 describe-instances \ --instance-ids i-0123456789abcdef0 \ --query 'Reservations[0].Instances[0].PublicIpAddress' \ --output text

Este comando generará la dirección IP pública de su servidor web. Para este tutorial, usaremos “203.0.113.10” como ejemplo.

Ahora puede abrir esta URL en su navegador web: http://203.0.113.10

Conexión a sus instancias mediante SSH

Para conectarse a su servidor web:

ssh -i vpc-tutorial-key.pem ec2-user@203.0.113.10

Para conectarse a su servidor de base de datos, primero debe usar SSH con su servidor web y, después, con su servidor de base de datos:

# Get the private IP of the database server aws ec2 describe-instances \ --instance-ids i-0123456789abcdef1 \ --query 'Reservations[0].Instances[0].PrivateIpAddress' \ --output text

Este comando generará la dirección IP privada de su servidor de bases de datos. Para este tutorial, usaremos “10.0.2.10” como ejemplo.

# First SSH to web server, then to database server ssh -i vpc-tutorial-key.pem -A ec2-user@203.0.113.10 ssh ec2-user@10.0.2.10

Esto demuestra la arquitectura de red que ha creado: el servidor web es de acceso público, mientras que el servidor de base de datos solo es accesible desde la VPC.

Solución de problemas

A continuación, se indican algunos problemas comunes que puede encontrar al crear una VPC y se explica cómo resolverlos:

Superposiciones de bloques de CIDR

Si recibe un error sobre superposiciones de bloques de CIDR, asegúrese de que los bloques de CIDR de su VPC y sus subredes no se superpongan con las VPC o subredes existentes en su cuenta.

Errores de permisos

Si encuentra errores de permisos, verifique que su usuario o rol de IAM tenga los permisos necesarios para crear y administrar recursos de la VPC. Es posible que necesite adjuntar la política AmazonVPCFullAccess o crear una política personalizada con los permisos necesarios.

Límites de recursos

Las cuentas de AWS tienen límites predeterminados en cuanto al número de VPC, subredes y otros recursos que se pueden crear. Si alcanza estos límites, puede solicitar un aumento a través del Centro de soporte de AWS.

Fallos de dependencia durante la limpieza

Al limpiar los recursos, es posible que encuentre errores de dependencia si intenta eliminar los recursos en un orden incorrecto. Elimine siempre los recursos en el orden inverso al de su creación, comenzando por los recursos más dependientes.

Eliminar recursos

Cuando haya terminado con su VPC, puede limpiar los recursos para evitar incurrir en costos adicionales. Elimine los recursos en el orden inverso de su creación para gestionar las dependencias correctamente.

Termine las instancias de EC2

aws ec2 terminate-instances --instance-ids i-0123456789abcdef0 i-0123456789abcdef1 aws ec2 wait instance-terminated --instance-ids i-0123456789abcdef0 i-0123456789abcdef1

Elimine el par de claves

aws ec2 delete-key-pair --key-name vpc-tutorial-key rm vpc-tutorial-key.pem

Elimine la puerta de enlace NAT

aws ec2 delete-nat-gateway --nat-gateway-id nat-0123456789abcdef0 aws ec2 wait nat-gateway-deleted --nat-gateway-ids nat-0123456789abcdef0

Liberación de la IP elástica

aws ec2 release-address --allocation-id eipalloc-0123456789abcdef0

Elimine los grupos de seguridad

aws ec2 delete-security-group --group-id sg-0123456789abcdef1 aws ec2 delete-security-group --group-id sg-0123456789abcdef0

Elimine las tablas de enrutamiento

Primero, busque los ID de asociación de la tabla de enrutamiento:

aws ec2 describe-route-tables --route-table-id rtb-0123456789abcdef0 aws ec2 describe-route-tables --route-table-id rtb-0123456789abcdef1

A continuación, desasocie las tablas de enrutamiento de las subredes (sustituya los ID de asociación por los de su salida):

aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef0 aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef1 aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef2 aws ec2 disassociate-route-table --association-id rtbassoc-0123456789abcdef3

A continuación, elimine las tablas de enrutamiento:

aws ec2 delete-route-table --route-table-id rtb-0123456789abcdef1 aws ec2 delete-route-table --route-table-id rtb-0123456789abcdef0

Separe y elimine la puerta de enlace de Internet

aws ec2 detach-internet-gateway --internet-gateway-id igw-0123456789abcdef0 --vpc-id vpc-0123456789abcdef0 aws ec2 delete-internet-gateway --internet-gateway-id igw-0123456789abcdef0

Elimine las subredes

aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef0 aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef1 aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef2 aws ec2 delete-subnet --subnet-id subnet-0123456789abcdef3

Elimine la VPC

aws ec2 delete-vpc --vpc-id vpc-0123456789abcdef0

Paso a la producción

Este tutorial se ha diseñado para ayudarlo a aprender a crear una VPC mediante la AWS CLI. Para los entornos de producción, tenga en cuenta las siguientes prácticas recomendadas de seguridad y arquitectura:

  1. Reglas de grupo de seguridad: restrinja el tráfico entrante a rangos de IP específicos en lugar de permitir el tráfico desde 0.0.0.0/0.

  2. Alta disponibilidad: implemente puertas de enlace de NAT en cada zona de disponibilidad donde tenga subredes privadas para eliminar los puntos únicos de error.

  3. ACL de red: implemente las ACL de red como una capa adicional de seguridad más allá de los grupos de seguridad.

  4. Registros de flujo de la VPC: habilite los registros de flujo de la VPC para monitorear y analizar los patrones de tráfico de la red.

  5. Etiquetado de recursos: implemente una estrategia de etiquetado integral para una mejor gestión de los recursos.

Para obtener más información sobre cómo crear arquitecturas listas para producción, consulte Marco de AWS Well-Architected y AWS Security Best Practices.

Pasos a seguir a continuación

Ahora que ha creado una VPC con subredes públicas y privadas, puede hacer lo siguiente:

  1. Lanzar instancias de EC2 en sus subredes públicas o privadas.

  2. Implementar equilibradores de carga para distribuir el tráfico entre múltiples instancias.

  3. Configurar grupos de escalado automático para obtener alta disponibilidad y escalabilidad.

  4. Configurar las bases de datos de RDS en sus subredes privadas.

  5. Implementar el emparejamiento de la VPC para conectarse con otras VPC.

  6. Configurar las conexiones de VPN para conectar la VPC con la red en las instalaciones.