Lee esto antes de Implementar VPC Endpoint con S3 con Terraform
Tags: awsespañol, awss3, terraform, awsvpcendpoints
Published: 2023-09-29 21:00:41


En este artículo, aprenderás cómo limitar de manera segura el acceso al flujo de datos sensible de una organización desde una VPC específica a un AWS-S3 privado, utilizando VPC endpoints con Terraform.

**Caso**

Como parte de un plan de seguridad que tiene como objetivo reducir los costos organizativos, tu gerente se pone en contacto contigo para hablar sobre la reestructuración del flujo de datos sensible desde tu VPC privada hasta tu S3 privado y desde el S3 de vuelta a la VPC.

**Diseño de la infraestructura actual**

La infraestructura actual permite el tráfico a través de Internet, lo que requiere una gran cantidad de configuraciones con reglas de firewall que, como todos sabemos, pueden ser extremadamente complejas si no se implementan correctamente. El costo de transferencia de datos es más alto de lo planeado debido al uso de un dispositivo NatGateway. El control de acceso granular mediante SSL y TLS es excesivo y complejo. Finalmente, múltiples recursos en diferentes regiones resultan en una latencia aumentada.

**Tu gerente te pregunta**

¿Qué puedes hacer para facilitar esta transformación, pero al mismo tiempo cumplir con lo necesario para que nuestro negocio siga funcionando de manera segura y con costos mínimos?

Inmediatamente, ves la oportunidad de utilizar VPC endpoints para este caso. Pero antes de responder a la pregunta anterior, consideremos lo siguiente:

**¿Sabes qué son los VPC endpoints?**

Los VPC endpoints son dispositivos virtuales redundantes que escalan horizontalmente y son componentes altamente disponibles en una VPC.

Actualmente, existen 3 tipos diferentes de VPC endpoints (hasta la fecha conocidos) y se utilizan según el servicio admitido.

1. Endpoints de interface
2. Endpoints de Gateway Load Balancer
3. Endpoints de Gateway

Ahora que tenemos un breve resumen de lo que son los VPCe, necesitamos comprender cuándo y por qué los utilizamos.

Cuando usas un VPCe, eliminas la necesidad de usar un Internet Gateway o un dispositivo Nat Gateway. El VPCe se ejecuta exclusivamente utilizando la red de AWS. En este artículo, nos centraremos en los endpoints de Gateway.

**¿Cómo funcionan los endpoints de VPC-Gateway?**

Los endpoints de VPC-Gateway se utilizan para comunicarse de manera privada y segura con recursos públicos como S3 y DynamoDB.

Analicemos un poco más este escenario primero. Imagina que tienes varios servicios alojados en tu VPC y deseas darles acceso a estos servicios públicos sin que el tráfico fluya por Internet ni configurar una conexión VPN. Bueno, como experimentarás al final de este artículo, los endpoints de VPC-Gateway podrían ayudarte a evitar todas las configuraciones innecesarias de manera muy efectiva.

**¿Qué necesitas para configurar una conexión de endpoint de VPC-Gateway con un  S3 y cómo funciona?**

En primer lugar, necesitarás una VPC con una o dos subredes y una tabla de rutas. Luego, deberás crear un endpoint de tipo Gateway VPCe por región para conectarte con el S3. La conexión se produce a nivel de subred y se adjunta una lista de prefijos (pl-xxxxxxx) a la tabla de rutas asociada con tu(s) subred(es) y un nombre de lista de prefijos de AWS utiliza el formato "com.amazonaws.region.service". Un hecho importante a mencionar sobre VPCe es que AWS actualiza la lista de prefijos en tu nombre. ¿Recuerdas el gran efuerzo de actualizar múltiples firewalls? Eso ya no es necesario 😊

**Ejemplo de configuración de tabla de rutas:**

![Route table configuration example](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rj8ax2i7lhrf5h6auz3c.png)

Es posible que estés pensando que esto definitivamente facilita la conexión, pero **¿cómo puedo hacer que sea completamente seguro?**

Los VPC endpoints ofrecen una política de endpoint lista para usar de forma predeterminada. Esta opción permite una conexión completa a cada S3 en nuestra cuenta, lo cual no necesariamente queremos. Afortunadamente, también puedes crear tu propia política personalizada. Observa el ejemplo a continuación.

En este ejemplo de política personalizada, todas las solicitudes o el tráfico fuera de tu VPC serán denegados.

```
resource "aws_s3_bucket_policy" "allow_access_to_specific_vpce_only" {
  vpc_endpoint_id = aws_vpc_endpoint.gw_endpoint.id
  policy = jsonencode({
    "Version": "2012-10-17",
    "Statement": [
        {
        "Sid": "Access-to-specific-VPCE-only",
        "Principal": "*",
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": ["${aws_s3_bucket.work_load_bucket.arn}",
                    "${aws_s3_bucket.work_load_bucket.arn}/*"],
        "Condition": {
            "StringNotEquals": {
            "aws:SourceVpce": "${aws_vpc.vpc_end_point.id}"
            }
        }
    }
    ]
  })
}
```

Aunque el endpoint de Gateway parece ser una solución perfecta en este caso, tiene algunas limitaciones actuales (nuevamente, hasta la fecha conocidas):

1. Los endpoints son compatibles solo dentro de la misma región. No puedes crear un endpoint entre una VPC y un servicio en una región diferente.
2. Los endpoints admiten solo tráfico IPv4.
3. No puedes transferir un endpoint de una VPC a otra ni de un servicio a otro.
4. Tienes un límite en la cantidad de endpoints que puedes crear por VPC.
5. Las conexiones de endpoints no pueden extenderse fuera de una VPC.

[Documentación](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-gateway.html#vpc-endpoints-limitations)

![VPCe diagram](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/knrdw3i2zitc8xndsbe1.png)

**AWS Costo de transferencia de datos**

![AWS data transfer cost](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qrv4kiks0l1u6dum2ift.png)

[creditos para The Open Guide to Amazon Web Services](https://github.com/open-guides/og-aws#aws-data-transfer-costs)

**Conclusión**

Espero que este artículo te haya dado una mejor comprensión del poder de los VPC endpoints y sus limitaciones. 

Ahora ve y despliega este proyecto utilizando Terraform!

Funciones, argumentos y expresiones de Terraform que se utilizaron en este proyecto:

[provider](https://registry.terraform.io/providers/hashicorp/aws/latest/docs) 
[variables](https://learn.hashicorp.com/tutorials/terraform/aws-variables) 
[resources](https://www.terraform.io/plugin/sdkv2/resources)

[Encuentra el repositorio de Terraform y las instrucciones para este proyecto aquí.](https://github.com/ValAug/vpc-endpoint-connection-with-s3)