" Default: "/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64" #EC2 Resources: EC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !Ref LatestAmiId InstanceType: t3.small SecurityGroupIds: - !Ref EC2SecurityGroup SubnetId: !Ref PublicSubnet1 KeyName: wsi IamInstanceProfile: !Ref AdminInstanceProfile UserData: Fn::Base64: !Sub | #!/bin/bash yum update -y Tags: - Key: Name Value: !Sub ${EnvironmentName}-bastion-ec2 # EIP ElasticIP: Type: "AWS::EC2::EIP" Properties: InstanceId: !Ref EC2Instance #Security Group EC2SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: !Sub ${EnvironmentName}-bastion-"> " Default: "/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64" #EC2 Resources: EC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !Ref LatestAmiId InstanceType: t3.small SecurityGroupIds: - !Ref EC2SecurityGroup SubnetId: !Ref PublicSubnet1 KeyName: wsi IamInstanceProfile: !Ref AdminInstanceProfile UserData: Fn::Base64: !Sub | #!/bin/bash yum update -y Tags: - Key: Name Value: !Sub ${EnvironmentName}-bastion-ec2 # EIP ElasticIP: Type: "AWS::EC2::EIP" Properties: InstanceId: !Ref EC2Instance #Security Group EC2SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: !Sub ${EnvironmentName}-bastion-"> " Default: "/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64" #EC2 Resources: EC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !Ref LatestAmiId InstanceType: t3.small SecurityGroupIds: - !Ref EC2SecurityGroup SubnetId: !Ref PublicSubnet1 KeyName: wsi IamInstanceProfile: !Ref AdminInstanceProfile UserData: Fn::Base64: !Sub | #!/bin/bash yum update -y Tags: - Key: Name Value: !Sub ${EnvironmentName}-bastion-ec2 # EIP ElasticIP: Type: "AWS::EC2::EIP" Properties: InstanceId: !Ref EC2Instance #Security Group EC2SecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: !Sub ${EnvironmentName}-bastion-">
Parameters:
  EnvironmentName:
    Description: prefixed to resource names
    Type: String
    Default: "wsi"

  LatestAmiId:
    Type: "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>"
    Default: "/aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64"

#EC2
Resources:
  EC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: !Ref LatestAmiId
      InstanceType: t3.small
      SecurityGroupIds:
        - !Ref EC2SecurityGroup
      SubnetId: !Ref PublicSubnet1
      KeyName: wsi
      IamInstanceProfile: !Ref AdminInstanceProfile
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          yum update -y
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-bastion-ec2

  # EIP
  ElasticIP:
    Type: "AWS::EC2::EIP"
    Properties:
      InstanceId: !Ref EC2Instance

  #Security Group
  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: !Sub ${EnvironmentName}-bastion-sg
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-bastion-sg

  #IAM
  AdminIAMRole:
    Type: AWS::IAM::Role
    DeletionPolicy: Retain
    Properties:
      RoleName: !Sub ${EnvironmentName}-admin-role
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service:
                - "ec2.amazonaws.com"
            Action:
              - "sts:AssumeRole"
      Path: "/"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AdministratorAccess"

  AdminInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Path: /
      Roles:
        - !Ref "AdminIAMRole"

Outputs:
  EC2Instance:
    Description: "EC2 Instance"
    Value: !Ref EC2Instance
    Export:
      Name:
        "Fn::Sub": "${AWS::StackName}-EC2-Instance"

  EC2SecurityGroup:
    Description: "EC2 Security Group"
    Value: !Ref EC2SecurityGroup
    Export:
      Name:
        "Fn::Sub": "${AWS::StackName}-bastion-sg"