---
AWSTemplateFormatVersion: '2010-09-09'
Description: >

  This Cloudformation Template deploys the Security Groups used by all stacks.

  Disclaimer: Not for production use. Demo and testing purposes only.

  Author: David Surey <suredavi@amazon.com>, Bastian Klein <basklein@amazon.com>

Parameters:
  BBBVPCs:
    Description: Reference for the VPC
    Type: String
  BBBEnvironmentType:
    Description: 'Defines the environment type. Allowed values: scalable, single'
    AllowedValues:
      - scalable
      - single
    Type: String
  BBBEnvironmentStage:
    Type: String
    Description: Select the appropriate environment
    AllowedValues:
      - stage
      - prod
      - dev
  BBBECSInstanceType: 
    Description: Set the ECS Cluster Type to either EC2 based or Fargate based deployments
    Type: String

Conditions:
  BBBScalableEnvironment: !Equals [!Ref BBBEnvironmentType, scalable]
  BBBECSFargate: !Equals [!Ref BBBECSInstanceType, fargate]
  BBBECSEC2: !Not [!Equals [!Ref BBBECSInstanceType, fargate]]

Resources:
  BBBECSTaskSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Condition: BBBScalableEnvironment
    Properties:
      GroupDescription: ECS Instance Security Group
      VpcId: !Ref BBBVPCs

  BBBECSTaskSecurityGroupPorts:
    Type: AWS::EC2::SecurityGroupIngress
    Condition: BBBScalableEnvironment
    Properties:
      GroupId: !Ref BBBECSTaskSecurityGroup
      IpProtocol: tcp
      FromPort: !If [ BBBECSFargate, 80, 32768]
      ToPort: !If [ BBBECSFargate, 80, 60999]
      SourceSecurityGroupId: !Ref BBBScaleliteELBSecurityGroup

  BBBScaleliteELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Condition: BBBScalableEnvironment
    Properties:
      GroupDescription: Scalelite Security Group
      VpcId: !Ref BBBVPCs

  BBBScaleliteELBSecurityGroupPorts:
    Type: AWS::EC2::SecurityGroupIngress
    Condition: BBBScalableEnvironment
    Properties:
      GroupId: !Ref BBBScaleliteELBSecurityGroup
      IpProtocol: tcp
      FromPort: 443
      ToPort: 443
      CidrIp: 0.0.0.0/0

  BBBFrontendELBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Condition: BBBScalableEnvironment
    Properties:
      GroupDescription: ALB Security Group
      VpcId: !Ref BBBVPCs

  BBBECSSecurityGroupPublicports:
    Type: AWS::EC2::SecurityGroupIngress
    Condition: BBBScalableEnvironment
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: tcp
      FromPort: 443
      ToPort: 443
      GroupId: !Ref BBBFrontendELBSecurityGroup

  BBBECSSecurityGroupPublicHTTP:
    Type: AWS::EC2::SecurityGroupIngress
    Condition: BBBScalableEnvironment
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: tcp
      FromPort: 80
      ToPort: 80
      GroupId: !Ref BBBFrontendELBSecurityGroup

  BBBFrontendSecurityGroupALBports:
    Type: AWS::EC2::SecurityGroupIngress
    Condition: BBBScalableEnvironment
    Properties:
      GroupId: !Ref BBBECSTaskSecurityGroup
      IpProtocol: tcp
      FromPort: !If [ BBBECSFargate, 80, 32768]
      ToPort: !If [ BBBECSFargate, 80, 60999]
      SourceSecurityGroupId: !Ref BBBFrontendELBSecurityGroup

  BBBDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Condition: BBBScalableEnvironment
    Properties:
      VpcId:
        Ref: BBBVPCs
      GroupDescription: Security group for the Postgres DB

  BBBDBSecurityGroupPorts:
    Type: AWS::EC2::SecurityGroupIngress
    Condition: BBBScalableEnvironment
    Properties:
      SourceSecurityGroupId: !Ref BBBECSTaskSecurityGroup
      IpProtocol: tcp
      FromPort: 5432
      ToPort: 5432
      GroupId: !Ref BBBDBSecurityGroup

  BBBCACHEDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Condition: BBBScalableEnvironment
    Properties:
      VpcId:
        Ref: BBBVPCs
      GroupDescription: Security group for the Redis Cache

  BBBCACHEDBSecurityGroupPorts:
    Type: AWS::EC2::SecurityGroupIngress
    Condition: BBBScalableEnvironment
    Properties:
      SourceSecurityGroupId: !Ref BBBECSTaskSecurityGroup
      IpProtocol: tcp
      FromPort: 6379
      ToPort: 6379
      GroupId: !Ref BBBCACHEDBSecurityGroup

  BBBApplicationSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: BBBVPCs
      GroupDescription: Security group for the BigBlueButton Application Host

  BBBApplicationSecurityGroupWebSSLPort:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: tcp
      FromPort: 443
      ToPort: 443
      GroupId: !Ref BBBApplicationSecurityGroup

  BBBApplicationSecurityGroupWebPlainPort:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: tcp
      FromPort: 80
      ToPort: 80
      GroupId: !Ref BBBApplicationSecurityGroup

  BBBApplicationSecurityGroupVCPorts:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: udp
      FromPort: 16384
      ToPort: 32768
      GroupId: !Ref BBBApplicationSecurityGroup

  BBBApplicationSecurityGroupTurnPorts:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      SourceSecurityGroupId: !Ref BBBTurnSecurityGroup
      IpProtocol: udp
      FromPort: 49152
      ToPort: 65535
      GroupId: !Ref BBBApplicationSecurityGroup

  BBBTurnSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId:
        Ref: BBBVPCs
      GroupDescription: Security group for the Turn Host

  BBBTurnSecurityGroupWebSSLPort:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: tcp
      FromPort: 443
      ToPort: 443
      GroupId: !Ref BBBTurnSecurityGroup

  BBBTurnSecurityGroupWebPlainPort:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: tcp
      FromPort: 80
      ToPort: 80
      GroupId: !Ref BBBTurnSecurityGroup

  BBBTurnSecurityGroupWebSSLUDPPort:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: udp
      FromPort: 443
      ToPort: 443
      GroupId: !Ref BBBTurnSecurityGroup

  BBBTurnSecurityGroupWebPlainUDPPort:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: udp
      FromPort: 3478
      ToPort: 3478
      GroupId: !Ref BBBTurnSecurityGroup

  BBBTurnSecurityGroupWebPlainTCPPort:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      CidrIp: 0.0.0.0/0
      IpProtocol: tcp
      FromPort: 3478
      ToPort: 3478
      GroupId: !Ref BBBTurnSecurityGroup

  BBBSharedStorageSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Condition: BBBScalableEnvironment
    Properties:
      VpcId:
        Ref: BBBVPCs
      GroupDescription: Security group for the Shared Storage

  BBBSharedStorageSecurityGroupApplicationPort:
    Type: AWS::EC2::SecurityGroupIngress
    Condition: BBBScalableEnvironment
    Properties:
      SourceSecurityGroupId: !Ref BBBApplicationSecurityGroup
      IpProtocol: tcp
      FromPort: 2049
      ToPort: 2049
      GroupId: !Ref BBBSharedStorageSecurityGroup

  BBBSharedStorageSecurityGroupECSPort:
    Type: AWS::EC2::SecurityGroupIngress
    Condition: BBBScalableEnvironment
    Properties:
      SourceSecurityGroupId: !Ref BBBECSTaskSecurityGroup
      IpProtocol: tcp
      FromPort: 2049
      ToPort: 2049
      GroupId: !Ref BBBSharedStorageSecurityGroup

