(第2回)CloudFormationで環境構築を効率化

(第2回)CloudFormationで環境構築を効率化

目次

前回の振り返り
EC2インスタンス用を起動するテンプレートを作成する
EC2インスタンス用のキーペアを用意する
ItportEc2.yaml
スタックを作成する
ブラウザでアクセスしてみる
スタックを削除する
おわりに

前回の振り返り

(第1回)CloudFormationで環境構築を効率化

前回はVPC、サブネット、Internet Gateway、Route Tableの作成用テンプレートを作成しました。
今回はネットワークのテンプレートとは別にした形でEC2を起動するテンプレートを用意して稼働させてみたいと思います。(テンプレートを別にすることでスタックの管理が分割できるのでそうしてみたいと思います。)

EC2インスタンス用を起動するテンプレートを作成する

EC2インスタンス(Amazon Linux 2)を起動するテンプレートを作成します。
ただサーバーが立ち上がるだけだと少々寂しいためhttpdやphp等も一緒にインストールされるようにユーザーデータに書いておきます。

EC2インスタンス用のキーペアを用意する

EC2用のキーペアは事前に用意しておきます。これはCloud FormationではなくAWSマネジメントコンソールから作成しておきます。

キーペアを作成
ItportEc2.yaml

キーペアを用意したら続いてyamlファイルを作成します。
「Parameters」セクションではキーペアの指定とsshを許可するIPアドレスを引数として定義しておきます。これでテンプレートを使いまわす際にYaml自体の編集が不要になります。EC2は起動したらLAMP環境が出来上がっているようにユーザーデータを使用して一緒にインストールしておきます。ユーザーデータの内容はこちらを参考にさせていただきました。

AWSTemplateFormatVersion: "2010-09-09"
Description: "Itport AWS VPC Networks"
Parameters: 
  KeyName:
    Description: The EC2 Key Pair to allow SSH access to the instance
    Type: "AWS::EC2::KeyPair::KeyName"

  MyIP:
    Description: IP address allowed to access EC2
    Type: String
    
Resources:
  EC2:
      Type: AWS::EC2::Instance
      Properties: 
        ImageId: ami-06098fd00463352b6
        KeyName: !Ref KeyName
        InstanceType: t3.micro
        NetworkInterfaces: 
          - AssociatePublicIpAddress: "true"
            DeviceIndex: "0"
            SubnetId: !ImportValue ItportSubnet1a
            GroupSet:
              - !Ref EC2SG
        UserData: !Base64 |
          #!/bin/bash
          yum update -y
          amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2
          yum install -y httpd mariadb-server
          systemctl start httpd
          systemctl enable httpd
          usermod -a -G apache ec2-user
          chown -R ec2-user:apache /var/www
          chmod 2775 /var/www
          find /var/www -type d -exec chmod 2775 {} \;
          find /var/www -type f -exec chmod 0664 {} \;
          echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php
        Tags:
            - Key: Name
              Value: ec2-webserver
        
  EC2SG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: ec2-sg-webserver
      GroupDescription: Allow SSH and HTTP access only MyIP
      VpcId: !ImportValue ItportVPC
      SecurityGroupIngress:
        # http
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: !Ref MyIP
        # ssh
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Ref MyIP
        
Outputs:
    EC2PublicIP:
      Value: !GetAtt EC2.PublicIp
      Description: Public IP of EC2 instance

VpcId: !ImportValue ItportVPC」というように前回記事で作成したスタックのテンプレートで「Outputs:」セクションで定義しているVPCのIDを参照しています。これでテンプレートを分けても他スタックのリソースのIDを指定できます。

スタックを作成する

新しいスタックを作成していきます。さきほどのYAMLファイルをアップロードします。

テンプレートファイルのアップロード

Yamlファイルで書いたパラメータの2箇所が画面上にフォームとして表示されました。なるほど!これは便利。
キーペアを選択するのと自分のグローバルIPアドレスを入力しておきます。その後はデフォルトで適当に進んでいけばスタックが作成されました。

スタックの詳細を指定
ブラウザでアクセスしてみる

スタックの作成が完了したら「出力」タブを確認するとOutputsセクションに指定していたEC2のIPアドレスが表示されていました。

スタック画面「出力タブ」の表示

そのIPアドレスをブラウザに入力してみます。

Test Page

Apacheのテストページが表示されました。続いてユーザーデータにphpinfo.phpを作るように書いていたので、アクセスもしてみるとphpもしっかり入っていますね!

スタックを削除する

リソースが不要になったらスタックを削除すれば起動したEC2インスタンスが削除されます。また使いたくなったらCloudFormationでYamlをアップロードするだけで良いですね。便利です。

スタックの削除

おわりに

いかがでしたでしょうか。リソースを作ったり消したり使いまわす際は非常に便利だと思いました。
初めてCloudFormationを触りましたが、普段からAWSを触っている方ならYamlの内容も比較的すんなり入ってきますよね。
今回はこれで終わりとなりますが、今後もCloudFormationを活用したCI/CD環境の構築など、より効率的にAWSを活用出来るように精進したいと思います。