AWS Certificate Manager の証明書再インポートは厳密にはオンラインでできない

Posted on

AWS Certificate Manager (ACM) の証明書には、Amazon Issued と Imported の 2 種類のタイプがあります。後者は自前で取得した証明書を ACM にインポートして使う場合で、たとえば EV SSL 証明書を使いたいケースなどが挙げられます。

Imported の証明書を更新するには、有効期限が切れる前に再インポートの作業が必要です。

再インポートがオンラインで行えるかどうかは、ACM と統合しているサービスに依存しています。 ALB のドキュメントには次のような説明があります。

Renewing or replacing a certificate does not affect in-flight requests that were received by the load balancer node and are pending routing to a healthy target. After a certificate is renewed, new requests use the renewed certificate.

これを読むとオンラインで更新(再インポート)できそうに見えますが、この記述はミスリーディングです。

再インポート時に ClientTLSNegotiationErrorCount のメトリクスが跳ねる

リクエストを受け付けている時間帯に再インポートを行ったところ、ALB の ClientTLSNegotiationErrorCount メトリクスがアップロードした瞬間に跳ねていることが確認できました。このメトリクスの意味は「クライアントにより開始され、TLS エラーのためにロードバランサとのセッションを確立しなかった TLS 接続の数」です。

ClientTLSNegotiationErrorCount のメトリクス

不思議に思って AWS Support に問い合わせしてみました。回答を要約すると次のとおりです。

  • ロードバランサノードがいったん受信を完了し、バックエンドにルーティングをしようとしているリクエストについては影響しない
  • ロードバランサノードが受信中(例えば TLS ネゴシエーション中)のリクエストについては切断される可能性がある

なるほど、後者はドキュメントにちゃんと明記しておいてほしい…。

このエラーになった場合は TLS のハンドシェイクが確立していないので、ユーザーには HTTP のステータスコードは返っていないはずです。クライアントソフトウェアの実装次第ですが、真っ白な画面だったり、ずっと読み込み中といった挙動になっていると思われます。また、初回のフルハンドシェイクのときだけ起きるのか、セッション再開 (session resumption) のときにも起きるのかはハッキリしません。

というわけで、証明書の再インポートはピークタイムを避けてリクエスト数が少ない時間にやったほうが良さそうです。