Cómo montar tu propia nube con la ayuda de AWS y Cloudformation

Cada vez es más común que las aplicaciones, servicios e infraestructuras de las empresas se hagan en Cloud. No es la primera vez en el blog que hablamos de las ventajas que tiene trabajar en Cloud, de cuáles son las principales plataformas y tecnologías de Cloud o, incluso, de por qué todas las empresas deberían seguir los pasos de Amazon.

Incluso en alguna ocasión hemos sobrevolado los servicios de AWS. Sin embargo, en esta ocasión vamos a centrarnos en el servicio Amazon Virtual Private Cloud (VPC), que nos permite construir un CPD de comunicaciones virtual a golpe de ratón.

aws-icon

¿Qué es AWS VPC?

Amazon Virtual Private Cloud es un servicio que nos permite provisionar una sección aislada de forma lógica en la red de Amazon Web Services (AWS) donde poder lanzar recursos de AWS en una red que se defina. Permite seleccionar el rango de direcciones IP que se desee, la creación de subredes y configuración de tablas de enrutamiento y puertas de enlace de red.

Un ejemplo de configuración habitual es crear una subred para los servidores que necesiten acceso a Internet, y otra subred, para los sistemas de back-end como bases de datos y servidores de aplicaciones, de uso privado sin acceso a Internet.

También permite crear una red privada virtual (VPN) de hardware para conectar un centro de datos con la VPC.

Características, consideraciones técnicas y best practises:

  • La limitación de rango y clases de IP’s en las redes es de /16, es el recomendado para poder “jugar” y no limitarte a la hora de escoger direccionamiento.
  • En el caso de las subredes la limitación de rango de IP’s es /24 y también es el recomendado.
  • Permite la utilización de dhcp. En la mayoría de los casos es muy interesante el utilizarlo ya que dada la elasticidad de los servicios de AWS al levantar una nueva instancia, se le asigna una ip del rango seleccionado por el dhcp.
  • Dividir el rango privado de direcciones IP en la VPC en una o varias subredes públicas o privadas. Dentro de la VPC es muy interesante dividir subredes, una para la parte pública asignando un “internet gateway” para darle acceso a Internet y otra para la parte privada. También se pueden crear otras subredes para otro tipo de comunicaciones o conexión entre aplicaciones o servicios que puedan interesar.
  • Elastic IP. Para que las instancias que están dentro de la VPC puedan alcanzarse desde Internet es posible utilizar las IP’s fijas que ofrece AWS. Como excepción, es posible utilizar un servidor “de salto” (Bastion host), que tenga una IP pública y se conecte a las demás instancias dentro de la VPC mediante las IP’s privadas de las mismas.
  • VPC Peering. En el caso de tener infraestructuras en varios países, cuando se hace necesario el conectar unas VPC’s con otras, e incluso con VPC’s de distintas cuentas de AWS, se utiliza este tipo de conexión. AWS aprovecha la infraestructura que crea la VPC para crear una conexión VPC Peering. Consiste en crear una conexión de red entre 2 VPC’s que permite enrutar el tráfico entre ellas a través de las direcciones privadas de las mismas, como si estuvieran dentro de una misma red, lo que facilita la transferencia de datos y el acceso a los recursos.
  • Utilización Listas de Control de Acceso (ACL’s). En algunos casos puede resultar interesante controlar el tráfico a nivel de subredes filtrando el acceso de entrada y salida entre las mismas.
  • Utilizar Security Groups. Es el firewall que AWS ofrece para gestionar el acceso a IP’s y puertos. Es primordial utilizar esta capa para restringir los accesos y dotar de seguridad a la VPC.
  • VPN. Si se desea (aunque es recomendable), se puede enrutar todo el tráfico proveniente y dirigido a las instancias de la VPC mediante una conexión VPN encriptada. Hay diferentes casos de uso y distintas configuraciones con respecto a las VPN’s:
    • Mediante un túnel ipsec. Si tienes parte de la infraestructura en un centro de datos y quieres conectarlo con la VPC de AWS puedes realizar una conexión IPsec encriptada.
    • AWS Direct Connect. Es un servicio de AWS que establece una conexión de red privada dedicada desde un centro de datos, oficina o entorno de coubicación, a AWS. La conexión se puede particionar en varios interfaces virtuales. Así, con la misma conexión, puedes acceder mediante un interfaz virtual a servicios de Amazon o recursos que estén en la parte pública. Y mediante otra interfaz virtual puedes acceder a recursos privados dentro de la VPC. Con ello se mantiene el aislamiento de la red.
    • Instalando en una instancia dentro de la VPC un servidor de VPN como por ejemplo, OpenVPN y que todo el tráfico pase por esa instancia.

