Parameters:
  EnvironmentName:
    Description: An environment name that is prefixed to resource names
    Type: String
    Default: "wsi"

Resources:
  EIPAlb1:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

  EIPAlb2:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

  EIPAlb3:
    Type: AWS::EC2::EIP
    Properties:
      Domain: vpc

  NLBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Sub "${EnvironmentName}-nlb-sg"
      VpcId: !Ref MainVPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:
        - IpProtocol: -1
          FromPort: 0
          ToPort: 0
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: !Sub "${EnvironmentName}-nlb-sg"

  NetworkLoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: !Sub "${EnvironmentName}-nlb"
      Type: network
      Scheme: internet-facing
      SecurityGroups:
        - !Ref NLBSecurityGroup
      SubnetMappings:
        - SubnetId: !Ref PublicSubnet1
          AllocationId: !GetAtt EIPAlb1.AllocationId
        - SubnetId: !Ref PublicSubnet2
          AllocationId: !GetAtt EIPAlb2.AllocationId
        - SubnetId: !Ref PublicSubnet3
          AllocationId: !GetAtt EIPAlb3.AllocationId
      Tags:
        - Key: Name
          Value: !Sub "${EnvironmentName}-nlb"

  NLBTargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      Name: !Sub "${EnvironmentName}-tg"
      Port: 80
      Protocol: HTTP
      VpcId: !Ref MainVPC
      TargetType: instance
      HealthCheckPath: /health
      HealthCheckProtocol: HTTP
      HealthCheckIntervalSeconds: 30
      HealthyThresholdCount: 2
      UnhealthyThresholdCount: 2
      HealthCheckTimeoutSeconds: 5
      Tags:
        - Key: Name
          Value: !Sub "${EnvironmentName}-tg"

  NLBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref NetworkLoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref NLBTargetGroup

  NLBTargetGroupAttachment:
    Type: AWS::ElasticLoadBalancingV2::TargetGroupAttachment
    Properties:
      TargetGroupArn: !Ref NLBTargetGroup
      TargetId: !Ref EC2Instance
      Port: 80

Outputs:
  NLBSecurityGroupId:
    Description: NLB Security Group ID
    Value: !Ref NLBSecurityGroup

  NLBId:
    Description: Network Load Balancer ID
    Value: !Ref NetworkLoadBalancer

  EIPAlb1Id:
    Description: EIP1 ID
    Value: !Ref EIPAlb1

  EIPAlb2Id:
    Description: EIP2 ID
    Value: !Ref EIPAlb2

  EIPAlb3Id:
    Description: EIP3 ID
    Value: !Ref EIPAlb3