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:

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:

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:

javascript
<br />
"VPC" : {<br />
  "Type" : "AWS::EC2::VPC",<br />
  "Properties" : {<br />
    "CidrBlock" : “10.1.0.0/16”,<br />
  }<br />
}<br />

javascript
<br />
"SubnetPublic1": {<br />
            "DependsOn" : ["VPC"],<br />
            "Type" : "AWS::EC2::Subnet",<br />
            "Properties" : {<br />
                "AvailabilityZone" : “eu-west-1a”,<br />
                "CidrBlock" : “10.1.1.0/24”,<br />
                "VpcId" : { "Ref": "VPC" },<br />
            }<br />
        },<br />
        "SubnetPublic2": {<br />
            "DependsOn" : ["VPC"],<br />
            "Type" : "AWS::EC2::Subnet",<br />
            "Properties" : {<br />
                "AvailabilityZone" : “eu-west-1b”,<br />
                "CidrBlock" : “10.1.2.0/24”,<br />
                "VpcId" : { "Ref": "VPC" },<br />
            }<br />
        },<br />
        "SubnetPublic3": {<br />
            "DependsOn" : ["VPC"],<br />
            "Type" : "AWS::EC2::Subnet",<br />
            "Properties" : {<br />
                "AvailabilityZone" : “eu-west-1c”,<br />
                "CidrBlock" : “10.1.3.0/24”,<br />
                "VpcId" : { "Ref": "VPC" },<br />
            }<br />
        }<br />

javascript
<br />
"InternetGateway" : {<br />
           "DependsOn" : ["VPC"],<br />
           "Type" : "AWS::EC2::InternetGateway",<br />
           "Properties" : {<br />
               "Tags" : [<br />
                   { "Key" : "Gateway", "Value" : "MyGateway" }<br />
               ]<br />
           }<br />
       },</p>
<p>       "VPCGatewayAttachment" : {<br />
          "DependsOn" : ["VPC", "InternetGateway"],<br />
          "Type" : "AWS::EC2::VPCGatewayAttachment",<br />
          "Properties" : {<br />
            "VpcId" : { "Ref" : "VPC" },<br />
            "InternetGatewayId" : { "Ref" : "InternetGateway" }<br />
          }<br />
       },<br />

javascript
<br />
"PublicRouteTable" : {<br />
        "DependsOn" : ["VPC"],<br />
        "Type" : "AWS::EC2::RouteTable",<br />
        "Properties" : {<br />
          "VpcId" : { "Ref" : "VPC" },<br />
        }<br />
      },<br />
      "PublicRoute" : {<br />
        "DependsOn" : ["PublicRouteTable", "InternetGateway"],<br />
        "Type" : "AWS::EC2::Route",<br />
        "Properties" : {<br />
          "RouteTableId" : { "Ref" : "PublicRouteTable" },<br />
          "DestinationCidrBlock" : "0.0.0.0/0",<br />
          "GatewayId" : { "Ref" : "InternetGateway" }<br />
        }<br />
      },<br />
      "PublicSubnetRouteTableAssociation1" : {<br />
        "DependsOn" : ["SubnetPublic1", "PublicRouteTable"],<br />
        "Type" : "AWS::EC2::SubnetRouteTableAssociation",<br />
        "Properties" : {<br />
          "SubnetId" : { "Ref" : "SubnetPublic1" },<br />
          "RouteTableId" : { "Ref" : "PublicRouteTable" }<br />
        }<br />
      },<br />
      "PublicSubnetRouteTableAssociation2" : {<br />
        "DependsOn" : ["SubnetPublic2", "PublicRouteTable"],<br />
        "Type" : "AWS::EC2::SubnetRouteTableAssociation",<br />
        "Properties" : {<br />
          "SubnetId" : { "Ref" : "SubnetPublic2" },<br />
          "RouteTableId" : { "Ref" : "PublicRouteTable" }<br />
        }<br />
      },<br />
      "PublicSubnetRouteTableAssociation3" : {<br />
        "DependsOn" : ["SubnetPublic3", "PublicRouteTable"],<br />
        "Type" : "AWS::EC2::SubnetRouteTableAssociation",<br />
        "Properties" : {<br />
          "SubnetId" : { "Ref" : "SubnetPublic3" },<br />
          "RouteTableId" : { "Ref" : "PublicRouteTable" }<br />
        }<br />
      }<br />

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.

Nuevo llamado a la acción

hbspt.cta.load(2189055, '3733f91c-e3fa-4e62-b6ce-12833fc684f5', {});

Cuéntanos qué te parece.

Enviar.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.