Anexo Técnico – Integración con AWS

Esta es la guía técnica completa de los recursos que Frust despliega para conectarse con tu cuenta de AWS. Aquí encontrarás todos los stacks de CloudFormation, roles IAM y permisos involucrados — tanto en la evaluación gratuita como en el servicio de producción — junto con una explicación de qué puede y qué no puede hacer Frust con esos accesos.

1. Principal de AWS de Frust

En AWS, un Principal es la identidad autorizada para realizar acciones — en este caso, la cuenta de AWS que Frust utiliza para acceder a su entorno. Al desplegar un stack de CloudFormation de Frust, se crea un rol IAM en su cuenta que solo este Principal específico puede asumir. Esto significa que ninguna otra cuenta o usuario de AWS puede utilizar ese rol.

Todo acceso de Frust a su cuenta de AWS se realiza a través del siguiente principal de AWS, que asume roles creados en su cuenta mediante CloudFormation:

"Principal": {
  "AWS": "arn:aws:iam::064816466676:root"
}

2. Stack de Evaluación (Onboarding)

Este stack se instala durante la evaluación gratuita.

Se despliega desde la Guía de Onboarding y crea un rol IAM de solo lectura. Su propósito es permitir a Frust analizar el consumo cloud del cliente durante el período de prueba, sin modificar ningún recurso. Guía de Onboarding.

{
  "Type": "AWS::IAM::Role",
  "Properties": {
    "RoleName": "FrustEvaluation",
    "AssumeRolePolicyDocument": {
      "Principal": { "AWS": "arn:aws:iam::064816466676:root" },
      "Condition": { "StringEquals": { "sts:ExternalId": "<unique-per-client>" } }
    },
    "Policies": [
      {
        "PolicyName": "GeneralPolicy",
        "Action": [
          "ce:Describe*", "ce:Get*", "ce:List*",
          "ec2:Describe*",
          "savingsplans:Describe*", "savingsplans:List*",
          "rds:Describe*", "rds:List*"
        ]
      }
    ]
  }
}

Permisos acotados a lectura de costos, savings plans y configuración de instancias EC2 y RDS. El rol puede ser eliminado en cualquier momento desde la consola AWS. Al contratar el servicio completo, este stack es reemplazado por el ClientStack — ambos roles tienen nombres distintos (FrustEvaluation vs FrustCloudformation) y no generan conflicto.

3. Stacks de Producción (Cliente Activo)

Estos stacks se instalan solo al contratar el servicio.

Frust despliega hasta dos stacks de CloudFormation según los servicios contratados. Cada stack crea roles IAM específicos y limitados.

3.1 ClientStack (Rol IAM de Frust – MPA / Cuenta Principal)

Este stack se despliega en la cuenta principal de AWS del cliente (Management Account). Crea un rol IAM llamado FrustCloudformation que permite a Frust leer metadatos de costos, uso y recursos.

{
  "Type": "AWS::IAM::Role",
  "Properties": {
    "RoleName": "FrustCloudformation",
    "AssumeRolePolicyDocument": {
      "Principal": { "AWS": "arn:aws:iam::064816466676:root" },
      "Condition": { "StringEquals": { "sts:ExternalId": "<unique-per-client>" } }
    },
    "Policies": [
      {
        "PolicyName": "GeneralPolicy",
        "Action": [
          "application-autoscaling:Describe*",
          "autoscaling:Describe*",
          "ce:Describe*", "ce:Get*", "ce:List*",
          "cloudwatch:GetMetricData",
          "cloudformation:Describe*",
          "pricing:DescribeServices",
          "pricing:GetAttributeValues",
          "pricing:GetProducts",
          "savingsplans:Describe*", "savingsplans:List*",
          "organizations:List*", "organizations:Describe*",
          "organizations:InviteAccountToOrganization",
          "aws-portal:ViewBilling", "aws-portal:ViewUsage"
        ]
      },
      {
        "PolicyName": "EC2Policy",
        "Action": [
          "ec2:Describe*",
          "ecs:DescribeContainerInstances", "ecs:List*",
          "eks:Describe*", "eks:List*"
        ]
      },
      {
        "PolicyName": "RDSPolicy",
        "Action": ["rds:Describe*", "rds:List*"]
      },
      {
        "PolicyName": "RedShiftPolicy",
        "Action": ["redshift:Describe*"]
      },
      {
        "PolicyName": "PolicyES",
        "Action": ["es:Describe*", "es:List*"]
      },
      {
        "PolicyName": "ElasticCachePolicy",
        "Action": ["elasticache:List*", "elasticache:Describe*"]
      }
    ]
  }
}

