{"id":3686,"date":"2023-03-09T15:50:19","date_gmt":"2023-03-09T15:50:19","guid":{"rendered":"https:\/\/geekmungus.co.uk\/?p=3686"},"modified":"2023-03-09T15:50:19","modified_gmt":"2023-03-09T15:50:19","slug":"aws-cloudformation-1-vpc-two-ec2-instances","status":"publish","type":"post","link":"https:\/\/geekmungus.co.uk\/?p=3686","title":{"rendered":"AWS Cloudformation &#8211; 1 VPC, Two EC2 Instances"},"content":{"rendered":"\n<p>Another very simple AWS Cloudformation example. The template deploys the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>VPC<\/li>\n\n\n\n<li>Two Public Subnets<\/li>\n\n\n\n<li>Internet Gateway<\/li>\n\n\n\n<li>Route Table<\/li>\n\n\n\n<li>Associations (between subnets, route table and VPC)<\/li>\n\n\n\n<li>Two EC2 Instances (which are bootstrapped to run a simple HTTPD service)<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>AWSTemplateFormatVersion: 2010-09-09\r\n\r\nDescription: AWS Cloudformation Template - Create a deployment to publish a Web Status Page\r\n\r\nParameters:\r\n  VPCName:\r\n    Description: Name of the VPC\r\n    Type: String\r\n\r\n  KeyName:\r\n    Description: Name of an existing EC2 KeyPair to enable SSH access to the instance\r\n    Type: 'AWS::EC2::KeyPair::KeyName'\r\n    ConstraintDescription: must be the name of an existing EC2 KeyPair.\r\n\r\n  InstanceType:\r\n    Description: WebServer EC2 instance type\r\n    Type: String\r\n    Default: t2.small\r\n    AllowedValues:\r\n      - t1.micro\r\n      - t2.nano\r\n      - t2.micro\r\n      - t2.small\r\n      - t2.medium\r\n      - t2.large\r\n      - m1.small\r\n      - m1.medium\r\n      - m1.large\r\n      - m1.xlarge\r\n      - m2.xlarge\r\n      - m2.2xlarge\r\n      - m2.4xlarge\r\n      - m3.medium\r\n      - m3.large\r\n      - m3.xlarge\r\n      - m3.2xlarge\r\n      - m4.large\r\n      - m4.xlarge\r\n      - m4.2xlarge\r\n      - m4.4xlarge\r\n      - m4.10xlarge\r\n      - c1.medium\r\n      - c1.xlarge\r\n      - c3.large\r\n      - c3.xlarge\r\n      - c3.2xlarge\r\n      - c3.4xlarge\r\n      - c3.8xlarge\r\n      - c4.large\r\n      - c4.xlarge\r\n      - c4.2xlarge\r\n      - c4.4xlarge\r\n      - c4.8xlarge\r\n      - g2.2xlarge\r\n      - g2.8xlarge\r\n      - r3.large\r\n      - r3.xlarge\r\n      - r3.2xlarge\r\n      - r3.4xlarge\r\n      - r3.8xlarge\r\n      - i2.xlarge\r\n      - i2.2xlarge\r\n      - i2.4xlarge\r\n      - i2.8xlarge\r\n      - d2.xlarge\r\n      - d2.2xlarge\r\n      - d2.4xlarge\r\n      - d2.8xlarge\r\n      - hi1.4xlarge\r\n      - hs1.8xlarge\r\n      - cr1.8xlarge\r\n      - cc2.8xlarge\r\n      - cg1.4xlarge\r\n    ConstraintDescription: must be a valid EC2 instance type.\r\n\r\nMappings:\r\n  AWSInstanceType2Arch:\r\n    t1.micro:\r\n      Arch: HVM64\r\n    t2.nano:\r\n      Arch: HVM64\r\n    t2.micro:\r\n      Arch: HVM64\r\n    t2.small:\r\n      Arch: HVM64\r\n    t2.medium:\r\n      Arch: HVM64\r\n    t2.large:\r\n      Arch: HVM64\r\n    m1.small:\r\n      Arch: HVM64\r\n    m1.medium:\r\n      Arch: HVM64\r\n    m1.large:\r\n      Arch: HVM64\r\n    m1.xlarge:\r\n      Arch: HVM64\r\n    m2.xlarge:\r\n      Arch: HVM64\r\n    m2.2xlarge:\r\n      Arch: HVM64\r\n    m2.4xlarge:\r\n      Arch: HVM64\r\n    m3.medium:\r\n      Arch: HVM64\r\n    m3.large:\r\n      Arch: HVM64\r\n    m3.xlarge:\r\n      Arch: HVM64\r\n    m3.2xlarge:\r\n      Arch: HVM64\r\n    m4.large:\r\n      Arch: HVM64\r\n    m4.xlarge:\r\n      Arch: HVM64\r\n    m4.2xlarge:\r\n      Arch: HVM64\r\n    m4.4xlarge:\r\n      Arch: HVM64\r\n    m4.10xlarge:\r\n      Arch: HVM64\r\n    c1.medium:\r\n      Arch: HVM64\r\n    c1.xlarge:\r\n      Arch: HVM64\r\n    c3.large:\r\n      Arch: HVM64\r\n    c3.xlarge:\r\n      Arch: HVM64\r\n    c3.2xlarge:\r\n      Arch: HVM64\r\n    c3.4xlarge:\r\n      Arch: HVM64\r\n    c3.8xlarge:\r\n      Arch: HVM64\r\n    c4.large:\r\n      Arch: HVM64\r\n    c4.xlarge:\r\n      Arch: HVM64\r\n    c4.2xlarge:\r\n      Arch: HVM64\r\n    c4.4xlarge:\r\n      Arch: HVM64\r\n    c4.8xlarge:\r\n      Arch: HVM64\r\n    g2.2xlarge:\r\n      Arch: HVMG2\r\n    g2.8xlarge:\r\n      Arch: HVMG2\r\n    r3.large:\r\n      Arch: HVM64\r\n    r3.xlarge:\r\n      Arch: HVM64\r\n    r3.2xlarge:\r\n      Arch: HVM64\r\n    r3.4xlarge:\r\n      Arch: HVM64\r\n    r3.8xlarge:\r\n      Arch: HVM64\r\n    i2.xlarge:\r\n      Arch: HVM64\r\n    i2.2xlarge:\r\n      Arch: HVM64\r\n    i2.4xlarge:\r\n      Arch: HVM64\r\n    i2.8xlarge:\r\n      Arch: HVM64\r\n    d2.xlarge:\r\n      Arch: HVM64\r\n    d2.2xlarge:\r\n      Arch: HVM64\r\n    d2.4xlarge:\r\n      Arch: HVM64\r\n    d2.8xlarge:\r\n      Arch: HVM64\r\n    hi1.4xlarge:\r\n      Arch: HVM64\r\n    hs1.8xlarge:\r\n      Arch: HVM64\r\n    cr1.8xlarge:\r\n      Arch: HVM64\r\n    cc2.8xlarge:\r\n      Arch: HVM64\r\n  AWSInstanceType2NATArch:\r\n    t1.micro:\r\n      Arch: NATHVM64\r\n    t2.nano:\r\n      Arch: NATHVM64\r\n    t2.micro:\r\n      Arch: NATHVM64\r\n    t2.small:\r\n      Arch: NATHVM64\r\n    t2.medium:\r\n      Arch: NATHVM64\r\n    t2.large:\r\n      Arch: NATHVM64\r\n    m1.small:\r\n      Arch: NATHVM64\r\n    m1.medium:\r\n      Arch: NATHVM64\r\n    m1.large:\r\n      Arch: NATHVM64\r\n    m1.xlarge:\r\n      Arch: NATHVM64\r\n    m2.xlarge:\r\n      Arch: NATHVM64\r\n    m2.2xlarge:\r\n      Arch: NATHVM64\r\n    m2.4xlarge:\r\n      Arch: NATHVM64\r\n    m3.medium:\r\n      Arch: NATHVM64\r\n    m3.large:\r\n      Arch: NATHVM64\r\n    m3.xlarge:\r\n      Arch: NATHVM64\r\n    m3.2xlarge:\r\n      Arch: NATHVM64\r\n    m4.large:\r\n      Arch: NATHVM64\r\n    m4.xlarge:\r\n      Arch: NATHVM64\r\n    m4.2xlarge:\r\n      Arch: NATHVM64\r\n    m4.4xlarge:\r\n      Arch: NATHVM64\r\n    m4.10xlarge:\r\n      Arch: NATHVM64\r\n    c1.medium:\r\n      Arch: NATHVM64\r\n    c1.xlarge:\r\n      Arch: NATHVM64\r\n    c3.large:\r\n      Arch: NATHVM64\r\n    c3.xlarge:\r\n      Arch: NATHVM64\r\n    c3.2xlarge:\r\n      Arch: NATHVM64\r\n    c3.4xlarge:\r\n      Arch: NATHVM64\r\n    c3.8xlarge:\r\n      Arch: NATHVM64\r\n    c4.large:\r\n      Arch: NATHVM64\r\n    c4.xlarge:\r\n      Arch: NATHVM64\r\n    c4.2xlarge:\r\n      Arch: NATHVM64\r\n    c4.4xlarge:\r\n      Arch: NATHVM64\r\n    c4.8xlarge:\r\n      Arch: NATHVM64\r\n    g2.2xlarge:\r\n      Arch: NATHVMG2\r\n    g2.8xlarge:\r\n      Arch: NATHVMG2\r\n    r3.large:\r\n      Arch: NATHVM64\r\n    r3.xlarge:\r\n      Arch: NATHVM64\r\n    r3.2xlarge:\r\n      Arch: NATHVM64\r\n    r3.4xlarge:\r\n      Arch: NATHVM64\r\n    r3.8xlarge:\r\n      Arch: NATHVM64\r\n    i2.xlarge:\r\n      Arch: NATHVM64\r\n    i2.2xlarge:\r\n      Arch: NATHVM64\r\n    i2.4xlarge:\r\n      Arch: NATHVM64\r\n    i2.8xlarge:\r\n      Arch: NATHVM64\r\n    d2.xlarge:\r\n      Arch: NATHVM64\r\n    d2.2xlarge:\r\n      Arch: NATHVM64\r\n    d2.4xlarge:\r\n      Arch: NATHVM64\r\n    d2.8xlarge:\r\n      Arch: NATHVM64\r\n    hi1.4xlarge:\r\n      Arch: NATHVM64\r\n    hs1.8xlarge:\r\n      Arch: NATHVM64\r\n    cr1.8xlarge:\r\n      Arch: NATHVM64\r\n    cc2.8xlarge:\r\n      Arch: NATHVM64\r\n  AWSRegionArch2AMI:\r\n    af-south-1:\r\n      HVM64: ami-064cc455f8a1ef504\r\n      HVMG2: NOT_SUPPORTED\r\n    ap-east-1:\r\n      HVM64: ami-f85b1989\r\n      HVMG2: NOT_SUPPORTED\r\n    ap-northeast-1:\r\n      HVM64: ami-0b2c2a754d5b4da22\r\n      HVMG2: ami-09d0e0e099ecabba2\r\n    ap-northeast-2:\r\n      HVM64: ami-0493ab99920f410fc\r\n      HVMG2: NOT_SUPPORTED\r\n    ap-northeast-3:\r\n      HVM64: ami-01344f6f63a4decc1\r\n      HVMG2: NOT_SUPPORTED\r\n    ap-south-1:\r\n      HVM64: ami-03cfb5e1fb4fac428\r\n      HVMG2: ami-0244c1d42815af84a\r\n    ap-southeast-1:\r\n      HVM64: ami-0ba35dc9caf73d1c7\r\n      HVMG2: ami-0e46ce0d6a87dc979\r\n    ap-southeast-2:\r\n      HVM64: ami-0ae99b503e8694028\r\n      HVMG2: ami-0c0ab057a101d8ff2\r\n    ca-central-1:\r\n      HVM64: ami-0803e21a2ec22f953\r\n      HVMG2: NOT_SUPPORTED\r\n    cn-north-1:\r\n      HVM64: ami-07a3f215cc90c889c\r\n      HVMG2: NOT_SUPPORTED\r\n    cn-northwest-1:\r\n      HVM64: ami-0a3b3b10f714a0ff4\r\n      HVMG2: NOT_SUPPORTED\r\n    eu-central-1:\r\n      HVM64: ami-0474863011a7d1541\r\n      HVMG2: ami-0aa1822e3eb913a11\r\n    eu-north-1:\r\n      HVM64: ami-0de4b8910494dba0f\r\n      HVMG2: ami-32d55b4c\r\n    eu-south-1:\r\n      HVM64: ami-08427144fe9ebdef6\r\n      HVMG2: NOT_SUPPORTED\r\n    eu-west-1:\r\n      HVM64: ami-015232c01a82b847b\r\n      HVMG2: ami-0d5299b1c6112c3c7\r\n    eu-west-2:\r\n      HVM64: ami-0765d48d7e15beb93\r\n      HVMG2: NOT_SUPPORTED\r\n    eu-west-3:\r\n      HVM64: ami-0caf07637eda19d9c\r\n      HVMG2: NOT_SUPPORTED\r\n    me-south-1:\r\n      HVM64: ami-0744743d80915b497\r\n      HVMG2: NOT_SUPPORTED\r\n    sa-east-1:\r\n      HVM64: ami-0a52e8a6018e92bb0\r\n      HVMG2: NOT_SUPPORTED\r\n    us-east-1:\r\n      HVM64: ami-032930428bf1abbff\r\n      HVMG2: ami-0aeb704d503081ea6\r\n    us-east-2:\r\n      HVM64: ami-027cab9a7bf0155df\r\n      HVMG2: NOT_SUPPORTED\r\n    us-west-1:\r\n      HVM64: ami-088c153f74339f34c\r\n      HVMG2: ami-0a7fc72dc0e51aa77\r\n    us-west-2:\r\n      HVM64: ami-01fee56b22f308154\r\n      HVMG2: ami-0fe84a5b4563d8f27\r\n\r\nResources:\r\n  VPC:\r\n    Type: \"AWS::EC2::VPC\"\r\n    Properties:\r\n      EnableDnsSupport: 'true'\r\n      EnableDnsHostnames: 'true'\r\n      CidrBlock: \"192.168.0.0\/16\"\r\n      Tags:\r\n      - Key: \"Name\"\r\n        Value: !Ref VPCName\r\n\r\n  PublicSubnet1:\r\n    Type: \"AWS::EC2::Subnet\"\r\n    Properties:\r\n      VpcId: !Ref \"VPC\"\r\n      CidrBlock: \"192.168.0.0\/24\"\r\n      MapPublicIpOnLaunch: 'true'\r\n      Tags:\r\n      - Key: \"Name\"\r\n        Value: \"PublicSubnet1\"\r\n  \r\n  PublicSubnet2:\r\n    Type: \"AWS::EC2::Subnet\"\r\n    Properties:\r\n      VpcId: !Ref \"VPC\"\r\n      CidrBlock: \"192.168.1.0\/24\"\r\n      MapPublicIpOnLaunch: 'true'\r\n      Tags:\r\n      - Key: \"Name\"\r\n        Value: \"PublicSubnet2\"\r\n\r\n  RouteTable:\r\n    Type: \"AWS::EC2::RouteTable\"\r\n    Properties:\r\n      VpcId: !Ref \"VPC\"\r\n\r\n  InternetGateway:\r\n    Type: \"AWS::EC2::InternetGateway\"\r\n\r\n  VPCGatewayAttachment:\r\n    Type: \"AWS::EC2::VPCGatewayAttachment\"\r\n    Properties:\r\n      VpcId: !Ref \"VPC\"\r\n      InternetGatewayId: !Ref \"InternetGateway\"\r\n\r\n  InternetRoute:\r\n    Type: \"AWS::EC2::Route\"\r\n    Properties:\r\n      DestinationCidrBlock: \"0.0.0.0\/0\"\r\n      GatewayId: !Ref InternetGateway\r\n      RouteTableId: !Ref RouteTable\r\n\r\n  PublicSubnet1RouteTableAssociation:\r\n    Type: \"AWS::EC2::SubnetRouteTableAssociation\"\r\n    Properties:\r\n      RouteTableId: !Ref RouteTable\r\n      SubnetId: !Ref PublicSubnet1\r\n\r\n  PublicSubnet2RouteTableAssociation:\r\n    Type: \"AWS::EC2::SubnetRouteTableAssociation\"\r\n    Properties:\r\n      RouteTableId: !Ref RouteTable\r\n      SubnetId: !Ref PublicSubnet2\r\n  \r\n  EC2Instance1:\r\n    Type: 'AWS::EC2::Instance'\r\n    Properties:\r\n      InstanceType: !Ref InstanceType\r\n      KeyName: !Ref KeyName\r\n      SubnetId: !Ref PublicSubnet1\r\n      SecurityGroupIds: \r\n        - !Ref WebServerSecurityGroup\r\n      ImageId: !FindInMap \r\n        - AWSRegionArch2AMI\r\n        - !Ref 'AWS::Region'\r\n        - !FindInMap \r\n          - AWSInstanceType2Arch\r\n          - !Ref InstanceType\r\n          - Arch\r\n      UserData:\r\n        Fn::Base64:\r\n          !Sub |\r\n            #!\/bin\/bash\r\n            yum update -y\r\n            yum install -y httpd\r\n            \/etc\/init.d\/httpd start\r\n            echo ?Hello World from $(hostname -f)? > \/var\/www\/html\/index.html\r\n            echo \"---- UserData Complete ----\"\r\n\r\n  EC2Instance2:\r\n    Type: 'AWS::EC2::Instance'\r\n    Properties:\r\n      InstanceType: !Ref InstanceType\r\n      KeyName: !Ref KeyName\r\n      SubnetId: !Ref PublicSubnet2\r\n      SecurityGroupIds: \r\n        - !Ref WebServerSecurityGroup\r\n      ImageId: !FindInMap \r\n        - AWSRegionArch2AMI\r\n        - !Ref 'AWS::Region'\r\n        - !FindInMap \r\n          - AWSInstanceType2Arch\r\n          - !Ref InstanceType\r\n          - Arch\r\n      UserData:\r\n        Fn::Base64:\r\n          !Sub |\r\n            #!\/bin\/bash\r\n            yum update -y\r\n            yum install -y httpd\r\n            \/etc\/init.d\/httpd start\r\n            echo ?Hello World from $(hostname -f)? > \/var\/www\/html\/index.html\r\n            echo \"---- UserData Complete ----\"\r\n\r\n  WebServerSecurityGroup:\r\n    Type: 'AWS::EC2::SecurityGroup'\r\n    Properties:\r\n      GroupDescription: Enable SSH and HTTP Inbound Access\r\n      VpcId: !Ref \"VPC\"\r\n      SecurityGroupIngress:\r\n        - IpProtocol: tcp\r\n          FromPort: '22'\r\n          ToPort: '22'\r\n          CidrIp: 0.0.0.0\/0\r\n        - IpProtocol: tcp\r\n          FromPort: '80'\r\n          ToPort: '80'\r\n          CidrIp: 0.0.0.0\/0\r\n        - IpProtocol: tcp\r\n          FromPort: '443'\r\n          ToPort: '443'\r\n          CidrIp: 0.0.0.0\/0\r\n      Tags:\r\n      - Key: \"Name\"\r\n        Value: \"WebServerSecurityGroup\"\r\n\r\nOutputs:\r\n  VpcId:\r\n    Description: The VPC ID\r\n    Value: !Ref VPC\r\n\r\n  InstanceId1:\r\n    Description: InstanceId of the newly created EC2 instance\r\n    Value: !Ref EC2Instance1\r\n  \r\n  AZ1:\r\n    Description: Availability Zone of the newly created EC2 instance\r\n    Value: !GetAtt \r\n      - EC2Instance1\r\n      - AvailabilityZone\r\n\r\n  PublicDNS1:\r\n    Description: Public DNSName of the newly created EC2 instance\r\n    Value: !GetAtt \r\n      - EC2Instance1\r\n      - PublicDnsName\r\n\r\n  PublicIP1:\r\n    Description: Public IP address of the newly created EC2 instance\r\n    Value: !GetAtt \r\n      - EC2Instance1\r\n      - PublicIp\r\n\r\n  InstanceId2:\r\n    Description: InstanceId of the newly created EC2 instance\r\n    Value: !Ref EC2Instance2\r\n\r\n  AZ2:\r\n    Description: Availability Zone of the newly created EC2 instance\r\n    Value: !GetAtt \r\n      - EC2Instance2\r\n      - AvailabilityZone\r\n\r\n  PublicDNS2:\r\n    Description: Public DNSName of the newly created EC2 instance\r\n    Value: !GetAtt \r\n      - EC2Instance2\r\n      - PublicDnsName\r\n\r\n  PublicIP2:\r\n    Description: Public IP address of the newly created EC2 instance\r\n    Value: !GetAtt \r\n      - EC2Instance2\r\n      - PublicIp<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Another very simple AWS Cloudformation example. The template deploys the following:<\/p>\n","protected":false},"author":4,"featured_media":3681,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28,3],"tags":[],"class_list":["post-3686","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aws","category-cloud"],"_links":{"self":[{"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/3686","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3686"}],"version-history":[{"count":1,"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/3686\/revisions"}],"predecessor-version":[{"id":3687,"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/3686\/revisions\/3687"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=\/wp\/v2\/media\/3681"}],"wp:attachment":[{"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3686"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3686"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekmungus.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}