Default: /aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64 Resources: ASGInstanceRole: Type: AWS::IAM::Role Properties: RoleName: !Sub "${Environment}-role-bastion" AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: ec2.a"> Default: /aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64 Resources: ASGInstanceRole: Type: AWS::IAM::Role Properties: RoleName: !Sub "${Environment}-role-bastion" AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: ec2.a"> Default: /aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64 Resources: ASGInstanceRole: Type: AWS::IAM::Role Properties: RoleName: !Sub "${Environment}-role-bastion" AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: ec2.a">
Parameters:
Environment:
Type: String
Description: Environment name
Default: wsi
PolicyName:
Type: String
Description: IAM Policy Name for S3 Access
Default: AmazonS3ReadOnlyAccess
AutoScalingGroupName:
Type: String
Description: "The Name of Auto Scaling Group"
Default: wsi-app
TargetGroupArn:
Type: String
Description: Target Group ARN
BastionSecurityGroupId:
Type: AWS::EC2::SecurityGroup::Id
Description: Bastion Host Security Group ID
LatestAmazonLinux2023AMI:
Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
Default: /aws/service/ami-amazon-linux-latest/al2023-ami-minimal-kernel-default-x86_64
Resources:
ASGInstanceRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "${Environment}-role-bastion"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: ec2.amazonaws.com
S3AccessPolicy:
Type: AWS::IAM::RolePolicyAttachment
Properties:
Role: !Ref ASGInstanceRole
PolicyArn: !Sub "arn:aws:iam::aws:policy/${PolicyName}"
ASGInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
InstanceProfileName: !Sub "${Environment}-profile-asg"
Roles:
- !Ref ASGInstanceRole
ASGSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub "${Environment}-asg-sg"
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: !Ref <Port>
ToPort: !Ref <Port>
SourceSecurityGroupId: !Ref BastionSecurityGroupId
SecurityGroupEgress:
- IpProtocol: tcp
FromPort: !Ref <Port>
ToPort: !Ref <Port>
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: !Sub "${Environment}-asg-sg"
ASGLaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateName: web_test_lt
LaunchTemplateData:
ImageId: !Ref LatestAmazonLinux2023AMI
InstanceType: <InstanceType>
KeyName: <KeyPairName>
SecurityGroupIds:
- !Ref ASGSecurityGroup
IamInstanceProfile:
Arn: !GetAtt ASGInstanceProfile.Arn
UserData:
Fn::Base64: |
#!/bin/bash
yum update -y
TagSpecifications:
- ResourceType: instance
Tags:
- Key: Name
Value: !Sub ${AutoScalingGroupName}
AutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AutoScalingGroupName: !Ref AutoScalingGroupName
DesiredCapacity: 2
MinSize: 2
MaxSize: 10
VPCZoneIdentifier:
- !Ref PrivateSubnet1
- !Ref PrivateSubnet2
- !Ref PrivateSubnet3
TargetGroupARNs:
- !Ref TargetGroupArn
LaunchTemplate:
LaunchTemplateId: !Ref ASGLaunchTemplate
Version: !GetAtt ASGLaunchTemplate.LatestVersionNumber
AutoScalingPolicy:
Type: AWS::AutoScaling::ScalingPolicy
Properties:
AutoScalingGroupName: !Ref AutoScalingGroup
PolicyType: TargetTrackingScaling
TargetTrackingConfiguration:
PredefinedMetricSpecification:
PredefinedMetricType: ASGAverageCPUUtilization
TargetValue: 10.0
Outputs:
AutoScalingGroupName:
Description: Auto Scaling Group Name
Value: !Ref AutoScalingGroup
AutoScalingPolicyArn:
Description: Auto Scaling Policy ARN
Value: !Ref AutoScalingPolicy