🙆‍♀️

【CloudFormation】EC2 起動時に Apache を初期インストールするテンプレート

2021/06/22に公開

こんにちは、Masuyama です。
CloudFormation にハマっているので、前回の記事↓で紹介した、ユーザーデータを用いて Apache を EC2 に初期インストールするテンプレートを紹介します。
EC2作成時にApacheをユーザーデータで初期インストールする方法

なお、本記事で紹介するテンプレートは GitHub にも上げておきます。

テンプレートでのユーザーデータ設定方法

EC2 リソースを指定する際、Properties の中に UserData というプロパティを入れて設定します。

下記の例では Apache のインストールから起動、自動起動設定まで行いつつ
index.html に文字列を設定する初期スクリプトを設定しています。

  EC2:
    Type: AWS::EC2::Instance
    Properties:
      ...
      UserData: 
        Fn::Base64: |
          #!/bin/bash
          yum -y update
          yum -y install httpd
          systemctl start httpd
          systemctl enable httpd
          echo "Apache is runnning by using UserData" > /var/www/html/index.html

本テンプレートで作れるもの

  • VPC x1
  • サブネット x1
  • EC2 x1 (Apache 起動)

テンプレート全文

cf-ec2-userdata-apache-install.yml

AWSTemplateFormatVersion: "2010-09-09"
Description: Provision EC2

Parameters:
  EnvironmentName:
    Description: Name which you can specify the environment by this name
    Type: String
    Default: test-environment
  VpcCIDR:
    Type: String
    Default: 10.0.0.0/16
  PublicSubnetCIDR:
    Type: String
    Default: 10.0.0.0/24
  KeyName:
    Description: The EC2 Key Pair to allow SSH access to the instance
    Type: "AWS::EC2::KeyPair::KeyName"

  MyIP:
    Description: IP address range which is allowed to access this EC2 from it
    Type: String
    Default: 0.0.0.0/0

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCIDR
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-VPC

  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-InternetGateway

  # Attach InternetGateway to VPC
  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-1a
      VpcId: !Ref VPC
      CidrBlock: !Ref PublicSubnetCIDR
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-PublicSubnet

  PublicSubnetRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: !Sub ${EnvironmentName}-PublicSubnetRouteTable

  # Routing from PublicSubnet to Internet
  PublicSubnetToInternet:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref PublicSubnetRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  # Associate PublicSubnetRouteTable to PublicSubnet
  AssoPublicSubnetRouteTable:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicSubnetRouteTable

  EC2:
    Type: AWS::EC2::Instance
    Properties:
      # Amazon Linux 2
      ImageId: ami-00d101850e971728d
      KeyName: !Ref KeyName
      InstanceType: t2.micro
      NetworkInterfaces:
        - AssociatePublicIpAddress: "true"
          DeviceIndex: "0"
          SubnetId: !Ref PublicSubnet
          GroupSet:
            - !Ref EC2SecurityGroup
      UserData: 
        Fn::Base64: |
          #!/bin/bash
          yum -y update
          yum -y install httpd
          systemctl start httpd
          systemctl enable httpd
          echo "Apache is runnning by using UserData" > /var/www/html/index.html
      Tags:
          - Key: Name
            Value: !Sub ${EnvironmentName}-EC2

  EC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: ec2-sg-cf
      GroupDescription: Allow SSH and HTTP access from only MyIP
      VpcId: !Ref VPC
      SecurityGroupIngress:
        # http
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: !Ref MyIP
        # ssh
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref MyIP

Web サーバへのアクセステスト

自動的に割り当てられたパブリック IP をブラウザで叩くと、ユーザーデータで指定した文字列が表示されていることが分かるかと思います。

Discussion