Outputs:
  BBBECSTaskSecurityGroup:
    Condition: BBBScalableEnvironment
    Description: A reference to the created Security Group for ECS
    Value: !Ref BBBECSTaskSecurityGroup
  BBBFrontendELBSecurityGroup:
    Condition: BBBScalableEnvironment
    Description: A reference to the created Security Group for ELB
    Value: !Ref BBBFrontendELBSecurityGroup
  BBBScaleliteELBSecurityGroup:
    Condition: BBBScalableEnvironment
    Description: A reference to the created Security Group for the Scalelite Load Balancer
    Value: !Ref BBBScaleliteELBSecurityGroup
  BBBDBSecurityGroup:
    Condition: BBBScalableEnvironment
    Description: A reference to the created Security Group for the Database
    Value: !Ref BBBDBSecurityGroup
  BBBCACHEDBSecurityGroup:
    Condition: BBBScalableEnvironment
    Description: A reference to the created Security Group for the Redis Cache
    Value: !Ref BBBCACHEDBSecurityGroup
  BBBApplicationSecurityGroup:
    Description: A reference to the created Security Group for the Public Ports of the Application
    Value: !Ref BBBApplicationSecurityGroup
  BBBTurnSecurityGroup:
    Description: A reference to the created Security Group for the Public Ports of the Turn Service
    Value: !Ref BBBTurnSecurityGroup
  BBBSharedStorageSecurityGroup:
    Condition: BBBScalableEnvironment
    Description: A reference to the created Security Group for the SharedStorage
    Value: !Ref BBBSharedStorageSecurityGroup