Route53を利用してローカル環境からLet'sEncryptの証明書を取得する

学んだことや苦労したことを書いていきます。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

## 0. はじめに
ローカルの環境で検証する際に自己証明書をよく使うと思います。
ただ、認証関連で余計な気を回す必要がある上に本番環境では利用しない手順となるため、作業中に虚無感に襲われる瞬間があります。
従って、AWSのRoute53を利用することでLet's Encryptから証明書を取得することにしました。

## 1. ドメイン取得
お名前ドットコムかRoute53でドメインを取得しましょう。
検証用なので、安いドメインで構いません。
お名前ドットコムなら適当にキーワードを入力するだけで安いものを提示してくれます。

## 2. Route53のホストゾーンにドメインを登録
ドメインを取得できたら、Route53のホストゾーンにドメインを登録します。
AWSのコンソールからホストゾーンを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/5978f2da-cef6-e407-5d89-79ae154299fc.png)

ドメイン名に取得したドメイン名を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/391494d7-dd73-e628-7145-eb834c22f665.png)

## 3. ドメインのネームサーバーにRoute53のネームサーバーを追加
ホストゾーンを登録すると、Route53からルーティングするためのネームサーバー情報が登録されます。

![AWS_NameServer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/feae82eb-a591-7e6a-8f03-07038f461757.png)

このネームサーバーをドメインに登録します。
お名前ドットコムの管理画面から、ネームサーバーの変更を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/c8e84fac-6811-397f-a866-02e51c2d6766.png)

ネームサーバーの選択でその他のサービスを選択し、Route53のネームサーバーを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/b642e42a-d1c5-0357-4eb6-12e755025fdf.png)

## 4. Route53で利用するレコードを作成
AWSのコンソールから利用するレコードを作成します。
値にはローカルマシンのIPアドレスを記載します。

![create_record.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/20dd3702-9251-de38-d763-54dadbec2e33.png)

登録できたらdigやnslookupで正常に名前解決できるかを確認しましょう。
ネームサーバーの反映やレコードの更新は時間がかかる場合があるので、名前解決できない場合は少し間を置いてみてください。

## 5. IAMユーザーの作成
Route53を利用してLet'sEncryptから証明書を取得する際には、Route53の権限を持つIAMユーザーのアクセスキーが必要となります。
従って、Route53の権限を持つIAMユーザーを作成します。
まず、AWSコンソールのIAMからRoute53の権限を持ったポリシーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/583fe9c3-685d-2dc4-d028-3fdcf7a752ff.png)

サービスからRoute53を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/7663b7f3-d6a4-0665-49b3-08c14de41199.png)

必要な権限は以下の通りです。
 - リスト (リソースARNすべて)
   ・GetChange
   ・ListHostedZone
 - 書き込み(リソースARN特定)
   ・ChangeResourceRecordSets

ChangeResourceRecordSetsに指定するARNのResourceidは、Route53のホストゾーンの詳細画面から確認できるZから始まる文字列になります。

![Route53_resourceid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/0cd12bd5-1c2c-43ab-3102-78f013410a49.png)

ポリシーを作成後IAMユーザーを作成します。
許可を設定の画面で、作成したポリシーをアタッチします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/12f2c667-d1f5-8b9e-923e-b50258f57f11.png)

IAMユーザーを作成後、アクセスキーを作成します。

![IAM_API.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1762440/16f78bb8-4af8-919b-bbaf-0c9ca90844c5.png)

ユースケースにはローカルコードを選択しアクセスキーを作成します。
csvファイルをダウンロードして注意して保管してください。

## 6. Let's Encryptから証明書を取得する
今回はUbuntuで実施します。
Route53用のcertbot拡張をインストールします。
```
sudo apt install certbot python3-certbot-dns-route53
```
環境変数にAPIキーとシークレットをexportします。
```
export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY
```
certbotを実行します。環境変数を利用しているため、sudoに-Eオプションを付けてください。
```
sudo -E certbot certonly --dns-route53 --dns-route53-propagation-seconds 30 -d <your_domain>
```
通常のcertbotの手順通り、メールアドレスを入力して指示に従ってください。
これで証明書が取得できます。

## 7. まとめ
自己証明書との虚無感を持った格闘は皆さん経験があると思います。
Route53とLet's Encryptを組み合わせることで、検証すべき内容に集中できるようになり効率も気分も上がるというものです。
自己証明書に苦しむ方はお試しください。

## 8. おまけ
証明書の自動更新をしたい場合は、`/root/.aws/credentials`にアクセスキーの情報を記載したのち、crontabにcertbotを登録します。

/root/.aws/credentials
```
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
```
crontabにcertbotを登録
```
sudo crontab -e
# 以下を追加（毎日2回チェック）
0 0,12 * * * certbot renew --quiet
```