- 開発技術
AWSを利用したブログサービスの構築
- #AWS
AWSとは
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
AWS(Amazon Web Services)とは、Amazonが提供しているWebサービスの総称で、世界で最も包括的で広く採用されているクラウドプラットフォームです。世界中のデータセンターから 200 以上のフル機能のサービスを提供しています。
AWS には、コンピューティング、ストレージ、データベースなどのインフラストラクチャテクノロジーから機械学習、AI、データレイクと分析、IoT などの新しいテクノロジーに至るまで、他のどのクラウドプロバイダーよりもはるかに多くのサービスあり、サービス内にはさらに多くの機能があります。
これにより、より速く、より簡単に、より高い費用対効果で既存のアプリケーションをクラウドに移行し、想像できるほぼすべてのものを構築できるようになります。
AWSを利用するメリット
AWSが利用される理由についてまとめると下記のようになります。
1.初期費用ゼロ/低価格
2.継続的な値下げ
3.サイジングからの解放
4.ビジネス機会を逃さない俊敏性
5.最先端技術をいつでも利用可能
6.いつでも即時にグローバル展開
7.開発速度の向上と属人性の排除
8.運用負荷軽減と生産性の向上
9.高いセキュリティを確保
10.日本語での24時間サポート
ブログサービスの構築
今回構築する構成図は下図のようになります。
この構築では基本的に東京リージョンにて設定を行います。また本来であればhttpsの設定が望ましいと思いますが、今回の構築ではhttpで設定を行います。
まずはVPCと片側のサブネットを作成していきます。
AWSのVPCの画面から「VPCの作成」をクリックします。
VPCの設定にて下記の項目を入力します。
名前タグ – オプション:「blog-service-vpc1」
IPv4 CIDR ブロック:「10.0.0.0/21」
他はデフォルトのままとします。
入力したら「VPCの作成」をクリックするとVPCが作成されます。
続いてサブネットの作成を行なっていきます。
左ペインの「サブネット」を選択し、「サブネットの作成」をクリックします。
サブネットを作成にて、下記の項目を入力します。
VPC ID:「blog-service-vpc1」を選択。
サブネット名:「public-subnet1」
アベイラビリティーゾーン:「アジアパシフィック(東京)/ap-northeast-1a」を選択。
IPv4 CIDR ブロック:「10.0.0.0/24」
他はデフォルトの設定のままで、「サブネットを作成」をクリックするとpublic-subnet1が作成されます。
続いてprivate-subnet1を作成します。再度「サブネットの作成」をクリックします。
サブネットを作成にて、下記の項目を入力します。
VPC ID:「blog-service-vpc1」を選択。
サブネット名:「private-subnet1」
アベイラビリティーゾーン:「アジアパシフィック(東京)/ap-northeast-1a」を選択。
IPv4 CIDR ブロック:「10.0.2.0/24」
他はデフォルトの設定のままで、「サブネットを作成」をクリックするとprivate-subnet1が作成されます。
現在はこの状態です。
続いてEC2を構築していきます。
検索項目に「EC2」を入力し、EC2をクリックするとEC2の設定画面に遷移します。
左ペインの「インスタンス」をクリックし、「インスタンスの作成」をクリックします。
ステップ 1: Amazon マシンイメージ (AMI)にて、インスタンスのOSとして「Amazon Linux 2 AMI (HVM), SSD Volume Type」を選択します。
ステップ 2: インスタンスタイプの選択にて、t2.microを選択して、「次のステップ:インスタンスの詳細を設定」をクリックします。
ステップ 3: インスタンスの詳細の設定にて、下記の項目を入力します。
ネットワーク:「blog-service-vpc1」を選択。
サブネット:「public-subnet1」を選択。
自動割り当てパブリック IP:「有効」を選択。
他はデフォルトの設定のままで、「次のステップ:ストレージの追加」をクリックします。
ステップ 4: ストレージの追加ではデフォルトの設定のままで「次のステップ:タグの追加」をクリックします。
ステップ 5: タグの追加にて、下記の項目を入力します。
キー:「Name」
値:「WebServer1」
入力したら「次のステップ:セキュリティグループの設定」をクリックします。
ステップ 6: セキュリティグループの設定にて下記の項目を入力します。
セキュリティグループ名:「Web-SG-1」
説明:「Web-SG-1」
ルールの追加をクリックして、
タイプ:「HTTP」を選択。
他はデフォルトの設定のままで、「確認と作成」をクリックします。
入力内容を確認したら「起動」をクリックします。
キーペアの画面にて、下記の下記の項目を入力します。
「新しいキーペアの作成」を選択。
キーペア名:「Mykeypair」
入力したらキーペアのダウンロードをクリックします。
キーペアのダウンロードが終わったらインスタンスの作成をクリックします。
インスタンスが作成されるまでしばらく待ちます。
インスタンスの状態がrunningとなっていることを確認したら次の手順へ進みます。
検索項目にVPCを入力してVPCをクリックし、VPCの設定画面へ進みます。左ペインの「インターネットゲートウェイ」をクリックし、「インターネットゲートウェイの作成」をクリックします。
インターネットゲートウェイの作成の作成にて下記の項目を入力します。
名前タグ:「my-internet-gateway」
入力したら「インターネットゲートウェイの作成」をクリックします。
VPC画面にて「VPCへアタッチ」ボタンが表示されますので、それをクリックします。
VPC にアタッチにて下記の項目を入力します。
使用可能な VPC:「blog-service-vpc1」を選択。
「インターネットゲートウェイのアタッチ」をクリックすると、VPCにインターネットゲートウェイがアタッチされます。
続いてインターネットとの通信のためのルートテーブルの設定を行なっていきます。
左ペインのサブネットを選択して、public-subnet1のルートテーブルを見ると、送信先:「10.0.0.0/21」、ターゲット:「local」となっており、このVPC内でしか通信できない状態となっています。
「rtb-***(ここではrtb-02f20ddc3ca60be75」をクリックしてルートテーブルの設定画面へ遷移します。
rtb-***のルートタブをクリックし、「ルートを編集」をクリックします。
「ルートを追加」をクリックし、ターゲットの項目にて「インターネットゲートウェイ」を選択します。
先ほど設定したインターネットゲートウェイが選択できるのでそれを選択します。
送信先:「0.0.0.0/0」を入力し、「変更を保存」をクリックします。
続いてセキュリティグループの設定を確認します。インスタンスのWebServer1を選択し、セキュリティグループのインバウンドルールの表示をクリックします。
22番ポートのソースが0.0.0.0/0になっていればOKです。
続いてキーペアの権限が400になっているか確認します。
ターミナルを起動し、キーペアが保存されているディレクトリに移動して、
1 |
ls -l Mykeypair.pem |
を入力してエンターを押します。
今回の場合644になっているので権限を400変更します。
下記コマンドを入力してエンターを押します。
1 |
chmod 400 Mykeypair.pem |
続いてssh接続を行います。
インスタンスのIPv4パブリックIPを確認します。ここでは13.114.133.50となっています。
下記コマンドを実行します。@以降は接続したいインスタンスのIPv4パブリックIPを入力します。ここでは13.114.133.50に接続したいので13.114.133.50を入力します。
1 |
ssh -i Mykeypair.pem ec2-user@13.114.133.50 |
Yesを入力するとssh接続できます。
現在はこの状態です。
ここでRDSを設定していきます。
RDSは複数のAZにまたがったサブネットグループ内に設定しなければいけないので、AZ 1cの中にPrivate subnet2を作成して、Private subnet1とPrivate subnet2をグルーピングします。
サブネットを作成していきます。
サブネットの画面から「サブネットを作成」をクリックします。
サブネットを作成にて、下記の項目を入力します。
VPC ID:「blog-service-vpc1」を選択。
サブネット名:「public-subnet2」
アベイラビリティーゾーン:「アジアパシフィック(東京)/ap-northeast-1c」を選択。
IPv4 CIDR ブロック:「10.0.1.0/24」
他はデフォルトの設定のままで、「サブネットを作成」をクリックするとpublic-subnet2が作成されます。
続いてprivate-subnet2を作成していきます。
サブネットを作成にて、下記の項目を入力します。
VPC ID:「blog-service-vpc1」を選択。
サブネット名:「private-subnet2」
アベイラビリティーゾーン:「アジアパシフィック(東京)/ap-northeast-1c」を選択。
IPv4 CIDR ブロック:「10.0.3.0/24」
他はデフォルトの設定のままで、「サブネットを作成」をクリックするとprivate-subnet2が作成されます。
続いて検索項目に「RDS」と入力してRDSの設定画面に遷移します。左ペインのサブネットグループを選択し、「DB サブネットグループを作成」をクリックします。
DB サブネットグループを作成にて、下記の項目を入力します。
名前:「MySubnetGroup」
説明:「MySubnetGroup」
VPC:「blog-service-vpc1」を選択。
アベイラビリティーゾーン:「ap-northeast-1a」、「ap-northeast-1c」を選択。
サブネット:「10.0.2.0/24」、「10.0.3.0/24」を選択。
「作成」をクリックするとサブネットグループが作成されます。
続いて左ペインのデータベースを選択し、「データベースの作成」をクリックします。
データベースの作成にて、下記の項目を入力します。
エンジンのタイプ:「MySQL」を選択。
テンプレート:「開発/テスト」を選択。(※料金が発生するのでご注意ください)
マスターユーザー名:「wordpress」を選択。
マスターパスワード:パスワードを入力
DB インスタンスクラス:「バースト可能クラス」にチェック、「以前の世代クラスを含める」にチェック、「db.t2.micro」を選択
マルチ AZ 配置:「パスタンバイインスタンスを作成する (本稼働環境向けに推奨)」にチェック(※料金が発生するのでご注意ください)
Virtual Private Cloud (VPC):「blog-service-vpc1」を選択。
サブネットグループ:「mysubnetgroup」を選択。
VPC セキュリティグループ:「新規作成」にチェック。
新しい VPC セキュリティグループ名:「RDS -SG-1」
追加設定 最初のデータベース名:「wordpress」
※今回の設定では月間で43.48USDかかってしまいますのでご注意ください。
他はデフォルトの設定のままで、「データベースの作成」をクリックします。
データベースが作成されるまでしばらく待ちます。
データベースが作成されたら、VPC設定画面を開き、左ペインのセキュリティグループを選択、「RDS -SG-1」にチェックし、インバウンドルールタブを選択し、「Edit inbound rules」をクリックします。
インバウンドルール編集画面に遷移します。
もともと設定されているソースを×で消去します。
ソースの項目で「Web-SG-1」を入力し、Web-SG-1を選択します
エラーが発生しました。
下記のサイトのようにして対処していきます。
[小ネタ]セキュリティグループ変更時にYou may not specify a referenced group id for an existing IPv4 CIDR ruleと表示された際の対応方法
(https://dev.classmethod.jp/articles/aws-you-may-not-specify-a-referenced-group-id-for/)
「ルールを保存」をクリックするとインバウンドルールを変更できます。
これでWebサーバーからのみアクセスできるようになりました。
基本的にデータベースへのアクセスは最小限にする必要があります。
続いてWordPressをインストールします。
ターミナルで管理者権限に切り替えます。
1 |
sudo su - |
パッケージを最新の状態にアップデートします。
1 |
yum -y update |
続いてアパッチ、PHP、MySQLをインストールします。
1 |
amazon-linux-extras install php7.2 -y |
1 |
yum -y install mysql httpd php-mbstring php-xml gd php-gd |
アパッチのサービスを再起動後も自動的に起動するようにenableに設定します。
1 |
systemctl enable httpd.service |
アパッチのサービスをstart状態にします。
1 |
systemctl start httpd.service |
ワードプレスのパッケージを取得し、解凍します。
1 2 3 |
wget http://ja.wordpress.org/latest-ja.tar.gz ~/ tar zxvf ~/latest-ja.tar.gz |
ワードプレスのパッケージをコピーし、権限を変更します。
1 |
cp -r ~/wordpress/* /var/www/html/ |
1 |
chown apache:apache -R /var/www/html |
現在はこの状態です。
ここまででひとまずWordPressの画面を起動してみたいと思います。
IPv4 パブリックIPをコピーしてブラウザのURL入力欄にペーストしてURLへアクセスします。ここでは13.114.133.50となっています。
WordPressの画面に遷移したら「さあ、始めましょう!」をクリックします。
WordPressの入力フォームにて、下記の項目を入力します。
ユーザー名:「wordpress」
パスワード:パスワードを入力
データベースのホスト名:RDSのエンドポイントを入力(ここではdatabase-1.cgfodtmiye9f.ap-northeast-1.rds.amazonaws.comとなっています。RDSのエンドポイントの確認方法は下図の通りです)
「インストールの実行」をクリックします。
必要情報にて、下記の項目を入力します。
サイトのタイトル:「ブログサービス」
ユーザー名:「wordpress」
パスワード:パスワードを入力します。最初から入力されているのでそれを使用する場合はメモ等で控えておいた方がいいです。
メールアドレス:メールアドレスを入力します。
入力後「WordPressをインストール」をクリックします。
登録が成功しましたらログインをクリックします。
登録したメールアドレスとパスワードを入力してログインし、下図の画面が出るとWordPressのインストールが正常に行われたことが確認できます。
続いて冗長構成にするためにEC2の2つ目を設定したいと思います。EC2の1つ目と区別するために目印を記述したいと思います。
ターミナルで管理者権限に切り替え、下記コマンドを入力してエンターを押します。
1 |
cd /var/www/html/ |
1 |
vi index.php |
小文字の「o」を入力し、下図のように下記のソースを記述します。
1 |
echo '<p>blog service 1</p>'; |
Control + Cを押し、「:wq」を入力してエンターを押します。
続いてEC2の設定画面にて左ペインのインスタンスを選択し、WebServer1を選択してアクション→インスタンスの状態→停止をクリックします。
WebServer1が停止されるまで待ちます。
インスタンスが停止されたらアクション→イメージ→イメージの作成をクリックします。
イメージの作成にて、下記の項目を入力します。
イメージ名:「WebServer」
イメージの説明:「WebServer」
他はデフォルトの設定のままで、「イメージを作成」をクリックします。
WebServerのAMIが作成されるまでしばらく待ちます。
WebServerのAMIが作成されたら、EC2設定画面の左ペインのインスタンスを選択し、「インスタンスの作成」をクリックします。
ステップ 1: Amazon マシンイメージ (AMI)にて、「マイAMI」を選択し、「WebServer」を選択します。
ステップ 2: インスタンスタイプの選択にてt2.microを選択して次のステップへ移動します。
ステップ 3: インスタンスの詳細の設定にて下記の項目を入力します。
ネットワーク:「blog-service-vpc1」を選択。
サブネット:「public-subnet2」を選択。
自動割り当てパブリック IP:「有効」を選択。
他はデフォルトの設定のままで、次のステップへ進みます。
ステップ 4: ストレージの追加ではデフォルトのままで次のステップへ進みます。
ステップ 5: タグの追加下記の項目を入力します。
キー:「Name」
値:「WebServer2」
入力したら次のステップへ進みます。
ステップ 6: セキュリティグループの設定にて、既存のセキュリティグループを選択し、「Wev-SG-1」を選択し、「確認と作成」をクリックします。
ステップ 7: インスタンス作成の確認にて内容を確認したら「起動」をクリックします。
キーペアの設定については既存のキーペア「Mykeypair」を選択し、I acknowledge ~ にチェックして「インスタンスの作成」をクリックします。
WebServer2が起動している間に、WebServer1のアクション→インスタンスの状態→開始をクリックして、WebServer1を起動します。
WebServer2が起動したら、ターミナルでWebServer2にssh接続します。
ターミナルで下記コマンドを実行します。@以降はWebServer2のIPv4パブリックIPを入力します。ここでは52.193.114.136に接続したいので52.193.114.136を入力します。
1 |
ssh -i Mykeypair.pem ec2-user@52.193.114.136 |
ssh接続できたら下記コマンドを実行します。
1 |
sudo su - |
1 |
cd /var/www/html/ |
1 |
vi index.php |
echo ‘<p>blog service 1</p>’; → echo ‘<p>blog service 2</p>’;に変更します。
Control + Cを押して、:wqを入力してエンターを押します。
これでWebServer2の設定が完了しました。
続いてELBの設定を行なっていきます。
左ペインのロードバランサーを選択し、「ロードバランサーの作成」をクリックします。
ロードバランサーの種類の選択にて「Application Load Balancer」の「作成」をクリックします。
手順 1: ロードバランサーの設定にて下記の項目を入力します。
名前:「LB-1」
VPC:「blog-service-vpc1」を選択。
アベイラビリティーゾーン:ap-northeast-1a、ap-northeast-1cにチェック。
ap-northeast-1a:「public-subnet1」を選択。
ap-northeast-1c:「public-subnet2」を選択。
他はデフォルトの設定のままで、次の手順へ進みます。
手順 2: セキュリティ設定の構成にてフロントエンド接続に HTTPS プロトコルをお使いください。と表示されますが、今回はHTTP接続のまま行いますのでこのままで次の手順へ進みます。
手順 3: セキュリティグループの設定にて下記の項目を入力します。
セキュリティグループの割り当て:「新しいセキュリティグループを作成する」にチェック。
セキュリティグループ名:「LB-SG-1」
説明:「LB-SG-1」
80番ポートで全ての通信を許可する設定で構わないので次の手順へ進みます。
手順 4: ルーティングの設定にて下記の項目を入力します。
ターゲットグループ:「新しいターゲットグループ」を選択。
名前:「TG-1」
ヘルスチェック パス:「/readme.html」
ヘルスチェックの詳細設定
正常のしきい値:「2」
間隔:「10」
他はデフォルト設定のままで次の手順へ進みます。
手順 5: ターゲットの登録にて、WebServer1、WebServer2にチェックして「登録済みに追加」をクリックすることで、登録済みターゲットにWebServer1、WebServer2が登録されます。
次の手順に進みます。
手順 6: 確認にて内容を確認したら「作成」をクリックします。
続いてRDSの中に設定されているサイトアドレスをロードバランサーのDNS名に変更します。
ターミナルでWebServer1もしくはWebServer2にssh接続して管理者権限に切り替えます。
下記コマンドを実行します。mysql -hの次はRDSのエンドポイントを入力します。ここではdatabase-1.cgfodtmiye9f.ap-northeast-1.rds.amazonaws.comとなっています。
1 |
mysql -h database-1.cgfodtmiye9f.ap-northeast-1.rds.amazonaws.com -u wordpress -p |
1 |
USE wordpress |
1 2 |
SELECT * FROM wp_options WHERE option_name IN ('siteurl', ‘home'); |
Option_valueのhttp://以降をロードバランサーのDNS名に変更します。
下記コマンドを実行します。ここではDNS名はLB-1-1150199548.ap-northeast-1.elb.amazonaws.comとなっています。
1 |
UPDATE wp_options SET option_value = 'http://LB-1-1150199548.ap-northeast-1.elb.amazonaws.com' WHERE option_name IN ('siteurl', 'home'); |
続いてEC2のセキュリティグループが全ての通信を許可しているので、ロードバランサーの通信のみ許可するようにインバウンドルールを変更します。
セキュリティグループでWeb-SG-1を選択し、インバウンドルールタブのEdit inbound rulesをクリックします。
タイプ:HTTPのソースをLB-SG-1にして「ルールを保存」をクリックします。
これでブログサービスの構築が完了しました。
ブログサービスの動作確認
ロードバランサーのDNS名をコピーしてブラウザのURL入力欄に貼り付けてサイトが表示されるか確認します。
サイトの画面が表示されました。
更新ボタンを何回か押してblog service 1が表示されることを確認します。
blog service 1が表示されました。ロードバランサーによってWebServer1とWebServer2で設定したサイトが表示されることが確認できました。
試しにWebServer1を停止してもサイトが表示されるかどうか確認したいと思います。
WebServer1を停止してサイトを表示します。
サイトが表示されることが確認できました。
続いてRDSが冗長化構成になっているか確認します。
RDSの設定画面でアクション→再起動をクリックします。
フェイルオーバーで再起動しますか?にチェックを入れて確認をクリックします。
フェイルオーバーで再起動中にサイトを表示してみます。
サイトが表示されました。
RDSのログをみるとフェイルオーバーされていることが確認できますので、RDSが再起動してもフェイルオーバーされ、サイトの表示が維持されることが確認できました。
確認は以上となります。
今回の構築では料金が発生しますので、構築が終わったらEC2やELB、RDSをすべて終了または削除することを推奨します。
(※EC2等で停止のアクションがありますが、停止だと課金され続けられるのでご注意ください)
参考URL
・AWS CloudTech
・AWS によるクラウドコンピューティング
(https://aws.amazon.com/jp/what-is-aws/)
・[小ネタ]セキュリティグループ変更時にYou may not specify a referenced group id for an existing IPv4 CIDR ruleと表示された際の対応方法
(https://dev.classmethod.jp/articles/aws-you-may-not-specify-a-referenced-group-id-for/)
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>