サーバレスアーキテクチャ

Netlify + CloudflareプロキシでLet's EncryptのSSL更新を自動化する

Netlify + Cloudflareプロキシ環境下だと、NetlifyでLet's EncryptのSSL更新がエラーになります。今回はこのエラーを回避してSSL更新を自動化する方法をまとめました。

Cloudflareプロキシ環境下でNetlifyのSSLが更新できないワケ

NetlifyでホストしているサイトをCloudflareでプロキシする場合、Let’s EncryptのSSL更新をしようとすると「サイトがNetlifyでホストされていません」というエラーが出て、SSLの更新が出来ません。

これは、Netlify側がLet’s Encryptの更新ボットを実行した際に、オリジンサーバーのIPアドレスがプロキシしているCloudflareのIPアドレスになってしまい、本来のオリジンサーバー(Netlify)のIPアドレスに到達できないから起こる現象です。

解決策

NetlifyのLet’s Encrypt・SSL証明書は、プライマリードメインに対してのみ行い、そのほかのサブドメインについてはエイリアスしているだけなので、この仕組みを利用して、

  1. 更新用のサブドメインを用意
  2. 更新用のサブドメインでSSLを更新
  3. メインドメインは更新用のサブドメインにエイリアス

という方法を使うと、Netlify + Cloudflareプロキシ環境下でも、SSL証明書の更新エラーを回避できます。

更新用のサブドメインを用意&プライマリードメインに

まずは、更新用のサブドメインを用意します。今回は、certというサブドメインを使います。

Netlifyの管理画面で、cert.ドメイン名を追加してプライマリードメインに設定します。続いて、CloudflareのDNSレコードに、certをCNAMEで追加します。この時プロキシはオフにしておきます。

メインドメインを「ドメインエイリアス」にする

この設定をすると、これまで使ってきてwwwあり・なしのメインドメイン(ドメインがexample.comなら、www.example.comとexample.com)がドメインエイリアスになっているはずです。

もし、新規登録する際は、cert.ドメイン名を最初に登録してプライマリードメインにして、wwwあり・なしドメインを追加すれば自動的にドメインエイリアスになります。

この時点で、Netlify + Cloudflareプロキシ環境下で、SSL証明書のエラーを回避する設定が完了です。

cert.ドメインをrobots.txtでブロックする

このままだとcert.ドメインとメインドメインの中身が全く一緒になって、重複コンテンツになってしまうので、対策をします。

Netlifyのリダイレクト設定を使って、メインドメインにリダイレクトしたいところですが、当然ですが、リダイレクト設定をするとSSLの更新でエラーが起こりますので、robots.txtで対策します。

robots.txtはメイン用のものと共用できない(メインドメインもブロックしてしまう)ので、certサブドメイン用に「robots_cert.txt」を用意して、cert.ドメイン名の時だけこちらを使うようにリダイレクト設定をします。

[[redirects]]
  from = "http://cert.ドメイン名/robots.txt"
  to = "/robots_cert.txt"
  status = 200
  force = true

注意したいのは、こちらは上書きなのでstatusは301ではなく200番です。

wwwあり・なし対策をする

デフォルトのNetlifyの挙動では、wwwあり・なしドメインを自動的にリダイレクトしてくれますが、今回の方法ではプライマリーが「cert.ドメイン名」になっているため、この機能が使われません。

そこでNetlifyのリダイレクト設定で、wwwあり・なしの設定をnetlify.tomlに記述します。

[[redirects]]
  from = "http://www.ドメイン名/*"
  to = "https://ドメイン名/:splat"
  status = 301
  force = true

上の設定は、wwwなしに統一する設定です。wwwありに統一する場合は、記述を逆にします。注意点としては、上記のリダイレクト設定は、リダイレクト設定の最初に書きます。Netlifyのリダイレクト設定は上から順番に適用するからです。

netlify.tomlを書き換えたら、いつも通りデプロイすれば、リダイレクトが効くはずです。

ここまでの設定ができれば、Netlify + Cloudflareプロキシ環境下でSSLの自動更新ができるようになります。


Netlify + CloudflareプロキシでLet’s EncryptのSSL更新を自動化する方法を見てきました。

やや裏技的なやり方ですが、こうした裏技が使えるのも、Netlifyの自由度の高さ故ですね。


価格は記載がある場合を除き、すべて税込みです。

この記事の関連キーワード

サーバレスアーキテクチャの記事