aws-100615925-primary-idge

Integración con otros recursos de AWS

Se integra con servicios de AWS como EC2, IAM, S3, Amazon RDS, DynamoDB, SQS, SNS, ECS, etc. ¿Qué podemos obtener de esas integraciones? Entre otras, las siguientes ventajas:

  • Levantar instancias EC2 directamente dentro de una VPC, al igual que el servicio de contenedores ECS.
  • Provisionar IP’s dentro de la VPC, de servicios y recursos de AWS como por ejemplo, Amazon RDS, Load Balancer, Elasticache, etc.
  • Para limitar el acceso a los recursos de AWS (como buckets de Amazon S3, temas de Amazon SNS y colas de Amazon SQS), se pueden crear directrices de IAM que limiten el acceso a dichos recursos únicamente a las direcciones IP elásticas asociadas con la VPC.

Cómo montar una VPC con CloudFormation

Como en Paradigma estamos siempre a favor de una automatización en los despliegues y procesos. Generalmente este tipo de despliegues y creación de infraestructuras se hacen a partir de plantillas de código.

En el caso de AWS se suele utilizar Cloudformation, otro de los servicios que facilita AWS y que mediante el uso de plantillas permite la creación de Stacks de infraestructura. Para montar un VPC usando una plantilla de Cloudformation sería tan sencillo (y tan complicado) como definir el recurso: AWS::EC2::VPC

Tan sencillo porque el hecho de definir ese recurso requiere únicamente facilitar un CIDRBlock como parámetro y tan complicado por todas las opciones que conlleva a continuación. Un VPC vacío no tiene mucho sentido, con lo cual lo primero que hay que decidir es la configuración de las subredes, sus rangos de ips, si serán públicas o privadas, de ser públicas necesitarán un gateway que permitan enrutar el tráfico a Internet…

Para definir vía Cloudformation un VPC como el que AWS facilita como “default” habría que seguir los siguientes pasos:

    • Crear el recurso VPC con su CIDR
"VPC" : {
  "Type" : "AWS::EC2::VPC",
  "Properties" : {
    "CidrBlock" : “10.1.0.0/16”,
  }
}
  • Añadir 3 subredes (dependientes del recurso VPC) y cada una en una zona de disponibilidad determinada (supongamos que nuestra region es eu-west-1 por simplificar la plantilla).
"SubnetPublic1": {
            "DependsOn" : ["VPC"],
            "Type" : "AWS::EC2::Subnet",
            "Properties" : {
                "AvailabilityZone" : “eu-west-1a”,
                "CidrBlock" : “10.1.1.0/24”,
                "VpcId" : { "Ref": "VPC" },
            }
        },
        "SubnetPublic2": {
            "DependsOn" : ["VPC"],
            "Type" : "AWS::EC2::Subnet",
            "Properties" : {
                "AvailabilityZone" : “eu-west-1b”,
                "CidrBlock" : “10.1.2.0/24”,
                "VpcId" : { "Ref": "VPC" },
            }
        },
        "SubnetPublic3": {
            "DependsOn" : ["VPC"],
            "Type" : "AWS::EC2::Subnet",
            "Properties" : {
                "AvailabilityZone" : “eu-west-1c”,
                "CidrBlock" : “10.1.3.0/24”,
                "VpcId" : { "Ref": "VPC" },
            }
        }
  • Creación y asignación del recurso Internet Gateway para el VPC (también dependiente de VPC)