Seguridad: El rol utiliza una condición ExternalID (sts:ExternalId) única por cliente para prevenir ataques de tipo confused deputy. Solo el principal de Frust (arn:aws:iam::064816466676:root) puede asumir este rol.

Este stack incluye organizations:InviteAccountToOrganization, que Frust utiliza para vincular sus cuentas de facturación a la organización del cliente y habilitar el uso compartido de Savings Plans. Ver sección 4 para el detalle del flujo.

El permiso cloudformation:Describe* aplica a todos los stacks de la cuenta, no solo a los de Frust. Frust lo utiliza exclusivamente para verificar que sus propios stacks están correctamente desplegados y para detectar cambios de configuración que pudieran afectar el servicio. No se almacena ni procesa información sobre otros stacks del cliente.

El permiso ec2:Describe* permite a Frust entender la arquitectura cloud del cliente y detectar cambios en el entorno que pudieran requerir ajustes en los contratos de ahorro vigentes.

3.2 FrustCUR Stack (Reporte de Costo y Uso)

Este stack configura un reporte de Costo y Uso (CUR2) en la cuenta del cliente y lo entrega a un bucket S3 privado. Frust recibe acceso de lectura a este bucket para recuperar datos de facturación.

{
  "Resources": {
    "CURS3Bucket": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": "cur-reports-{AccountId}",
        "PublicAccessBlockConfiguration": {
          "BlockPublicAcls": true,
          "BlockPublicPolicy": true,
          "IgnorePublicAcls": true,
          "RestrictPublicBuckets": true
        },
        "LifecycleConfiguration": {
          "TransitionToGlacierAfterDays": 30,
          "ExpirationInDays": 180
        }
      }
    },
    "CURS3BucketPolicy": {
      "Type": "AWS::S3::BucketPolicy",
      "Properties": {
        "Principal": {
          "AWS": "arn:aws:iam::064816466676:root",
          "Service": [
            "billingreports.amazonaws.com",
            "bcm-data-exports.amazonaws.com"
          ]
        },
        "Action": [
          "s3:GetObject",
          "s3:PutObject",
          "s3:GetBucketPolicy",
          "s3:GetBucketLocation",
          "s3:ListBucket"
        ]
      }
    },
    "CUR2Report": {
      "Type": "AWS::BCMDataExports::Export",
      "Properties": {
        "Format": "PARQUET",
        "Compression": "PARQUET",
        "TimeGranularity": "HOURLY",
        "IncludeResources": true,
        "IncludeSplitCostAllocationData": true
      }
    }
  }
}

4. Organizaciones AWS Multi-Cuenta y SCPs

Cuando el cliente opera una organización AWS multi-cuenta, el servicio de Frust opera desde cuentas propias de Frust que se vinculan a la organización del cliente. Para que esto funcione correctamente, la cuenta de administración (MPA) del cliente no debe bloquear las siguientes acciones en las cuentas miembro de la organización:

Acciones requeridas en cuentas miembro de Frust:

{
  "FrustIAMRole @ Customer MPA": {
    "Action": [
      "organizations:List*",
      "organizations:Describe*",
      "organizations:InviteAccountToOrganization"
    ]
  },
  "FrustIAMRole @ Member (Internal) Accounts": {
    "Action": [
      "organizations:AcceptHandshake",
      "organizations:DeclineHandshake",
      "organizations:LeaveOrganization"
    ]
  }
}

SCPs que pueden bloquear el servicio

Si la organización del cliente tiene Service Control Policies (SCPs) que deniegan alguna de las acciones anteriores a nivel organizacional, el servicio de Frust no podrá operar correctamente. Esto es especialmente común en organizaciones con políticas de seguridad estrictas.

Frust puede ayudar

Si existe un SCP que bloquea estas acciones, Frust puede asistir en la configuración de un SCP personalizado que permita explícitamente que las cuentas de Frust ejecuten estas acciones, sin afectar las restricciones aplicadas al resto de la organización.

Por qué Frust necesita organizations:InviteAccountToOrganization

El modelo de servicio de Frust funciona adquiriendo Savings Plans y Reserved Instances en cuentas de facturación propias y compartiéndolos con la organización del cliente para generar ahorros. Para que AWS permita ese uso compartido, las cuentas de facturación de Frust deben pertenecer a la misma organización AWS que el cliente, al menos temporalmente durante la activación. El permiso organizations:InviteAccountToOrganization permite a Frust iniciar esa invitación desde la cuenta de administración del cliente. El proceso completo es: (1) Frust solicita la invitación desde la MPA del cliente, (2) la cuenta de Frust acepta la invitación, (3) AWS habilita el uso compartido de compromisos entre ambas organizaciones. En ningún momento Frust accede a datos del cliente a través de este flujo — es una operación exclusivamente de membresía organizacional.

