AWSTemplateFormatVersion: '2010-09-09'
Description: >
  Rol de solo lectura para la revisión de costos y seguridad de CloudTing.
  Permite ver la configuración y la facturación de la cuenta. No permite crear,
  modificar ni borrar recursos, ni leer el contenido de archivos en S3 o el
  valor de secretos. Para quitar el acceso basta con borrar este stack.

Parameters:
  CuentaCloudTing:
    Type: String
    AllowedPattern: '^\d{12}$'
    Description: ID de la cuenta de AWS de CloudTing (se lo enviamos con el NDA)
  ExternalId:
    Type: String
    MinLength: 8
    NoEcho: true
    Description: Código compartido que acordamos por separado; evita que otra cuenta use este rol

Resources:
  RolRevision:
    Type: AWS::IAM::Role
    Properties:
      RoleName: CloudTingRevisionSoloLectura
      Description: Acceso de solo lectura para la revisión de CloudTing
      MaxSessionDuration: 3600
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              AWS: !Sub 'arn:aws:iam::${CuentaCloudTing}:root'
            Action: sts:AssumeRole
            Condition:
              StringEquals:
                sts:ExternalId: !Ref ExternalId
      ManagedPolicyArns:
        # Ver configuración de servicios sin acceso a datos.
        - arn:aws:iam::aws:policy/job-function/ViewOnlyAccess
        # Configuración de seguridad (IAM, CloudTrail, grupos de seguridad...).
        - arn:aws:iam::aws:policy/SecurityAudit
        # Facturación en solo lectura.
        - arn:aws:iam::aws:policy/AWSBillingReadOnlyAccess
      Policies:
        - PolicyName: MetricasYCostos
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - ce:Get*
                  - ce:Describe*
                  - ce:List*
                  - savingsplans:Describe*
                  - compute-optimizer:Get*
                  - compute-optimizer:Describe*
                  - cloudwatch:GetMetricData
                  - cloudwatch:GetMetricStatistics
                  - budgets:ViewBudget
                  - support:DescribeTrustedAdvisor*
                  - cost-optimization-hub:ListRecommendationSummaries
                  - cost-optimization-hub:ListRecommendations
                  - cost-optimization-hub:GetPreferences
                Resource: '*'
        - PolicyName: InventarioServicios
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              # Solo describe/list/get de configuración. Ninguna acción lee el
              # contenido de bases de datos, imágenes, objetos ni secretos.
              - Effect: Allow
                Action:
                  - ec2:Describe*
                  - ec2:GetEbsEncryptionByDefault
                  - elasticloadbalancing:Describe*
                  - rds:Describe*
                  - rds:ListTagsForResource
                  - eks:List*
                  - eks:Describe*
                  - ecs:List*
                  - ecs:Describe*
                  - ecr:DescribeRepositories
                  - ecr:DescribeImages
                  - ecr:GetLifecyclePolicy
                  - lambda:ListFunctions
                  - s3:ListAllMyBuckets
                  - s3:GetLifecycleConfiguration
                  - s3:GetAccountPublicAccessBlock
                  - guardduty:ListDetectors
                  - config:DescribeConfigurationRecorders
                  - dynamodb:ListTables
                  - dynamodb:DescribeTable
                Resource: '*'

Outputs:
  RolArn:
    Description: Envíenos este valor para empezar la revisión
    Value: !GetAtt RolRevision.Arn
