この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
皆様こんにちは。
今回はCloudFormatonを利用して高可用性アーキテクトの構築をしていきます。
この記事ではEC2の作成を行います。
1.高可用性アーキテクト構築目次AWS config
2.EC2について
Amazon Elastic Compute Cloud (Amazon EC2) は、Amazon Web Service (AWS) クラウドでスケーラブルなコンピューティングキャパシティーを提供します。Amazon EC2 の使用により、ハードウェアに事前投資する必要がなくなり、アプリケーションをより速く開発およびデプロイできます。
参照:公式ドキュメント:EC2
3.構築したいEC2構成図
- マルチ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 ~]$
- 出力結果(画像)
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.
*実行コマンド
*パブリックIPから通信確認
パブリックIPv4アドレスからWordPressの初期設定画面にHTTP接続できるか検証します。
*下記より、WordPressの初期設定画面にアクセスできることが確認できました。
なので、ユーザーデータが問題なく作成されていることになります。
8.感想
EC2は、他のAWSリソースに比べ設定項目が多いためドキュメントの参照元を探すのに苦労しましたが、詳細設定をCloudFormationで操作できるのは、魅力的でした。