見出し画像

AmazonEC2のウェブサーバをhttps接続できるようにする

こちらの記事で作ったウェブサーバをSSL接続に対応させてみる

SSL接続のためにはドメイン名を持っている必要がある
フリードメインや無料ドメインなどでも良いが
今回はRoute53を使って購入したドメイン名を利用する

以下の記事はAWSでドメインを購入する場合の手順だ

大まかな流れ

  1. 固定IPに変更する

  2. サーバーにindex.htmlをいれる

  3. ホストゾーンを用意する

  4. SSL証明書を取得する

  5. ターゲットグループを作成する

  6. ロードバランサーを作成する

  7. ルートの追加

  8. EC2のセキュリティグループを編集

固定IPに変更する

EC2インスタンスを起動すると自動的にパブリックIPが割り当てられる
しかしそれは仮のグローバルIPのようなもので、インスタンスを再起動するたびに値が変更されてしまう
本格的な運用時は固定IPを割り当てる必要がある
AWSで固定IPはElasticIPと呼ばれている
EC2に割り当てられたElasticIPはそのインスタンスが起動されている間は無料だが止めると料金が発生する

EC2 ダッシュボードからElastic IPを選択

Elastic IP アドレスを割り当てる を選択

ネットワークボーダーグループはap-northeast-1
あとはそのまま [割り当て] を選択

Elastic IPが割り当てられる

IPをEC2インスタンスに関連図ける

リソースタイプはインスタンス
インスタンスは作成したEC2のインスタンス
プライベートIPアドレスは自動的に割り振られる

EC2インスタンスの詳細を確認すると、新しいIPアドレスが割り当てられているのが分かる

PuTTYの設定も忘れずに変更しておく

サーバーにindex.htmlをいれる

パーミッションを変更する

ApacheのWebサイト公開用のルートディレクトリは
/var/www/htmlなので、ここにindex.htmlをコピーしたい
そのためにはまずフォルダのパーミッションを変更する必要がある

PuTTYでログインしtelnetのコンソール画面上で

ls -l /var/www/

を実行すると /var/www/html の情報が確認できる

drwxr-xr-x 2 root root 6 Feb 18 00:09 html
こんなものが表示されると思う
意味は以下のサイトが詳しい

とにかく書き込みの権限がないのでこのままではコピーできない

sudo chmod 777 /var/www/html

として書き込み権限を追加する

index.htmlを用意する

コピーするためのindex.htmlを用意する
ただのHello Worldページでは味気ないので
BootstrapのサンプルサイトにあったHello World を頂いてきた

index.htmlをコピーする

Windows上で適当な場所にフォルダを作成し、
作ったindex.html と PuTTY接続に使うMyWebServerKey.ppkをコピーする
今回は C:\tmp フォルダにした

Windows Power Shell を起動

作ったフォルダに移動

cd C:\tmp

PuTTYをインストールすると、PowerShell上でpscpというコマンドが使えるようになる
こいつでローカルからサーバーにファイルをコピーできる

pscp -i MyWebServerKey.ppk index.html ec2-user@35.79.240.89:/var/www/html/

ブラウザでhttp://35.79.240.89/にアクセスしてみる

成功していればそれっぽい画面が表示される

ホストゾーンを用意する

固定IPに切り替えたらドメインに対応させてゆく
まずはホストゾーンを確認する

Route53でドメインを購入していれば自動的に対応したホストゾーンが作られているはずなので新たに作成する必要はないがRoute53以外のドメインポータルサイトでドメインを取得した場合などではホストゾーンを作る必要がある

以下の記事はAWSでホストゾーンを作成するための手順だ

SSL証明書を取得する

HTTPS接続のためにはSSL証明書を取得する必要がある
セキュアなサイトであることを第三者に証明してもらうためのものだ

以下の記事はAWSでSSL証明書を取得する手順だ

ターゲットグループを作成する

AWSでSSL対応をするためには仮にインスタンスが1つしかなくてもロードバランサーを追加する必要がある
ターゲットグループというのは複数のインスタンスをグループ化してロードバランサと関連付けるためのもの