"InternetGateway" : {
           "DependsOn" : ["VPC"],
           "Type" : "AWS::EC2::InternetGateway",
           "Properties" : {
               "Tags" : [
                   { "Key" : "Gateway", "Value" : "MyGateway" }
               ]
           }
       },


       "VPCGatewayAttachment" : {
          "DependsOn" : ["VPC", "InternetGateway"],
          "Type" : "AWS::EC2::VPCGatewayAttachment",
          "Properties" : {
            "VpcId" : { "Ref" : "VPC" },
            "InternetGatewayId" : { "Ref" : "InternetGateway" }
          }
       },
  • Por último habría que definir la tabla de rutas y las rutas necesarias, de forma que las tres subredes tengan comunicación entre sí para las ips dentro del CIDR del VPC y a internet para el resto de ips. También hay que asociar las subredes creadas a esta regla:
"PublicRouteTable" : {
        "DependsOn" : ["VPC"],
        "Type" : "AWS::EC2::RouteTable",
        "Properties" : {
          "VpcId" : { "Ref" : "VPC" },
        }
      },
      "PublicRoute" : {
        "DependsOn" : ["PublicRouteTable", "InternetGateway"],
        "Type" : "AWS::EC2::Route",
        "Properties" : {
          "RouteTableId" : { "Ref" : "PublicRouteTable" },
          "DestinationCidrBlock" : "0.0.0.0/0",
          "GatewayId" : { "Ref" : "InternetGateway" }
        }
      },
      "PublicSubnetRouteTableAssociation1" : {
        "DependsOn" : ["SubnetPublic1", "PublicRouteTable"],
        "Type" : "AWS::EC2::SubnetRouteTableAssociation",
        "Properties" : {
          "SubnetId" : { "Ref" : "SubnetPublic1" },
          "RouteTableId" : { "Ref" : "PublicRouteTable" }
        }
      },
      "PublicSubnetRouteTableAssociation2" : {
        "DependsOn" : ["SubnetPublic2", "PublicRouteTable"],
        "Type" : "AWS::EC2::SubnetRouteTableAssociation",
        "Properties" : {
          "SubnetId" : { "Ref" : "SubnetPublic2" },
          "RouteTableId" : { "Ref" : "PublicRouteTable" }
        }
      },
      "PublicSubnetRouteTableAssociation3" : {
        "DependsOn" : ["SubnetPublic3", "PublicRouteTable"],
        "Type" : "AWS::EC2::SubnetRouteTableAssociation",
        "Properties" : {
          "SubnetId" : { "Ref" : "SubnetPublic3" },
          "RouteTableId" : { "Ref" : "PublicRouteTable" }
        }
      }

Este ejemplo es una simplificación de todo lo que se puede hacer con Cloudformation. Sin embargo, para hacernos a la idea de la potencia de esta herramienta conviene tener en cuenta que permite la integración con muchos de los servicios de AWS, como por ejemplo AWS Code Deploy, OpsWorks, Cloudwatch, Cloudtrail, RDS, DynamoDB, Redshift, Elasticache, S3, Auto Scaling, ELB, ECS, etc.

Especialmente a nivel de comunicaciones, Cloudformation permite establecer todo tipo de conectividad tanto entre VPCs (AWS::EC2::VPCPeeringConnection), con servicios de AWS (EC2::VPNVPC Endpoint), con Internet (AWS::EC2::NatGateway, AWS::EC2::InternetGateway).

Incluso facilita el establecimiento de una VPN que comunique el VPC  con las dependencias del cliente para gestión de cloud híbridas o simplemente para acceder más cómodamente al VPC (AWS::EC2::VPNConnection, AWS::EC2::VPNGateway).

En muchas ocasiones, y dependiendo de las necesidades, es muy útil utilizar este tipo de servicios que ofrece Amazon para evitar el sobredimensionamiento de los recursos en tu centro de datos y así poder crecer cuando sea necesario en cloud. Así mismo desde Paradigma fomentamos la definición de este tipo de infraestructuras como código por la agilidad y control que aportan sobre las mismas.

Recibe más artículos como este

Recibirás un email por cada nuevo artículo.. Acepto los términos legales

Escribe un comentario