5. Qué Puede Hacer Frust con Estos Permisos

Stack de Evaluación

  • Leer datos de AWS Cost Explorer (costos, uso, tendencias históricas)
  • Ver el inventario de instancias reservadas y savings plans
  • Describir recursos de EC2 y RDS (tipos, configuraciones)

Stacks de Producción (Cliente Activo)

  • Todo lo anterior, más:
  • Leer los Reportes de Costo y Uso (CUR) para calcular tendencias históricas detalladas
  • Describir recursos de ECS, EKS, ElastiCache, ElasticSearch y Redshift
  • Listar y describir la estructura de AWS Organizations para análisis multi-cuenta
  • Leer métricas completas de CloudWatch para optimización avanzada de recursos
  • Acceder a metadatos de autoscaling para recomendaciones de scaling inteligente
  • Ver inventario de savings plans activos y reservas para gestión de compromisos
  • Acceder a datos de facturación consolidada en organizaciones multi-cuenta
  • Ser invitado a la organización AWS del cliente (InviteAccountToOrganization): esto permite que los Savings Plans y Reserved Instances de Frust cubran el consumo del cliente a través de la facturación consolidada. En todo momento el cliente conserva el 100% de la independencia y propiedad de sus cuentas.

5. Qué No Puede Hacer Frust

La gran mayoría de los permisos son de solo lectura (Describe*, List*, Get*). Como excepción, un conjunto reducido de acciones de escritura existe exclusivamente para la gestión del ciclo de vida de los compromisos cloud (organizations:InviteAccountToOrganization, organizations:AcceptHandshake, organizations:LeaveOrganization) — estas acciones no se ejercen sobre los datos ni recursos del cliente, sino sobre la membresía de la organización AWS de Frust. Fuera de esas excepciones, Frust explícitamente no puede:

  • Acceder, leer, modificar o eliminar ningún dato almacenado en sus bases de datos, buckets S3 (distintos al bucket CUR), repositorios de código, contenedores o instancias
  • Crear, modificar o eliminar recursos de AWS en su cuenta (fuera de las acciones de gestión de compromisos descritas arriba)
  • Modificar roles IAM, políticas o permisos más allá de los creados por los stacks de CloudFormation
  • Acceder a logs de aplicaciones, secretos, variables de entorno o archivos de configuración
  • Realizar operaciones de escritura en su infraestructura (sin ec2:Run*, sin s3:Put* más allá del bucket CUR, sin rds:Create*, etc.)
  • Acceder al contenido de sus cargas de trabajo ni a ningún dato de negocio procesado en su entorno cloud

6. Costo que Genera la Integración en tu Cuenta AWS

La integración de Frust genera un impacto económico mínimo en tu cuenta. A continuación el desglose por recurso:

Costo nulo o despreciable

  • Roles IAM (ClientStack, MarketplaceStack, Stack de Evaluación): los roles IAM no tienen costo en AWS.
  • Stacks de CloudFormation: el despliegue y mantenimiento de stacks no tiene costo.
  • Savings Plans API (savingsplans:Describe*, List*): las llamadas de solo lectura a la API de Savings Plans no tienen costo en AWS.
  • CloudWatch GetMetricData: las llamadas a GetMetricData cuestan $0,01 USD por 1.000 métricas solicitadas. El uso de Frust es puntual y mínimo — representa centavos al mes.
  • BCM Data Exports (CUR): la exportación en sí no tiene costo adicional.

Costo menor (solo con FrustCUR Stack)

El único recurso que genera costo es el bucket S3 creado por el FrustCUR Stack para almacenar los reportes de facturación:

  • ·Almacenamiento S3 Standard (primeros 30 días): ~$0,023/GB. Para una cuenta típica el CUR en formato PARQUET ocupa entre 100 MB y 1 GB al mes — menos de $0,03/mes.
  • ·Almacenamiento S3 Glacier (días 30–180): los archivos migran automáticamente a Glacier Instant Retrieval a ~$0,004/GB, reduciendo el costo a céntimos.
  • ·Eliminación automática: los archivos se eliminan automáticamente a los 180 días. No se acumula almacenamiento indefinidamente.
  • ·Cost Explorer API (ce: *): Las llamadas a la API de Cost Explorer cuestan /bin/zsh,01 USD por solicitud. El uso de Frust es mínimo — típicamente menos de 100 llamadas al mes, lo que representa menos de USD al mes.
