AWSのEC2で無料でhttps化する方法(ELBなし)
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
AWS の EC2 で LetsEncrypt を使って https 化させるときの方法についてまとめました。
はじめに
世の中の EC2 で無料で https 化する記事は
Elastic Load Balancing
という、月約2000円のサービスや
Amazon CloudFront
とい う、従量課金制のサービスを使ったものばかりだったので、AWS のドキュメントにも書かれている
Let's Encrypt
という無料で SSL 証明書を発行してくれているサービスを使って実装したいと思います。
前提条件
- Amazon Linux2
- Elastic IP で固定 IP を設定済み
- 独自ドメインで http での公開が完了している
- httpd でアパッチを起動している状態
関連記事 PHP7.4 + Laravel6 のプロジェクトを AWS EC2 にデプロイする
参考文献
実装方法
Certbot というツールを使用して実装します。
Lets Encrypt は3ヶ月間という有効期限をもった SSL 証明書の発行をしてくれます。
EC2 のインスタンスに ssh 接続します
秘密鍵.pem ファイルがあるディレクトリで
$ ssh -i "*****.pem" ec2-user@12.345.678.910
EC2 に入ったら、コマンドで必要な準備をします。
sudo wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/
sudo rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-*.rpm
sudo yum-config-manager --enable epel*
sudo yum repolist all
上記のコマンドで EPEL というリポジトリパッケージを EC2 にインストールします。
4つめのコマンドは repolist が入ったかを確認するためのコマンドです。
アパッチの設定ファイルの編集をする前にバックアップを取る
アパッチの編集ファイルは初期状態だと、
/etc/httpd/conf/httpd.conf
ここにあります。
設定ファイルを編集するときには必ずバックアップを取りましょう。
cd /etc/httpd/conf
sudo cp httpd.conf httpd_bak.text
ls
cp コマンドで、バックアップファイルをコピーしておきます。
cp はコピーのこと。1つめのファイルを2つ目のファイル名でコピーするというコマンドです。
ls でリストを表示、コピーされてるか確認しましょう。
アパッチの設定ファイルの編集をする
では編集していきます。
vim コマンドを使って、ファイルを編集していきます。
sudo vim httpd.conf
(Listen 80 の下に)
<VirtualHost *:80>
DocumentRoot "/var/www/html/<<Laraveのプロジェクト名>>/public"
ServerName "取得したドメイン"
ServerAlias "www.取得したドメイン"
</VirtualHost>
を追記します。
DocumentRoot には、Laravel プロジェクトの public フォルダを指定します。
これは環境によって変わるので、コピペでは動かないので注意してください。
DocumentRoot "/var/www/html/<<Laraveのプロジェクト名>>/public"
ServerName や ServerAlias はそれぞれの環境に合わせて書き換えてください.
ServerName "<<取得したドメイン>>"
ServerAlias "www.<<取得したドメイン>>"
アパッチを再起動して、エラーが出ないか確認する
コマンドで、
sudo systemctl restart httpd
エラーが出る場合は間違っているので、一旦元のファイルに戻しましょう。
//エラーが出たら戻す。
sudo cp httpd_bak.text httpd.conf
バックアップファイルを編集してミスったファイルに上書きして戻すことができます。
Certbot のインストールをする
sudo yum install -y certbot python2-certbot-apache
依存パッケージも一緒にインストールしてます。
起動します。
sudo certbot
あとは質問に答えるだけで実装されます。
質問の内容は下記の通り。
① メールアドレスは? → 自分のメールアドレス入れる
② 規約に同意しますか? → A
③ メーリングリストに登録しますか? → Y or N
④ どっちの名前で https する? → 空欄で Enter
⑤HTTP クエリを HTTPS にリダイレクトするどうかの確認 → HTTP 経由でサーバーに接続するには、「1」、HTTPS 経由の暗号化接続のみ受け入れる場合は、「2」(自分は2にしました)
⑥Congratulations! You have successfully とでたら成功です。
以下のコマンドでアパッチを再起動してエラーがでないか確認してみましょう。
sudo systemctl restart httpd
セキュリティグループのインバウンドを設定する
最後に、セキュリティグループの設定をします。
このインバウンド設定をしないと、URL を叩いても更新マークがクルクル回っていっこうに表示されません。
インバウンドの設定に443ポートを追加します。
この設定が完了したら、実際に URL を叩いて表示できるかどうか、確認してみてください。
自動更新の設定
今実装したのは無料の3ヶ月が有効期限の証明書です。
3ヶ月後に自動的に新しい証明書を取りに行く設定をします。
sudo vim /etc/crontab
下の方に追記
39 1,13 * * * root certbot renew --no-self-upgrade
これで OK です。
sudo systemctl restart crond
再起動して反映させます。
この設定で自動更新が完了しました。
AWS のドキュメントによれば、このあとテストと強化を推奨しているので、ぜひやってみてください。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/SSL-on-amazon-linux-2.html#ssl_test
【関連記事】
PHP7.4 + Laravel6 のプロジェクトを AWS EC2 にデプロイする
まとめ
以上です!
慣れない作業な上に、微妙に間違えたらエラーでるのでトラウマになる人もいると思います。
作業前のバックアップは必ずとっておいて損はないと思います。