CodeStarで作成したDjangoアプリをRoute53でドメイン登録とHTTPS化

# CodeStarでDjangoアプリ作成
こちらの記事を参考にDjangoアプリを作成します。
https://qiita.com/SatoshiGachiFujimoto/items/404e45796ac4e0d7bf81

# ドメイン登録
AWS ConsoleからRoute53を開きます。

「ドメインの登録」をクリックし、登録していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/81a87ede-99d7-64d3-ddaa-31bceec21f3d.png)

ドメイン名を入力し、カートに入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/b1e81c87-66f0-2fb8-1247-b783bee1c79f.png)

連絡先情報を入力します。メールアドレスの確認メールが来るので承認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/1c228605-3a3f-08ae-303f-f135407b8fc6.png)

ドメインの自動更新の有効化と規約に同意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/a711954b-b3f2-3892-9d9a-5637b1380c6c.png)

ドメインの登録が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/a383f6d1-a340-2ffc-6228-f49dd12188f3.png)

今回は20分ほどで完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/8171537d-ab36-f6e1-8b35-a2d357a61cde.png)

CodeStarで作成したDjangoアプリケーションのEC2にこのドメインを紐づけます。EC2はElastic IPを関連付けています。

ホストゾーンからドメイン名を選択し、レコードセットの作成をクリックします。
下記を入力し、作成をクリックします。
- 名前：www
- タイプ：IPv4 アドレス
- 値：EC2で関連付けたElastic IPを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/37f36da6-4e71-5546-3aad-b8b9bfccbf11.png)

登録済みドメインでDjangoアプリにアクセスできれば完了です。

# HTTPS化

<!-- 
AWS ConsoleからCertificate Managerを開きます。

証明書をリクエストします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/12abe20f-2e62-bcf3-8f09-123495443c9b.png)

先ほど登録したドメイン名を入力し、次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/58b05e52-5565-27f4-95fa-2bc178cb6c49.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/3239da38-fa32-d95e-8db1-38c1332b6468.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/f508a298-a1e9-d0d7-1081-9f8b9bbf7b41.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/7d08daf9-19f0-018f-5f2f-9d07a2e9a77f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/6f5b84d8-5cc7-f8c6-54e4-bba38cd10210.png)

メールが来ているので、リンクを開き、I Approveをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/df5b169b-4300-061e-0c16-33040c34ef28.png)

SSL証明書の取得が完了しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/765e1674-e8ec-b1ca-0aee-0fb7afb5c4e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/5a459050-a01c-f430-44cc-e9401d63587b.png)

ロードバランサーの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/5ebca3e8-59e5-930a-49e7-3b3e8ca67321.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/91dc685f-cdc6-f0d4-0695-f73578a53e25.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/c6607a70-4f9e-1c26-b4f3-74d55f729458.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/4d089648-7044-90bd-d89e-c3684be3ec40.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/5f404183-1413-7231-7fb7-654ed0ef1b00.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/e9be8093-f895-599a-238b-5f08237312f9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/c37c41e6-b5fa-93b3-6768-5ba7b434e165.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/0d699fe5-1179-8cb1-0daa-ccc2a306cf07.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/d8d3bfa1-e235-a5eb-51e2-40dcba44a593.png)

--> 

CodeStarで作成したDjangoアプリをHTTPS化します。

PuTTYでEC2にSSH接続します。django-sslserverライブラリをインストールします。Djangoのrequirements/common.txtにも加えておきましょう。

~~~
$ sudo su
$ source /home/ec2-user/environment/bin/activate
$ pip install django-sslserver
~~~

ec2django/settings.pyを編集します。

~~~
$ cd ec2django/
$ vi settings.py
~~~

下記を追記します。

~~~
INSTALLED_APPS = [
　　...
    'sslserver',
]

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
~~~

オレオレ証明書を作ります。

~~~
$ openssl genrsa 2048 > server.key
$ openssl req -new -key server.key > server.csr
$ openssl x509 -days 3650 -req -signkey server.key < server.csr > server.crt
~~~

supervisor.sonfを編集します。

~~~
command = /home/ec2-user/environment/bin/gunicorn -b 0.0.0.0:443 ec2django.wsgi --keyfile server.key --certfile server.crt
~~~

EC2のセキュリティーグループのインバウンドルールにHTTPSを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/6e09818a-251c-fcaf-cd6d-c167580900d5.png)

再起動すると、オレオレ証明書でDjangoアプリが見えると思います。

オレオレ証明書のserver.keyとserver.crtをLet's Encryptで作成したものに置き換えると良さそうです。certbotをインストールして、certbot-autoを実行し、証明書を取得しましょう。


- [Let's Encrypt 証明書でhttps化](https://qiita.com/samiii/items/5910a4431ed8fe8fb96d)
- [Lets Encryptで証明書更新時にcryptographyのエラーが出た時の対処法](https://qiita.com/srai0628/items/9b9b13a673eced8eb199)

しかし、いろいろエラーが出たので、試行錯誤しました。。

- [AWS EC2のAmazon LinuxでLet's Encryptのサーバ証明書を取得する](https://qiita.com/kanehara/items/a2c322acc3d2a96ff42d)

~~~
$ wget https://dl.eff.org/certbot-auto 
$ chmod +x certbot-auto 
$ ./certbot-auto --debug -v 
~~~

- [Let’s Encryptの証明書を更新する（EC2）](https://www.yoshiislandblog.net/2018/04/14/lets-encrypt_renew_ec2/)

~~~
$ sudo /opt/eff.org/certbot/venv/bin/pip install cryptography
$ sudo /opt/eff.org/certbot/venv/bin/pip install interface
$ sudo /opt/eff.org/certbot/venv/bin/pip install zope
$ sudo /opt/eff.org/certbot/venv/bin/pip install parsedatetime==2.5
~~~

再現性の低い記事になってしまい、すみません。試行錯誤してcertbot-autoは実行できるようになりました。certbot-autoを実行する際に、Djangoの静的ファイルの場所に認証局が認証ファイルを読みにいけるように設定する必要があるのですが、、

[Djnagoが動いているサーバをletsencryptでHTTPS化](https://qiita.com/aion/items/60f792437f98c2e277b1)

よくわからなかったので、apache（httpd）のみを入れ、certbot-autoを実行し証明書を取得しました。

[AWSでDjangoのWEBサーバーを作る（Amazon Linux 2、HTTPS化）](https://qiita.com/SatoshiGachiFujimoto/items/fba4edcb9b46a2c76ecd)

~~~
sudo yum -y install httpd24
~~~

httpd2.2系依存のエラーが出ました。。アンインストールとかしてなんとかインストールできました。

/etc/httpd/conf/httpd.confのListen 80の下に追記します。

~~~
sudo vi /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
    DocumentRoot "/var/www/html"
    ServerName "{ドメイン名}"
    ServerAlias "www.{ドメイン名}"
</VirtualHost>
~~~

apacheを起動します。

~~~
sudo service httpd start
~~~

./certbot-autoを実行し、できた.crtと.keyを置き換え、Djangoアプリを再起動で完了です。

~~~
$ sudo cp /etc/letsencrypt/live/www.ドメイン名/fullchain.pem /home/ec2-user/server.crt
$ sudo cp /etc/letsencrypt/live/www.ドメイン名/privkey.pem /home/ec2-user/server.key
$ service helloworld restart
~~~

お疲れ様でした。また最初からやったときにきれいにまとめたいと思います。