FirebaseからGKE Ingressに Aレコードを切り替えた話

こんにちは、vivit株式会社でインフラまわりを担当している井島です。
セルフマネージドSSLの具体的な更新手順とか、ググっても全然出てこなかったので、記事にしてみました。
なにかの参考になればと思います!

背景

あるFQDNexample.com とします。)をGKEのIngressに移行してくるというものなのですが、 移行というものは、Firebase上で動いているサイトを、GKE上に持ってきて、 DNSを変更して、切り替え、というよくある話です。
単純にAレコード切り替えれば済むんじゃね?と思っていたら、意外とマネージドSSLに癖がありました。

GCPマネージドSSLの仕様

ところが、GCPの「マネージドSSL」というものは以下制限がありました。

  • ドメインDNS レコードがロードバランサのターゲット プロキシの IP アドレスを参照している。」

  • 「ターゲット プロキシが Google マネージド証明書リソースを参照している。」

    • →作成したマネージドSSLIngress に適用されていること
  • 「ロードバランサの構成(転送ルールの作成など)が完了している。」

    • Ingress 構築が完了していること

参考:SSL 証明書の概要  |  負荷分散  |  Google Cloud

上記すべてを満たす必要があります。

移行方法

一時的にLet's Encrypt からSSL証明書を取得し、それを一時的にingressで利用することで、FirebaseからGKEに無事、無停止でDNS切替できました。

実際に行った手順を紹介します。

手順

1. https://sslnow.ml/example.comSSL証明書を取得

sslnow.ml 簡単にLet's Encrypt SSL証明書を取得できます。感謝です!

2. 取得したSSL証明書GCPにセルフマネージドSSLとしてインポート(gcloudコマンド例)

ローカルPCでコマンドを実行します。

gcloud compute ssl-certificates create example-com-ssl-temp --certificate example.com_fullchain.crt --private-key example.com.key
ポイント
  • --certificate オプションでSSL証明書を指定するのですが、1つのファイル内単純にSSL証明書、中間SSL証明書の順序で2つの証明書を入れたファイルを指定します。
    ※中間証明書指定のオプションが無いみたいです。
  • ローカルディレクトリにある証明書・鍵ファイルを指定するので、Cloud Shellではできません。
3.IngressSSL証明書を適用
kind: Ingress
metadata:
  annotations:
    ingress.gcp.kubernetes.io/pre-shared-cert: >-
      example-com-ssl-temp
4. hostsファイル にIngress のIPを指定して、移行先のIngressSSL証明書が適用されているか確認
12.34.56.78 example.com
5. example.com のAレコードをIngressのIPに変更
6. GCPマネージドSSLを作成
gcloud beta compute ssl-certificates create example-com-ssl --domains exapmle.com
7. 作成したマネージドSSLIngressに適用

このとき、3で追加したセルフマネージドSSL証明書指定場所より前に設定する。

kind: Ingress
metadata:
  annotations:
    ingress.gcp.kubernetes.io/pre-shared-cert: >-
      example-com-ssl,example-com-ssl-temp

こうすることで、マネージドSSLが使われていることがわかるので、この後、安心して一時的に使った証明書を削除できます。
 ⇢ 同じドメインSSL証明書Ingressに適用したとき、最初に設定されているSSL証明書が参照されるようです。

8. 3で適用した一時的なSSL証明書Ingressから外す
9. 3で適用した一時的なSSL証明書GCPから削除する

最後に

一応セルフマネージドSSLからマネージドSSLへの移行方法は、ちらっと書いてありました。 cloud.google.com