明滅するプログラマの思索

WEBエンジニアとして勤務している一介の男が、日々気づいたことをまとめるブログです

Google Cloud Platform の負荷分散に Let's Encrypt のSSL証明書を設定する

Google Cloud Platform(以下 GCP)で利用可能なロードバランサでフロントをSSLにするために Let's Encrypt を利用することができます。
この件については、以下の参照先が大変参考になります。

qiita.com

ここでは、参照先の内容を踏まえて気を付けるべき点と、自動化するための設定をまとめます。

気を付ける点

フロントエンドのIPはエフェメラルにしてはいけない

参照先でも触れられていますが、フロントエンドのIPはエフェメラルにしてはいけません。
エフェメラルにすると、IPが一時的に割り振られる形となり、停止→稼働するたびに異なるIPが割り当てられてしまうため、そのたびにDNSの設定を更新しなくてはならなくなります。
じゃあ再起動しなければ良いってことなのかと思いますが、実はそれだけではありません。

フロントエンドはHTTPとHTTPSを別々に設定できるようになっています。
そこでIPをエフェメラルにしてしまうと、HTTPとHTTPSのIPが異なるものになってしまいます。
もしサイトドメインをHTTPとHTTPSのどちらでも受け付けられるようにする場合、同じドメインなのにHTTPとHTTPSでIPが異なるため、Aレコードの設定ができなくなってしまいます。


[2017/09-27追記]
VPCネットワーク「外部IPアドレス」にて、設定済みのエフェメラルのIPを静的IPとして扱うことができることに後から気づきました。この設定変更は、各種インスタンスを停止することなく行うことができます。エフェメラルに設定したIPは、「外部IPアドレス」で静的IPに変更すればOKです

ロードバランサに割り当てる際に出るエラー

首尾よく Let's Encrypt のSSL証明書を発行できたら、以下のコマンドを実行して Google Cloud Platform に証明書リソースを作成できます。

gcloud compute ssl-certificates create <project>-cert \
--certificate /etc/letsencrypt/live/<project domain>/cert.pem \
--private-key /etc/letsencrypt/live/<project domain>/privkey.pem \
--description "<project> certification."

このとき、以下のようなエラーが出ることがあります。

ERROR: (gcloud.compute.ssl-certificates.create) Could not fetch resource:
 - Required 'compute.sslCertificates.create' permission for 'projects/XXXX'

これは gcloud で使用しているアカウントに compute.sslCertificates.create の権限がないため発生します。
権限は google cloud platform の IAM で設定できます。

https://cloud.google.com/compute/docs/access/iam?hl=ja には、各種権限を付与する役割が記載されています。
上記の権限はCompute Engine セキュリティ管理者という役割を付与すると持つことができます。

どのアカウントを使用しているかわからない場合は

gcloud info

で確認できます。

google cloud platform に証明書リソースを作成したら、それをロードバランサに割り当てます。

gcloud compute target-https-proxies create <project>-https-lb-target-proxy \
--ssl-certificate <project>-cert \
--url-map <lb名>

ここでも以下のエラーが出る場合があります。

ERROR: (gcloud.compute.target-https-proxies.create) Could not fetch resource:
 - Required 'compute.targetHttpsProxies.create' permission for 'projects/XXXX'

これも該当する権限がないため発生します。
この権限はCompute Engine ネットワーク管理者の役割を付与すれば持つことができます。

自動化の設定

前述の参照先でも自動化について触れられていますが、記載のコマンドでは自動化できません。
gcloud compute ssl-certificates には update オプションが用意されていないためです。
証明書リソースは更新することができず、作成および削除のみが行えます。
そこで、例えば以下のようにしてあげれば自動化が可能となります。

# 証明書リソース名に年月を含めて作成する
gcloud compute ssl-certificates create fitness-cert`date +'%Y%m'` --certificate /etc/letsencrypt/live/<project domain>/cert.pem --private-key /etc/letsencrypt/live/<project domain>/privkey.pem --description "<project> certification."
gcloud compute target-https-proxies update <project>-https-lb-target-proxy --ssl-certificate <project>-cert`date +'%Y%m'` --url-map <project>-lb
# 先月の年月が付与された証明書リソースを削除
gcloud compute ssl-certificates delete <project>-cert`date -d '1 month ago' +'%Y%m'` -q

gcloud compute ssl-certificates delete は、実行するとDo you want to continue (Y/n)? と訊いてきますので、それを抑制するために -q オプションを付けています。