Costo total:La integración de Frust en tu cuenta AWS es inferior a $0,05 USD al mes para la gran mayoría de los clientes.

6. Cumplimiento con SOC 2 e ISO 27001

El modelo de acceso descrito en este anexo está diseñado para ser compatible con SOC 2 (Criterios de Servicios de Confianza) e ISO 27001. A continuación se presenta un mapeo punto a punto de cómo la integración de Frust aborda los requisitos de cada marco.

Toda actividad de Frust en su cuenta de AWS queda registrada automáticamente en AWS CloudTrail bajo su propia cuenta, sin ninguna configuración adicional. El cliente puede auditar o alertar sobre esta actividad en cualquier momento.

SOC 2 — Criterios de Servicios de Confianza

SOC 2 evalúa cinco Criterios de Servicios de Confianza: Seguridad, Disponibilidad, Integridad del Procesamiento, Confidencialidad y Privacidad. Así es como la integración de Frust aborda los criterios relevantes para este modelo de acceso:

  • Seguridad (CC6): El acceso a su entorno está estrictamente controlado mediante roles IAM con políticas de mínimo privilegio. La condición ExternalID previene la asunción no autorizada de roles. No existe acceso permanente — Frust usa credenciales STS temporales que expiran automáticamente.
  • Confidencialidad (CC9): Frust solo accede a metadatos de recursos cloud (tipos de instancia, patrones de uso, datos de facturación). Nunca se accede ni almacena datos de negocio, datos de aplicaciones, secretos o código fuente.
  • Disponibilidad (A1): La integración de Frust no se sitúa en el flujo de datos de sus cargas de trabajo. Sus aplicaciones siguen funcionando independientemente del estado del servicio de Frust. Los stacks de CloudFormation son roles IAM pasivos que no introducen ninguna dependencia de disponibilidad.
  • Integridad del Procesamiento (PI1): Todas las recomendaciones y acciones de Frust se basan exclusivamente en los metadatos que usted autoriza. No se realizan modificaciones en su infraestructura sin una acción explícita a través de la plataforma Frust.
  • Privacidad (P1–P8): Frust no recopila ni procesa datos personales a través de la integración con AWS. Sin embargo, los datos de facturación CUR pueden contener información personal indirecta si el cliente utiliza etiquetas (tags) de recursos con nombres o correos. Frust trata todos los datos de facturación con las mismas garantías de confidencialidad que aplica a cualquier dato personal.

ISO 27001 — Mapeo de Controles Clave

ISO 27001 es un estándar internacional para la gestión de la seguridad de la información. Define un conjunto de controles (el catálogo Anexo A) que las organizaciones deben implementar para proteger sus activos de información. Cuando una empresa está certificada en ISO 27001, significa que un auditor independiente ha verificado que esos controles están efectivamente implementados y funcionando. El mapeo a continuación muestra qué controles específicos de ese catálogo aplican a la integración de Frust con su entorno de AWS.

  • Mínimo privilegio (A.9.4): Todos los roles IAM otorgan solo los permisos mínimos necesarios para prestar los servicios contratados.
  • Sin acceso a datos de negocio (A.9.4.1): Frust accede únicamente a metadatos de infraestructura cloud, no a datos procesados o almacenados por sus cargas de trabajo.
  • Condición ExternalID (A.9.2): Previene la asunción no autorizada de roles (ataque confused deputy), según las mejores prácticas de AWS.
  • Pista de auditoría (A.12.4): Todas las asunciones de roles por parte de Frust quedan registradas en AWS CloudTrail bajo su cuenta, brindando visibilidad total y respaldando sus propios requisitos de auditoría.
  • Segregación de datos (A.9.4.1): Los datos de facturación CUR se almacenan en un bucket S3 privado y dedicado, con acceso restringido a Frust y los servicios de facturación de AWS.
  • Revocabilidad (A.9.2.6): El acceso puede revocarse en cualquier momento eliminando los stacks de CloudFormation, lo que elimina todos los roles IAM otorgados a Frust.
  • Sin credenciales persistentes (A.9.2.4): Frust utiliza credenciales temporales STS (AssumeRole) y nunca almacena claves de acceso de larga duración en su entorno.
frust
un@frust.co🇨🇱 Callao 2911, of 4144, Santiago, RM, 7550285🇺🇸 1111B S Governors Ave STE 29963, Dover, DE 19904
LinkedInAWS PartnerAWS Qualified