サイトアイコン 協栄情報ブログ

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構成図

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

5.EC2構築手順

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

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

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

5-2.EC2の作成

下記はインスタンスの設定項目です。
ファイル名「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の作成

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
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 {} \;

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

6.検証

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 ~]$

7.ログの確認

[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.

*実行コマンド

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

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

8.感想

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

9.参照

モバイルバージョンを終了