ディップ Advent Calendar 2022 3日目の記事です。
概要
新卒向けの開発研修でWebサービスをAWS(EC2)上に構築した際、HTTPS通信を実現するために色々苦戦し得た知見を本記事で共有いたします。
これからインフラを勉強する初心者エンジニアの方々の参考になれば幸いです。
背景
研修で作成したアプリの概要は以下の通りです
- PHP, Laravelで開発
- サーバはEC2上で構築
- ミドルウェアはApache
- 社内向けのWebアプリケーション
- Slack認証機能付き
また、研修時点の私のAWSの理解度は「ちょっと触ったことがある」程度で、ほぼ初学者レベルでした。
アプリをデプロイしていざHTTPSでアクセス!
研修でアプリケーションを完成させ、いざEC2にデプロイ!
HTTPでアクセスしたところ、無事アプリのトップ画面が表示されました。
今回開発したアプリにはSlackでのログイン認証機能が搭載されており、コールバックURLとしてHTTPSのエンドポイントが必須でしたので、HTTPSでもアクセスできるか試みたところ事件は発生しました・・。
あれ?アクセスできないぞ?
施策① オレオレ証明書をApacheに読み込ませる
調べたところ、HTTPSでアクセスできるようにするにはSSL証明書が必要だということがわかりました。
とりあえず手っ取り早くHTTPSでアクセスできるのを確認できるようにするため、Apacheにオレオレ証明書を読み込ませてみます。
(研修とは言えども、社内サービス構築するのにオレオレ証明書使うのはどうなんだって感じですが・・)
手順
EC2サーバ内の/etc/certs/配下にSSL証明書用の秘密鍵・公開鍵・証明書を作成
openssl genrsa > server.key
openssl req -new -key server.key > server.csr
openssl x509 -req -signkey server.key < server.csr > server.crt
作成したそれぞれの鍵情報をapacheに読み込ませてあげる
SSLCertificateFile /etc/certs/cerver.crt
SSLCertificateKeyFile /etc/certs/server.key
参考: https://qiita.com/nkojima/items/91988b1e91e311311040
結果
エラーページは消えず、安全に接続できませんでした。
施策② opensslで作成した鍵・証明書をACMにインポートする
Apacheのconfファイルでダメなら、AWSのACMを使って読み込ませよう!
手順
施策①で作成した鍵をACMに読み込ませる。
結果
またしてもアクセスできず・・・
解決策 Elastic IP + Route53 + ALB + ACMでHTTPS通信を確立
ここでようやく解決策です・・。
EC2サーバ内で鍵を生成したり、外部サービスから証明書を取ってこなくても、AWSリソースを駆使すればHTTPS通信が実現できると判明しました。
各種リソースの役割は以下の通りです。
- Route53
- SSL証明書・Webサーバとドメインの関連付けを行う
- ACM
- 証明書を管理する
- Elastic IP
- ドメインに関連づけるための固定のIPアドレスを設定する
- ALB
- アプリと証明書を連携させ、HTTPSアクセスできるようにする
- HTTPでのアクセスをHTTPSにリダイレクトさせる
AWSリソースを複数使うので初心者の自分にとってはなかなか大変でしたが、先輩の助けを借りつつ、一つ一つのリソースの役割を学びながらWebサービスのHTTPS化を実現できました。
HTTPS通信の実現を経て学んだこと
「WebサイトのHTTPS化」を実現するためには、DNS設定・ロードバランサ・SSL証明書等の多くの設定が必要であり、Webサービスを支えるさまざまな仕組みについて学ぶことができました。
また、ドメインやロードバランサなどが 「一体なんなのか」 ということはなんとなく知っていたもの、「なぜ必要なのか」「どういう時に必要か」 といったことを考え学ぶきっかけにもなりました。
書籍でWebサイトを支える仕組みを体系的に学ぶことも大事ですが、今回のように実際に手を動かして「HTTPS化を実現する」といった要件を満たすインフラを構築することは、Webサイトを支える仕組みについて 本質的 に理解を深めるために役に立つと実感しました。
「インフラ勉強したいけど、どうやって勉強すればいいんだ・・?」と迷っている方は、「HTTPS化されている」「特定のIPアドレスのみアクセスできる」といった 「特定の要件付きのシステム」 を実際に手を動かして作ってみるといいかもしれません。
参考・関連記事