🔒

ACMとELBでEC2へのアクセスをSSL化

2024/07/30に公開

前回までEC2へのLaravelアプリデプロイ、
Route53を使ったドメイン名登録などを行ってきた

https://zenn.dev/takodevlog/articles/112883dd379327
https://zenn.dev/takodevlog/articles/0929241c5ab534

現状すべてのアクセスがHTTPで行われてしまっているのでこれをHTTPSでの接続に変更していく
HTTPS接続を実現するためにSSLサーバ証明書を取得し、それをELBに設定することで実現する

今回使用するのは以下の通り

  • AWS Certificate Manager(ACM)
  • Elastic Load Balancing(ELB)

ACMでSSLサーバ証明書の取得

SSLサーバ証明書は、サーバの管理者が存在することを確認及び通信データの暗号化を行うために必要になる
ここでは、AWS Certification Manager(ACM)から取得する

AWSマネジメントコンソールを開き、Certificate Managerを開く
左のナビゲーションから「証明書をリクエスト」を選択

証明書タイプは「パブリック証明書をリクエスト」を選択
(というかプライベートは選択できないと思う)

完全修飾ドメイン名には先ほど作成したドメイン名を指定する
(サブドメイン含め全てを指定する場合は以下のようにする)

*.ドメイン名

*はワイルドカードとして働き、サブドメイン全てを保護できるようになる

検証方法は「DNS検証を選択」(推奨になっている)
キーアルゴリズムはとりあえずデフォルトのRSA 2048で

設定がOKならリクエストボタンを押下
ボタンを押すと検証画面に入り、ステータスが保留中の検証になっている

「Route 53でレコードを作成」ボタンを押下して検証用のCNAMEレコードを作成することができる

十数分程度かかるが、証明書のステータスが発行済みになれば証明書の発行は無事完了となる

ELBへの設定

AWSマネジメントコンソールを開き、EC2のダッシュボードを開く
左側のナビゲーションから「ロードバランサー」を選択し、ロードバランサーの作成を押下する
タイプと比較が表示されるので「Application Load Balancer(ALB)」で作成を押下する

ロードバランサー名にはわかりやすい名前をつける(ただし一意である必要がある)
「ネットワークマッピング」項目ではVPCには情報が入力されているはず
マッピングで少なくとも2つのAZを選択する

「セキュリティグループ」へは以下のインバウンドルールを持つセキュリティグループを設定する必要がある

IPv4  HTTPS  TCP  ポート:443  ソース:0.0.0.0/0
IPv4  HTTP   TCP  ポート:80   ソース:0.0.0.0/0

無ければ新しく作成すること

「リスナーとルーティング」項目のリスナーのプロトコルをHTTPからHTTPSへ変更する

ここに設定するためのターゲットグループを新たに作成する
設定は以下

ターゲットタイプ … インスタンス
ターゲットグループ名 … [任意]
プロトコル:ポート … HTTP/80
IPアドレスタイプ … IPv4
VPC … 1つしかなければデフォで
プロトコルバージョン … HTTP1
ヘルスチェックプロトコル … HTTP
ヘルスチェックパス … /

次のページで作成ボタンを押して準備完了
再びALBのリスナー設定へ戻り、HTTPSのリスナーのデフォルトアクションに今作ったHTTPのターゲットグループをセットする

「セキュアリスナーの設定」ではセキュリティーポリシーはデフォルトのままにしておき、
デフォルトSSL/TLSサーバー証明書の部分で「ACMから」を選択し、先ほど作った証明書を選択する

全てOKなら作成ボタンを押下する

Route53のコンソールを開き、ホストゾーンの一覧を表示する
対象のAレコードを選択し編集画面を開く
エイリアスのチェックを入れ、値/トラフィックのルーティング先を変更する

これで保存ボタンを押して変更

https:// ドメイン名をブラウザで入力し接続できるか確認する

HTTPリクエストをHTTPSにリダイレクト

ついでにHTTPでリクエストされたものもHTTPSで通信されるようにリスナーの設定を追加する
EC2 > ロードバランサーで対象のロードバランサーを選んで詳細画面から作業する

画面下部の「リスナーとルール」タブを選択し、リスナーの追加ボタンを押す

プロトコルはHTTPを選択し、ポートは80を入力
デフォルトアクションのルーティングは「URLにリダイレクト」を選択し、
プロトコルはHTTPS、ポートは443を入力して追加ボタンで追加

先ほどのリスナーとルールの画面でHTTPS:443に加えてHTTP:80が追加されたのを確認
(画像では次の手順のリダイレクト設定も反映されているが)

追加されたHTTP:80を選択し、もう1つルールを追加する
今はデフォルトのルールだけあると思うので、ルールを追加するボタンを押す
名前は適宜つける
次に条件の設定になるので、条件の追加ボタンを押し以下のように
ルールの条件タイプはパス、パスは * を入力して確認へ

次へ進むとアクションの選択になる
アクションはURLにリダイレクトを選択してプロトコルをHTTPS、ポートを443に

優先度はとりあえず1とか適当な数字で

問題なければ保存

これで先ほどの画像と同じ設定になるはず

もしセキュリティグループでHTTPのリクエストを許可していない場合は許可すること

これでHTTPでアクセスしてHTTPSへリダイレクトされていればOK😎

おわりに

これにてHTTPSでドメインからアクセスできるセキュアな状態になった
Unityの方もHTTPSアクセスに切り替え以前のHTTPを許可する設定も元に戻せた

余裕があればRDSへの置き換えあたりも触っておきたい

参考記事

https://zenn.dev/mk668a/articles/b2cfe3688df29f

https://zenn.dev/shota_imazeki/books/7a0f8e2f4cccd846fb16/viewer/728ee2

https://zenn.dev/shota_imazeki/books/7a0f8e2f4cccd846fb16/viewer/4797fc

ありがとうございました🙇

Discussion