EC2 ダッシュボードに行き、左のタブからターゲットグループを探す
ターゲットグループから[ターゲットグループの作成]を選択

ターゲットタイプはインスタンス

プロトコル/ポートはhttp / 80
VPCはEC2サーバが置いてあるVPC
プロトコルバージョンはHTTP1
ヘルスチェックプロトコルはHTTP
ヘルスチェックパスは /
だいたいデフォルトのままで行けると思う

グループにEC2インスタンスを追加する
①をチェックして②を押すと③が追加される

[ターゲットグループの作成] を選択する

ロードバランサーを作成する

ロードバランサーは負荷の高い処理をレプリケーションされた複数のインスタンスに分散するためのルーターっぽい仕事をするものだ
インスタンスが1つしかない場合には不要なものだが、SSL通信のためには必要になるらしい
セキュリティ的に ”内” と ”外” を分けるために必要なのかな?
と想像している

EC2 ダッシュボードに行き、左のタブからロードバランサーを探す
ロードバランサーから[ロードバランサーの作成]を選択

Applocation Load Balancerを作成

名前は適当につける
スキームはインターネット向け
IPアドレスタイプはIPv4

VPCはEC2サーバが置いてあるVPCを選択しサブネットにチェックをいれる
サブネットは最低二つ以上必要なので適当に二つ三つ選ぶ

セキュリティグループを選択する

デフォルトでセットされているセキュリティグループは外して
新しいセキュリティーグループを作成する

セキュリティグループ名:MyWevServerLoadBalancerSecurityGroup
(なんでもいい)
説明:SecurityGroup for MyWevServerLoadBalancer
(日本語だとエラーになる)
VPC:いつもと同じやつ

インバウンドルールはこの2つを設定
HTTPS  TCP   443    Anywhare IPv4     0.0.0.0/0
HTTPS  TCP   443    Anywhare IPv6     ::/0

アウトバウンドルールは
全てのトラフィック すべて すべて カスタム 0.0.0.0/0
(デフォルトのまま)


完成したセキュリティグループを選択する

リスナーの設定

プロトコル/ポート:HTTPS/443
デフォルトアクション:さっき作ったターゲットグループ
セキュリティポリシー:ELBSecurityPolicy-2016-80(デフォルトまま)
デフォルトのSSL/TSL証明書:ACMから   取得した証明書

作成に成功すれば、こんなメッセージがでる

ルートの追加

インターネットからhttps通信のリクエストが飛んできたときに、それをロードバランサーのアドレスに振り分けるルートを指定する必要がある

Route53のダッシュボードに飛び、
Route53 > ホストゾーン > ドメイン名まで進む

ここでレコードタブを確認
レコード名:ドメイン名、タイプ:A
のレコードが既に存在していたら、その値を編集する
存在してないなら新規で作成する 

レコード名:空白
レコードタイプ:A
エイリアス:ONにする
トラフィックのルーティング先:
 Application Load Balancer と Classic Load Balancerへのへイリアス
 アジアパシフィック(東京)
 作成したロードバランサー

EC2のセキュリティグループを編集

元々EC2側に設定されていたセキュリティグループは普通にインターネットに向かって開かれた設定になっているので、ロードバランサーに対してのみ通信を許可するように修正する

EC2ダッシュボードに戻り
インスタンスの詳細からセキュリティタブを選択し
インスタンスに関連付けられているセキュリティグループを選択する

インバウンドルールを編集

ここでまずHTTPとHTTPSのルールを全て削除する

削除した後で、[ルールを追加] を選択

タイプ/プロトコル/ポート:HTTPS/TCP/443
ソースをカスタムで、ロードバランサーのセキュリティグループを選択する

HTTPの通信はもうしないので、HTTPのルールは消したままでよい

これで全ての設定が完了
なんとなくこのような構造を構築したことになる

Chromeでアクセスするとアドレスの横に鍵マークがでている

この記事が気に入ったらサポートをしてみませんか?