Let's Encrypt の SSL/TSL 証明書を Amazon Route53 と Docker で作成する機会があったので備忘録。Route 53 でドメインを管理しているサイトで使える方法です。作業マシンに Docker が入っていればよいので、環境が汚れず、依存ツールのインストールなどを考えなくて良いのが楽です。
全体的な作業手順は certbot のドキュメント certbot-dns-route53’s documentation を参照しました。
目次
IAM ユーザのアクセス権限の設定
事前準備です。作業マシンで利用する IAM ユーザに Route 53 の操作権限を与えます。
IAM ユーザの詳細ページのアクセス権限タブから、インラインポリシーを以下のように設定します。YOURHOSTEDZONEID
はご自身のホストゾーン ID に置き換えてください。詳細は IAM ユーザーのアクセス権限の変更 - AWS Identity and Access Management を参照。
{
"Version": "2012-10-17",
"Id": "certbot-dns-route53 sample policy",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:GetChange"
],
"Resource": [
"*"
]
},
{
"Effect" : "Allow",
"Action" : [
"route53:ChangeResourceRecordSets"
],
"Resource" : [
"arn:aws:route53:::hostedzone/YOURHOSTEDZONEID"
]
}
]
}
IAM ユーザのアクセスキーの設定
IAM ユーザ詳細ページの認証情報タブでアクセスキーを作成します。詳細は IAM ユーザーのアクセスキーの管理 - AWS Identity and Access Management を参照。
次に aws configure
コマンドなどを利用して、~/.aws/config
ファイルにアクセスキーを設定します。詳細は 設定の基本 - AWS Command Line Interface を参照。
[default]
aws_access_key_id=AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key=wJalrXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
以上で事前準備は終わりです。
証明書の作成
以下のコマンドで証明書を作成します。-d
オプションで指定しているドメインはご自身のものに置き換えてください。
docker run -it --rm --name certbot \
-v $(pwd)/etc/letsencrypt:/etc/letsencrypt \
-v $(pwd)/var/lib/letsencrypt:/var/lib/letsencrypt \
-v ~/.aws:/root/.aws \
certbot/dns-route53 certonly --dns-route53 \
-d "www.example.com"
利用規約の確認やメールアドレスなどを入力してしばらく待つと、作業マシンの etc/letsencrypt/live
に証明書が作成されます。
$ ls -l etc/letsencrypt/live/www.example.com
-rw-r--r-- 1 karakaram staff 692 Oct 21 09:03 README
lrwxr-xr-x 1 karakaram staff 44 Oct 21 09:03 cert.pem -> ../../archive/www.example.com/cert1.pem
lrwxr-xr-x 1 karakaram staff 45 Oct 21 09:03 chain.pem -> ../../archive/www.example.com/chain1.pem
lrwxr-xr-x 1 karakaram staff 49 Oct 21 09:03 fullchain.pem -> ../../archive/www.example.com/fullchain1.pem
lrwxr-xr-x 1 karakaram staff 47 Oct 21 09:03 privkey.pem -> ../../archive/www.example.com/privkey1.pem
証明書の更新
3 ヶ月で証明書の期限が切れるので、定期的に更新が必要です。更新も作成のときと同じコマンドで行います。
docker run -it --rm --name certbot \
-v $(pwd)/etc/letsencrypt:/etc/letsencrypt \
-v $(pwd)/var/lib/letsencrypt:/var/lib/letsencrypt \
-v ~/.aws:/root/.aws \
certbot/dns-route53 certonly --dns-route53 \
-d "www.example.com"
更新が成功すると以下のように etc/letsencrypt/live
が新しい証明書に変わります。
$ ls -l etc/letsencrypt/live/stg-cci3.git.dmm.com
-rw-r--r-- 1 karakaram staff 692 Oct 21 09:03 README
lrwxr-xr-x 1 karakaram staff 44 Jan 18 08:07 cert.pem -> ../../archive/www.example.com/cert2.pem
lrwxr-xr-x 1 karakaram staff 45 Jan 18 08:07 chain.pem -> ../../archive/www.example.com/chain2.pem
lrwxr-xr-x 1 karakaram staff 49 Jan 18 08:07 fullchain.pem -> ../../archive/www.example.com/fullchain2.pem
lrwxr-xr-x 1 karakaram staff 47 Jan 18 08:07 privkey.pem -> ../../archive/www.example.com/privkey2.pem
Route53 以外の DNS プラグイン
Route53 以外にもたくさんの DNS サービスに対応しています。certbot/certbot - Docker Image | Docker Hub に対応プラグインがあるので必要に応じて使い分けましょう。