CloudFormationによる【EC2】の構築


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

 皆様こんにちは。
今回はCloudFormatonを利用して高可用性アーキテクトの構築をしていきます。
この記事ではEC2の作成を行います。

1.高可用性アーキテクト構築目次AWS config

目次はこちら

2.EC2について

Amazon Elastic Compute Cloud (Amazon EC2) は、Amazon Web Service (AWS) クラウドでスケーラブルなコンピューティングキャパシティーを提供します。Amazon EC2 の使用により、ハードウェアに事前投資する必要がなくなり、アプリケーションをより速く開発およびデプロイできます。
参照:公式ドキュメント:EC2

3.構築したいEC2構成図

file

  • マルチAZ配置で冗長化することにより、可用性を高められます。
  • マルチAZ構成でEC2インスタンスを2台用意することで仮に片方のAZに障害が発生した場合にインスタンスが停止した場合でもすぐに2台目のインスタンスに切り替えることができます。

4.全体構築ソースコード

AWSTemplateFormatVersion: "2010-09-09"  
Resources:  
  WebInstance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-0cbec04a61be382d9 
      KeyName: hebiishi_kadai_1 | RSA
      SecurityGroupIds:
        - !ImportValue hebiishiSGEC2
      SubnetId: !ImportValue hebiishipublicsubnet2a
      IamInstanceProfile: !ImportValue InstanceProfile
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: "true"
            VolumeType: "gp3"
            VolumeSize: 8
            Encrypted: true
            Iops: 3000
            KmsKeyId: "arn:aws:kms:ap-northeast-2:xxx:key/fc41e730-0e71-4a7a-8c63-xxx"
      UserData:
        Fn::Base64: |
          #!/bin/bash
          sudo yum install httpd -y
          sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2
          sudo yum install -y amazon-efs-utils
          sudo wget -P /tmp https://wordpress.org/latest.zip
          sudo unzip /tmp/latest.zip -d /tmp
          sudo mv /tmp/wordpress/* /var/www/html/
          sudo chown -R apache /var/www
          sudo chgrp -R apache /var/www
          sudo chmod 2775 /var/www
          find /var/www -type d -exec sudo chmod 2775 {} \;
          find /var/www -type f -exec sudo chmod 0664 {} \;
          sudo systemctl enable httpd.service
          sudo systemctl start httpd.service
          wget -P /tmp https://s3.ap-northeast-3.amazonaws.com/amazoncloudwatch-agent-ap-northeast-3/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
          sudo rpm -U /tmp/amazon-cloudwatch-agent.rpm
      Tags:
      - Key: Name
        Value: hebiishi-wordpress-1
  • 上記の通りにEC2を作成していきます。
    5章では細分化して作成項目の説明をしていきます。

5.EC2構築手順

CloudFormationでEC2を作成します。下記ソースコードではインスタンス、EBS、ユーザーデータの設定をしています。

5-1.SSHキーペアの作成

  • EC2インスタンスへSSH接続するために使用するSSHキーペアは、AWS Management Consoleから作成します。

Amazon EC2 でインスタンスを起動するとき、起動後にそのインスタンスにユーザーデータを渡し、一般的な自動設定タスクを実行したり、スクリプトを実行したりできます。2 つのタイプのユーザーデータを Amazon EC2 に渡すことができます。
参照:ユーザーデータについて

5-2.EC2の作成

  • AWSTemplateFormatVersion: 上記の日付が最新のテンプレート形式のバージョンになります。*現在の唯一の有効な値になります。
  • 今回使用するEC2のAMIはAmazon Linux2を選択しています。今回は、ソウルリージョンを利用しています。リージョンが変わるとAMI IDも変わります。
  • "IamInstanceProfile"は、IAMロールのコンテナで、インスタンスの起動時にEC2インスタンスにロール情報を譲渡する役割があります。
  • BlockDeviceMappings”は、EC2インスタンスの起動時にそのインスタンスにアタッチする追加のEBSボリュームまたはインスタンスストアボリュームを指定できます。

下記はインスタンスの設定項目です。
ファイル名「hebiishi-EC2-CF」

使用するオプション 設定値 説明
InstanceType t2.micro 利用したいインスタンスタイプ
ImageId ami-0cbec04a61be382d9
(Amazon Linux 2)
起動したいイメージID
KeyName (hebiishi_kadai_1RSA) キーペアの入力
SecurityGroupIds !ImportValue hebiishiSGEC2 セキュリティグループIDの入力
SubnetId !ImportValue hebiishipublicsubnet2a サブネットIDの入力
IamInstanceProfile !ImportValue InstanceProfile インスタンスプロファイルの入力
BlockDeviceMappings /dev/xvda  指定したいルートデバイス名

「hebiishi-EC2-CF」(1~13行目)でAMI、インスタンスタイプ等の設定をしていきます。

AWSTemplateFormatVersion: "2010-09-09"  
Resources:  
  WebInstance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: ami-0cbec04a61be382d9 
      KeyName: hebiishi_kadai_1 | RSA
      SecurityGroupIds:
        - !ImportValue hebiishiSGEC2
      SubnetId: !ImportValue hebiishipublicsubnet2a
      IamInstanceProfile: !ImportValue InstanceProfile
      BlockDeviceMappings:
        - DeviceName: /dev/xvda

5-3.作成済みIAMロールをEC2インスタンスに付与

"!ImportValue"で作成済みのIAMロールを参照します。
まず、EC2インスタンスにIAMロールを設定するために下記のコードを記述します。

 IamInstanceProfile: !ImportValue InstanceProfile

5-4.EBSの作成

  • EBSの作成をします。EBSは、ブロックストレージです。EC2のOS、EC2の追加ボリューム、RDSデータ保存に使用されます。

Amazon Elastic Block Store (Amazon EBS) は、EC2 インスタンスで使用するためのブロックレベルのストレージボリュームを提供します。EBS ボリュームの動作は、未初期化のブロックデバイスに似ています。これらのボリュームは、デバイスとしてインスタンスにマウントできます。
参照:公式ドキュメント:EBS

使用するオプション 設定値 説明
DeleteOnTermination true EC2終了時に削除
VolumeType gp3 ボリュームタイプ
VolumeSize 8 ボリュームサイズ(GiB)
Encrypted true 暗号化の有効化
Iops 3000 Iops(測定単位の数値
KmsKeyId arn:aws:kms:xxxxx 作成したKMSのiD

EBSの作成は下記のコード「hebiishi-EC2-CF」(14~20行目)を記述します。

Ebs:
    DeleteOnTermination: "true"
    VolumeType: "gp3"
    VolumeSize: 8
    Encrypted: true
    Iops: 3000
    KmsKeyId: "arn:aws:kms:xxxxx-xxxx-xxxx-xxxx"

5-5.ユーザーデータの作成

シェルスクリプトと cloud-init ディレクティブです。base64 でエンコードされたテキスト (API コール向け) として、インスタンス起動ウィザードに渡すこともできます。
参照:ユーザーデータについて

ユーザーデータの作成は下記のコード「hebiishi-EC2-CF」(21~38行目)を記述します。

UserData:
Fn::Base64: |
  #!/bin/bash
  sudo yum install httpd -y
  sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2
  sudo yum install -y amazon-efs-utils
  sudo wget -P /tmp https://wordpress.org/latest.zip
  sudo unzip /tmp/latest.zip -d /tmp
  sudo mv /tmp/wordpress/* /var/www/html/
  sudo chown -R apache /var/www
  sudo chgrp -R apache /var/www
  sudo chmod 2775 /var/www
  find /var/www -type d -exec sudo chmod 2775 {} \;
  find /var/www -type f -exec sudo chmod 0664 {} \;
  sudo systemctl enable httpd.service
  sudo systemctl start httpd.service
  wget -P /tmp https://s3.ap-northeast-3.amazonaws.com/amazoncloudwatch-agent-ap-northeast-3/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
  sudo rpm -U /tmp/amazon-cloudwatch-agent.rpm
  • 1行目:組み込み関数 "Fn::Base64" は、入力文字列の Base64 表現を返します。この関数は通常、UserData プロパティを介して Amazon EC2 インスタンスにエンコードされたデータを渡すために使用されます。

  • 2行目:"#! /bin/bash"
    →「#!」で始まるジバンと呼ばれる文字列は、このシェルスクリプトはbashを利用して解釈/実行されるという宣言をしています。

  • 3行目:"sudo yum install httpd -y"
    →appache httpdのインストールコマンドです。
     -yは全ての問い合わせに「yes」で応答するオプションです。

  • 4行目:"sudo amazon-linux-extras install -y lamp-mariadb10.2-php7.2"
    →Amazon Linux 2のExtras Libraryとよばれるパッケージ群(トピックといいます)からLamp環境に必要なものをまとめてインストールしています。

  • 5行目:"sudo yum install -y amazon-efs-utils"
    →EFSマウントヘルパーのインストールです。

  • 6行目:"sudo wget -P /tmp https://wordpress.org/latest.zip"
    →"-P"オプションでtmpディレクトリを指定し、Wordpressをダウンロードしています。
    tmp内のファイルやフォルダは10日経過又はインスタンス再起動で自動的に削除されます。

  • 7行目:"sudo unzip /tmp/latest.zip -d /tmp"
    →ダウンロードしたWordpressを解凍します。-dオプションで解凍先のディレクトリを指定しています。

  • 8行目:"sudo mv /tmp/wordpress/?* /var/www/html/"
    →apacheの公開領域(/var/www/html/)にwordpressファイルを移動させています。

  • 9-13行目(下記のソースコード)は権限周りの付与になります。
    "WordPress"で使用できる機能の中には、"Apache"ドキュメントルートへの書き込み権限が必要なものがあります (管理画面を使用したメディアのアップロードなど)
    こちらを設定しないと"Wordpress"インストールプロセス中に"config.php"ファイルを自動で作成することができません。

sudo chown -R apache /var/www
sudo chgrp -R apache /var/www
sudo chmod 2775 /var/www
find /var/www -type d -exec sudo chmod 2775 {} \;
find /var/www -type f -exec sudo chmod 0664 {} \;
  • 14行目:"sudo systemctl enable httpd.service"
    →apacheの自動起動を有効にするコマンドです。

  • 15行目:"sudo systemctl start httpd.service"
    →apacheの起動コマンドです。

  • 16,17行目:"wget -P /tmp https://s3.ap-northeast-3.amazonaws.com/amazoncloudwatch-agent-ap-northeast-3/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm,sudo rpm -U /tmp/amazon-cloudwatch-agent.rpm"
    CloudWatchAgentをダウンロード、インストールしています。

2台目のインスタンスも同様の手順で作成します。

6.検証

  • EC2の作成ができましたら実際にSSHで接続し"httpd"が起動できているかと、Wordpressがダウンロードできているかの確認を行います。

  • SSH接続出来たら、以下のコマンドで"httpd"の起動を確認します。

systemctl status httpd.service
  • 下記の内容で起動出来ていること確認できました。

  • 出力結果(ソースコード)

[ec2-user@ip-10-0-1-46 ~]$ systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/httpd.service.d
mqphp-fpm.conf
Active: active (running) since Mon 2022-06-06 08:34:29 UTC; 2min 33s ago
Docs: man:httpd.service(8)
Main PID: 19729 (httpd)
Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
CGroup: /system.slice/httpd.service
    tq19729 /usr/sbin/httpd -DFOREGROUND
    tq19739 /usr/sbin/httpd -DFOREGROUND
    tq19740 /usr/sbin/httpd -DFOREGROUND
    tq19741 /usr/sbin/httpd -DFOREGROUND
    tq19742 /usr/sbin/httpd -DFOREGROUND
    mq19753 /usr/sbin/httpd -DFOREGROUND

Jun 06 08:34:29 ip-10-0-1-46.ap-northeast-2.compute.internal systemd[1]: Star...
Jun 06 08:34:29 ip-10-0-1-46.ap-northeast-2.compute.internal systemd[1]: Star...
Hint: Some lines were ellipsized, use -l to show in full.
[ec2-user@ip-10-0-1-46 ~]$
  • 出力結果(画像)

file

7.ログの確認

  • ユーザーデータの実行ログの確認は下記のコマンドから確認できます。
    sudo cat /var/log/cloud-init-output.log
    長文ため、一部分しか見せれませんが、下記のように確認できます。
[ec2-user@ip-10-0-1-46 ~]$ sudo cat /var/log/cloud-init-output.log
Cloud-init v. 19.3-45.amzn2 running 'init-local' at Mon, 06 Jun 2022 08:32:21 +0                                             000. Up 6.11 seconds.
Cloud-init v. 19.3-45.amzn2 running 'init' at Mon, 06 Jun 2022 08:32:22 +0000. U                                             p 7.22 seconds.

*実行コマンド
file

*パブリックIPから通信確認
 パブリックIPv4アドレスからWordPressの初期設定画面にHTTP接続できるか検証します。

file

*下記より、WordPressの初期設定画面にアクセスできることが確認できました。
 なので、ユーザーデータが問題なく作成されていることになります。

file

8.感想

EC2は、他のAWSリソースに比べ設定項目が多いためドキュメントの参照元を探すのに苦労しましたが、詳細設定をCloudFormationで操作できるのは、魅力的でした。

9.参照

Last modified: 2022-06-22

Author