prefix: 0.0.0.0/0
amiID: ami-0ab0bbbd329f565e6
AWSTemplateFormatVersion: "2010-09-09"
Description:
ELB and EC2 Instance Create
Metadata:
"AWS::CloudFormation::Interface":
ParameterGroups:
- Label:
default: "Project Name Prefix"
Parameters:
- PJPrefix
- Label:
default: "InternetELB Configuration"
Parameters:
- InternetELBName
- Label:
default: "EC2Instance Configuration"
Parameters:
- KeyPairName
- EC2InstanceName
- EC2InstanceAMI
- EC2InstanceInstanceType
- EC2InstanceVolumeType
- EC2InstanceVolumeSize
- SSHAccessSourceIP
ParameterLabels:
IneternetELBName:
default: "InternetELBName"
KeyPairName:
default: "KeyPiarName"
EC2InstanceName:
default: "EC2 Name"
EC2InstanceAMI:
default: "EC2 AMI"
EC2InstanceInstanceType:
default: "EC2 InstanceType"
EC2InstanceVolumeType:
default: "EC2 VolumeType"
EC2InstanceVolumeSize:
default: "EC2 VolumeSize"
SSHAccessSourceIP:
default: "SSH AccessSourceIP"
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Parameters:
PJPrefix:
Type: String
#InternetELB
InternetELBName:
Type: String
Default: "web"
#EC2Instance
KeyPairName:
Type: AWS::EC2::KeyPair::KeyName
Default: ""
EC2InstanceName:
Type: String
Default: "web"
EC2InstanceAMI:
Type: String
Default: ""
EC2InstanceInstanceType:
Type: String
Default: "t2.micro"
EC2InstanceVolumeType:
Type: String
Default: "gp2"
EC2InstanceVolumeSize:
Type: String
Default: "30"
SSHAccessSourceIP:
Type: String
Resources:
# ------------------------------------------------------------#
# IAM Role for EC2
# ------------------------------------------------------------#
EC2IAMRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: !Sub "${PJPrefix}-${EC2InstanceName}-role"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- "ec2.amazonaws.com"
Action:
- "sts:AssumeRole"
Path: "/"
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM"
- "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess"
EC2InstanceProfile:
Type: "AWS::IAM::InstanceProfile"
Properties:
Path: "/"
Roles:
- Ref: EC2IAMRole
InstanceProfileName: !Sub "${PJPrefix}-${EC2InstanceName}-profile"
# ------------------------------------------------------------#
# EC2Instance AZ:A
# ------------------------------------------------------------#
EC2Instance01:
Type: "AWS::EC2::Instance"
Properties:
Tags:
- Key: Name
Value: !Sub "${PJPrefix}-${EC2InstanceName}-01"
ImageId: !Ref EC2InstanceAMI
InstanceType: !Ref EC2InstanceInstanceType
KeyName: !Ref KeyPairName
IamInstanceProfile: !Ref EC2InstanceProfile
DisableApiTermination: false
EbsOptimized: false
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
DeleteOnTermination: true
VolumeType: !Ref EC2InstanceVolumeType
VolumeSize: !Ref EC2InstanceVolumeSize
SecurityGroupIds:
- !Ref ManagedSecurityGroup
- !Ref WebSecurityGroup
SubnetId: {"Fn::ImportValue": !Sub "${PJPrefix}-public-subnet-a"}
UserData: !Base64 |
#! /bin/bash
yum update -y
# ------------------------------------------------------------#
# EC2Instance AZ:C
# ------------------------------------------------------------#
EC2Instance02:
Type: "AWS::EC2::Instance"
Properties:
Tags:
- Key: Name
Value: !Sub "${PJPrefix}-${EC2InstanceName}-02"
ImageId: !Ref EC2InstanceAMI
InstanceType: !Ref EC2InstanceInstanceType
KeyName: !Ref KeyPairName
IamInstanceProfile: !Ref EC2InstanceProfile
DisableApiTermination: false
EbsOptimized: false
BlockDeviceMappings:
- DeviceName: /dev/xvda
Ebs:
DeleteOnTermination: true
VolumeType: !Ref EC2InstanceVolumeType
VolumeSize: !Ref EC2InstanceVolumeSize
SecurityGroupIds:
- !Ref ManagedSecurityGroup
- !Ref WebSecurityGroup
SubnetId: {"Fn::ImportValue": !Sub "${PJPrefix}-public-subnet-c"}
UserData: !Base64 |
#! /bin/bash
yum update -y
# ------------------------------------------------------------#
# SecurityGroup for Managed
# ------------------------------------------------------------#
ManagedSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
VpcId: {"Fn::ImportValue": !Sub "${PJPrefix}-vpc"}
GroupName: !Sub "${PJPrefix}-managed-sg"
GroupDescription: "-"
Tags:
- Key: "Name"
Value: !Sub "${PJPrefix}-managed-sg"
# Rule
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: !Ref SSHAccessSourceIP
# ------------------------------------------------------------#
# SecurityGroup for ELB
# ------------------------------------------------------------#
ELBSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
VpcId: { "Fn::ImportValue": !Sub "${PJPrefix}-vpc" }
GroupName: !Sub "${PJPrefix}-elb-sg"
GroupDescription: "-"
Tags:
- Key: "Name"
Value: !Sub "${PJPrefix}-elb-sg"
# Rule
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: "0.0.0.0/0"
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: "0.0.0.0/0"
# ------------------------------------------------------------#
# SecurityGroup for Web
# ------------------------------------------------------------#
WebSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
VpcId: { "Fn::ImportValue": !Sub "${PJPrefix}-vpc" }
GroupName: !Sub "${PJPrefix}-web-sg"
GroupDescription: "-"
Tags:
- Key: "Name"
Value: !Sub "${PJPrefix}-web-sg"
# Rule
WebSecurityGroupIngress:
Type: "AWS::EC2::SecurityGroupIngress"
Properties:
IpProtocol: tcp
FromPort: 80
ToPort: 80
SourceSecurityGroupId: !GetAtt [ ELBSecurityGroup, GroupId ]
GroupId: !GetAtt [ WebSecurityGroup, GroupId ]
# ------------------------------------------------------------#
# ElasticIP for EC2Instance01
# ------------------------------------------------------------#
ElasticIP01:
Type: "AWS::EC2::EIP"
Properties:
Domain: vpc
ElasticIPAssociate:
Type: AWS::EC2::EIPAssociation
Properties:
AllocationId: !GetAtt ElasticIP01.AllocationId
InstanceId: !Ref EC2Instance01
# ------------------------------------------------------------#
# ElasticIP for EC2Instance02
# ------------------------------------------------------------#
ElasticIP02:
Type: "AWS::EC2::EIP"
Properties:
Domain: vpc
ElasticIPAssociate:
Type: AWS::EC2::EIPAssociation
Properties:
AllocationId: !GetAtt ElasticIP02.AllocationId
InstanceId: !Ref EC2Instance02
# ------------------------------------------------------------#
# InternetELB
# ------------------------------------------------------------#
InternetELB:
Type: "AWS::ElasticLoadBalancing::LoadBalancer"
Properties:
LoadBalancerName: !Sub "${PJPrefix}-${InternetELBName}-elb"
Scheme: "internet-facing"
CrossZone: true
HealthCheck:
Target: "TCP:80"
HealthyThreshold: 2
UnhealthyThreshold: 2
Interval: 30
Timeout: 5
ConnectionDrainingPolicy:
Enabled: true
Timeout: 300
Listeners:
- LoadBalancerPort: 80
InstancePort: 80
Protocol: HTTP
Instances:
- !Ref EC2Instance01
- !Ref EC2Instance02
SecurityGroups:
- !Ref ELBSecurityGroup
Subnets:
- { "Fn::ImportValue": !Sub "${PJPrefix}-public-subnet-a" }
- { "Fn::ImportValue": !Sub "${PJPrefix}-public-subnet-c" }
# ------------------------------------------------------------#
# Output Parameters
# ------------------------------------------------------------#
Outputs:
#InternetELB
ELBDNSName:
Value: !GetAtt InternetELB.DNSName
Export:
Name: !Sub "${PJPrefix}-${InternetELBName}-elb-dnsname"
#EC2Instance01
EC2InstanceID:
Value: !Ref EC2Instance01
Export:
Name: !Sub "${PJPrefix}-${EC2InstanceName}-01-id"
EC2InstancePrivateIp:
Value: !GetAtt EC2Instance01.PrivateIp
Export:
Name: !Sub "${PJPrefix}-${EC2InstanceName}-01-private-ip"
EC2Instance01EIP:
Value: !GetAtt EC2Instance01.PublicIp
Export:
Name: !Sub "${PJPrefix}-${EC2InstanceName}-01-eip"
EC2InstanceRoleName:
Value: !Sub "${PJPrefix}-${EC2InstanceName}-01-role"
Export:
Name: !Sub "${PJPrefix}-${EC2InstanceName}-01-role-name"
#EC2Instance02
EC2InstanceID:
Value: !Ref EC2Instance02
Export:
Name: !Sub "${PJPrefix}-${EC2InstanceName}-02-id"
EC2InstancePrivateIp:
Value: !GetAtt EC2Instance02.PrivateIp
Export:
Name: !Sub "${PJPrefix}-${EC2InstanceName}-02-private-ip"
EC2Instance02EIP:
Value: !GetAtt EC2Instance02.PublicIp
Export:
Name: !Sub "${PJPrefix}-${EC2InstanceName}-02-eip"
EC2InstanceRoleName:
Value: !Sub "${PJPrefix}-${EC2InstanceName}-02-role"
Export:
Name: !Sub "${PJPrefix}-${EC2InstanceName}-02-role-name"
$ ssh ec2-user@* -i ~/.ssh/*.pem
OK, Nice