お疲れ様です。以前AWSの構築のタスクにちょっとだけ関わることができました。そこで復習を兼ねてマルチAZ構成の基本的な設計を構築してみました。
・VPCの作成
・ルートテーブルの設定
・RDSの構築
・ALBの作成とリダイレクトの設定
・Route53のホストゾーンとドメイン登録
・ACMの作成
構築を進めていく上でわからないところを調べ上げ改めて気づきになった学びをアウトプットしてみました。
構成としてはこのような設計で作ります。
ちなみに今回の内容はレビューしてもらいました。読むならこちらの記事を。
レビュー前の自分はどのような設定にしていたのか、どんな勘違いをしていたのかを記録しておきたいので本記事は修正せずに残しておきたいと思います。参考にはしないでください。
VPCの作成
まずはAWSの基本、VPCを作成します。VPCの説明については「AWSで基本的なネットワークを構築してみた」の記事をご覧ください。
(コピーしてCtrl +Fで画面内検索すれば一番下の参照記事に飛びます!)
[VPC]-[お使いのVPC]-[VPCを作成]
今回は一つのVPCを作成し一つずつ設定をしていくので「VPCのみ」をを選択します。
IPv4 CIDRは10.0.0.0/16で登録します。
可用性のある構成にするため4つのサブネットを作成
作成したVPCの中にサブネットを作成していきます。可用性のある構成にしたいので
一つのAZにプライベートサブネットとパブリックサブネットを作成します。なので二つのAZに設置するので合計四つのサブネットを作成します。
[VPC]-[サブネット]-[サブネットを作成]
まずはパブリックサブネットを作成します。アベイラリティーゾーンはap-northeast-1aを使用、IPv4 CIDRブロックは10.0.0.0/24を使用します。
そのままプライベートサブネットを作成したいので下の「新しいサブネットを追加」を押します。
プライベートサブネットは10.0.1.0/24を作成します。これと同じ要領でもうap-northeast-1cのAZでプライベートサブネットとパブリックサブネットを作成します。
■ap-northeast-1c
・portforio-pub-02
10.0.5.0/24
・portforio-pri-02
10.0.6.0/24
EC2の作成
それでは作成したサブネットにサーバを設置します。
作成するサーバは3つ、パブリックサブネットに踏み台用に1つ、そしてプライベートサブネットに2つ作成します。
インスタンスの作成は[EC2]-[インスタンス][インスタンス起動]
AMIは料金が比較的安いAmazon Linuxを選択します。
EC2のアーキテクチャとは
アーキテクチャは64ビットのものを使用します。ちなみにアーキテクチャとは、CPUのルールみたいなものと言ったらいいでしょうか。種類によってCPUの使い方、CPUに対する命令の書き方が違います。
何もつかないのがインテルのCPU、aがつくものがamdという会社のCPU。ArmはArmのというソフトバンクが買収した会社でArmベースのものはGがつきます。
インスタンスタイプは無料利用枠のタイプを使用します。キーペアはないので右の[新しいキータイプの作成]を押して作成します。
このキーペアですがプライベートキーと公開キーを含む、サーバに入るための身分証明書みたいなものです。WindowsサーバならこのキーペアからIDとパスワードを生成します。
今回はキーペアのタイプRSAを使用します。プライベートキーファイル形式は.pemを使用します。Privacy Enchanced Mailの略で主にAWSで使われる形式で、.ppkがWinScpやTeratarmなどで使います。
ネットワーク設定では先ほど作成したVPCを選択します。今回作成したEC2はパブリックサブネットに設置したいのでportforio-pub-01を選択します。
続いてセキュリティグループは、SSH接続ができるのと他にカスタムTCPで1024~65535のポート範囲から入れるようにして起きます。このポート番号の設定はエフェメラルポート といってパソコンからでも入れるようにするポート番号です。
この設定はパブリックサブネットにEC2を設置する方法ですが、これと同じ手順でプライベートサブネットにもEC2を作成していきます。
■ap-northeast-1a
・portforio-pri-01
■ap-northeast-1c
・portforio-pri-02
ルーティングテーブルの設定
今度は、作成したサーバーがインターネットと通信ができるようにインターネットゲートウェイの設定と
パブリックサブネットに作成したサーバーがプラベートサブネットに作成したサーバーに入れるようにする設定を行いたいと思います。
まずはインターネットゲートウェイの作成
[VPC]-[インターネットゲートウェイ]-[インターネットゲートウェイの作成]
これでインターネットゲートウェイの作成は終わりです。以下igwと言います。次にVPCにアタッチします。
[VPC]-[インターネットゲートウェイ ]-
[(作成したインターネットゲートウェイ )]-
[アクション]-[VPCにアタッチ]
先ほど作成したVPCにアタッチさせます。これでインターネットと通信ができるようになりました。次はパブリックサブネットにあるサーバがプライベートサブネットにあるEC2と通信ができるようにしたいと思います。
パブリックサブネットのルートテーブル
[VPC]-[ルートテーブル]-[ルートテーブルを作成]
パブリックサブネットにあるルートテーブルはインターネットとプライベートサブネットにあるEC2と通信ができるようになる設定を行います。
ここで一つ、つまづきポイントがありました。
インターネットゲートウェイを設定するときは未知のネットワーク宛てに通信をするためのルートとなるため0.0.0.0/0が設定する値だと知っていたのですが、サーバのルートテーブルを設定する際に[送信先]を選択すると、、
この表示が出たので、「この中から選ばないといけないの?」「あれ、これってインスタンスのプライベートIPを入れるだけじゃダメなのか・・」
実際にインスタンスのプライベートIPを入れるとエラーが出ました。
ルートテーブルの[送信先]に入れる値を理解していなかったんですよね。。この場合、指定したいEC2が設置されているAZのサブネットを入れる必要があります。
なのでap-northeast-1aで作成したプライベートサブネットに設置しているEC2へのルートを設定したい場合は、ap-northeast-1aで作成したプライベートサブネット、つまり先ほど作成した10.0.1.0/24の値を入れる必要があります。
そしてターゲットにはインスタンスIDを入力します。これで[変更を保存]を押して保存をします。そしてこのルートテーブルをパブリックサブネットに関連付けします。
[VPC]-[ルートテーブル]-[(設定したルートテーブル)]-
[サブネットの関連付け]-[サブネットの関連付けを編集]
プライベートサブネットのルートテーブル
プライベートサブネットのルートテーブルは、パブリックサブネットに設置しているインスタンスとプライベートサブネットに設置しているインスタンスにルーティングさせます。
RDSの作成
次はRDSを作成します。RDS作成に必要なサブネットグループを作成する必要があります。
DBサブネットグループを作成する
[RDS]-[サブネットグループ]
サブネットグループはRDS作成時に自動で作成することもできますが指定のサブネットにしたい場合はこのようにあらかじめてサブネットグループを作成することができます。一つのAZで障害が起きても大丈夫なように複数のAZ、サブネットを設定します。
ちなみにこのキャプチャにはありませんがサブネットグループの[説明を入れておかないと作成することはできません。その次にRDSを作成する画面に移ります。
[RDS]-[データベース]-[データベースの作成]
使用するのはMySQL、バージョンはMySQL 8.028を使用します。テンプレートは無料枠を使用します。そのあとの設定はほとんどデフォルトのままで行きます。
マスターユーザー、マスターパスワードはもし必要であれば顧客に希望がないかを確認しておきます。今回はサンプルの名前で作っています。
またパスワードは設計書では黒塗りにしてコピペします。パスワードを確認するときは手入力で確認します。
設定するVPCは作成したVPCを選択、DBサブネットグループは先ほど作成したサブネットグループを選択します。
ALBの設定
続いてALBの作成を行います。ALBを作成する際に調べていると、いろんな発見がありました。ロードバランシングというと一般的に複数のサーバーに不負荷分散させるイメージがあったのですが実は1つのサーバーだけでの設計でもメリットがあります。
ヘルスチェックといってEC2が正常に稼働しているかを確認することができますし、ACMで作成した証明書をALBにアタッチさせることで通信の暗号化/複合化もしてくれます。組み合わせて使うことでセキュリティ性を向上させることができます。
ターゲットグループの設定
[EC2]-[Target groups]-[Create target group]
ALBを作成する前に負荷を分散させるターゲットグループを作成する必要があります。
今回はインスタンスのターゲットグループを作成するのでを選択します。
■その他、各設定項目の説明
・HealthCheckProtocol:シンプルにヘルスチェックを実行するときに使用するプロトコルのことを言います。
・Health Check path:ターゲットでのヘルスチェックの送信先のことを言います。
Portはヘルスチェックを行う際にALBが使用するポートのことを言います。
・HealthyThreshold:非正常なインスタンスが正常であるとみなすまでに必要なヘルスチェックの連続成功数のことを言います。ヘルスチェックはいわゆる健康診断みたいなものです。たった1回の診断よりも複数回OKが出れば、より正常に稼働しています!・・といったニュアンスでしょうか。
・UnhealthyThreshold:その逆で非正常なインスタンスが確実に非正常なインスタンスとみなされるまでの連続失敗回数のことを言います。
次の画面に進めると[Avaible instances]の画面になります。ここで負荷分散する際のターゲットとなるインスタンスを選択します。今回は3つに分散させます。
下の[Ports for selected instances]はチェックを入れたインスタンスにどのポートを使ってトラフィックを通信させるか入力するものです。デフォルトは80番となっています。
[Include as pending below]で確定します。そうすると[Review targets]で選択したインスタンスを表示させることができ、[Create target group]でターゲットグループを作成します。
ALBの作成
■各設定項目の説明
・Scheme:ロードバランサーにどんな役割をさせるかを選択させます。
・Internet-facing:インターネットに顔を向けると言う意味で使われる。インターネットからのトラフィックを受ける役割をします。クライアントからの要求をインターネット経由でターゲットにルーティングします。パブリックサブネットが必要です。
・internal:外には見せない、内部で負荷を分散させるタイプのロードバランサー
・IP address type:IPv4のIPアドレスを利用するかDualstackといってIPv4とIPv6の二つを利用する設定ができます。
またキャプチャは撮れていませんがその他の設定項目はこちら。
・Network mapping
ALBをどこに設定するかを選択します。
・VPC:ALBを設置するVPCを選択します。
・Mappings:ALBを設置するAZを選びます。負荷を分散させるため二つ以上のAZを選択します。
■ここで設定した値
・VPC:portforio-01を選択。
・AZ:ap-northeast-1a、ap-northeast-1cを設定しました。
・Security groups:必要であればここでセキュリティグループを設定してトラフィックを制御することができます。
・Listeners and routing
・Listener:リスナーとは トラフィックを受けるポートのことを言います。ここでどのプロトコルで受けるのかを選択します。設定したポートとプロトコルでトラフィックを受けてターゲットグループへルーティングします。
■ここで設定した値
・Protocol:HTTP
・Port:80
・Default action:portforio-01
ROUTE53の設定
ドメインはAWSでドメインを取得することもできますが有料で料金が発生してしまいます。
なので今回はfreenumにてドメインを無料で取得します。
ドメインの取得
下のキャプチャの画像のままドメインを探すとエラーになります。チェックアウトができないので左上のサインインで会員登録、サインインを済ませておく必要があります。
会員登録を済ませてサインインをすませた後はドメインを検索します。[今すぐ入手!]をクリックすると[選択]と表示されるので、確定ならチェックアウトをクリックしてください。(会員登録の手順は飛ばします。)
会員登録を済ませてサインインをすませた後はドメインを検索します。[今すぐ入手!]をクリックすると[選択]と表示されるので、確定なら[チェックアウト]をクリックしてください。
[Continue]を押せば、確認画面に移り、[Complete Order]をクリックすれば購入は完了です。
ホストゾーンの作成
その次にAWSの画面に移りホストゾーンを作成します。
ホストゾーンとは取得したドメイン、サブドメインをプライベートサブネット内でルーティングさせるのかインターネットでルーティングさせるのか情報を持っておく機能です。
場合によってはコンテナと表現されることもあります。
[Route53]-[ホストゾーン]-[ホストゾーンの作成]
その次にレコードを作成します。
[Route53]-[ホストゾーン]-[レコードを作成]
そうするとレコードが三つ作成されタイプがNSのレコードの[値/トラフィックのルーティング先]の箇所に四つのネームサーバーが表示されます。
この四つのネームサーバーは「このcloud.infraのドメインを問い合わせするときはこのネームサーバーを使ってね!」という意味でNSタイプのところに表示される4つのネームーサーバーが使われます。
クリエイトレコードを選択してシンプルルーティングを選択します。その次にルーティングさせるサーバーを選択したいので、、
画面を変えて[EC2]-[インスタンス]
ルーティングさせたいウェブサーバーをチェックしてパブリックサブネットのアドレスをコピーします。
Route53の画面に戻り、サブドメインを入力したら[値]にパブリックサブネットのアドレスを入力し、ルーティングポリシーは[シンプルルーティング]を選択します。
そして次は先ほどの四つのネームサーバーをfreenumに登録します。
[freenum]-[Services]-[My Domains]-[任意のドメイン-Manage Domain]-[Management Tools]-[Nameservers]-[Use custom nameservers (enter below)]
この画面から先ほどの4つのネームサーバーを登録します。
なぜネームサーバーをドメインの提供元に登録する必要があるのか?
わかりやすく例えるなら、
ドメイン名を決定するなら会社名を決めたのと同じです。例えば「株式会社クラウドインフラ」という名前で会社を立ち上げたとします。
社名は決まったとしても「じゃあその株式会社クラウドインフラに郵便を送る場合は、どこに送ればいいの?」って話になります。会社の所在地がわからないといった状態です。
電話帳で会社名を調べても掲載されていないので、どこに電話をすればいいかわからない、どこの住所に送ればいいのかわからない、
これがネームサーバーなどを決めていない状態です。
建てた会社をどこの住所に所在地とするのか決めたり電話番号を決めるのがDNSになります。それらの情報を電話帳に載せるための行為がドメインの提供元に四つのネームサーバーを登録する行為になります。
整理すると、、
・ドメイン=社名
・ドメインの提供元=法人登記する法務局
・ネームサーバー=電話番号
・ホストゾーン=電話番号を発行してくれる企業、NTTとか
ドメインの提供元でまずはドメイン名を取得する。
ホストゾーンでネームサーバーを作成する。
ドメインを問い合わせする際はこのネームサーバーを使ってください。という意味でドメインの提供元にネームサーバーを登録しにいく、といった流れです。
これで確認ができました。
ちなみに[Non-authoritative answer]はおおもとの権威サーバーではなくDNSサーバーから回答をもらっているという意味です。
nslookupはDNSサーバーに問い合わせをするコマンドです。
ACMの設定
ACMは通信を暗号化するためのSSL証明書を発行することができるサービスです。
[検証方法を選択]ではDNS検証とEC2メール検証の二つがありますがDNS検証を行います。
そうすると保留中の検証の画面になります。
キャプチャにはありませんが、[証明書を表示]を押します。そうすると、Route53でレコードを作成する画面になります。
この表示が出ればRoute53の画面に戻りましょう。
Route53の画面に戻り新しくできたCNAMEのレコードにチェックをいれると[レコードの詳細]の画面でacm-validations.aws.が出ていればACMでレコードの作成が完了したことが確認できます。
しばらく時間が経つとこのようにステータスが成功になります。これが出ればHTTPSのセキュアな通信ができるようになります。
ちなみにChromeではHTTPのURLを探そうとすると警告を出すようになりますし今では常時TLS(SSL)が当たり前なのでHTTPSを使うように推奨されています。
セキュリティ推奨:ALBのリダイレクト設定
今ではTLS(SSL)が当たり前でHTTPSを使うように推奨されていると説明しました。このHTTPSを使用するためにALBでリダイレクトを使うこともできます。
リダイレクトとはクライアントからサーバーへのリクエスト、そしてサーバーからクライアントへのレスポンスをするこの一連の流れを再度やらせることを言います。
ALBリダイレクトのメリット
ALBでのリダイレクト設定はhttpで受けたリクエストをリダイレクトさせてhttpsでリクエスト、レスポンスをさせる設定です。
これを行うことでEC2までリクエストせず、ALBですぐ応答を返すので応答速度が早くEC2にリクエストが届く回数が減るのでEC2の負荷や攻撃されるセキュリティリスクが下がります。
それでは設定していきます。
リダイレクトの設定手順
[EC2]-[ロードバランサー]-[リスナー]
HTTPにチェックをいれて[編集]をクリックします。
[Listener details]の画面に入ります。すでにForwardのアクションが入っているので[Remove]を押して削除します。
ここでリダイレクト先のプロトコル、HTTPSを選択しポート番号は443を選択します。
[Original host, path, query]はURLの構造に合わせてことを言います。
〇〇のpathはどこどこにリダイレクトする、〇〇のhostの場合はEC2に飛ばすなどの条件設定ができます。
Status codeは通信の状態を表すコードを言います。よくクリックしたウェブサイトが見つからない場合、それを表すために「404 Not Found」と表示されることがあります。
リダイレクトを行った際の状態を301か302を選択できますが使い方は恒久的な動きをしたいので301にします。
先ほどのリスナーの画面に戻り[次の宛先にリダイレクト中:HTTPS://]と表示されていればOKです。
他にもこんな記事あります。
設計構築関連の記事
検証関連やってみたの記事
今回の記事の参考リンク・参考教材
【SAA-C03版】これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座