TerraformでさくらのクラウドのエンハンスドロードバランサのLet's Encrypt設定を行う

Terraform for さくらのクラウド v1.13.0リリース

本日リリースのTerraformさくらのクラウド向けプロバイダー v1.13.0にてエンハンスドロードバランサ関連の機能拡充が行われました。

  • 100/500CPSプランのサポート
  • HTTPSへのリダイレクト機能
  • HTTP/2のサポート
  • Let's Encrypt設定

Release v1.13.0 · sacloud/terraform-provider-sakuracloud · GitHub

新プラン/HTTPSへのリダイレクト/HTTP2のサポート

これらについては以下のようなtfファイルで利用可能となっています。

resource "sakuracloud_proxylb" "foobar" {
  name = "terraform-test-proxylb-acme"

  # 100CPSプランを利用
  plan = 100

  vip_failover = true
  health_check {
    protocol = "http"
    delay_loop = 10
    host_header = "usacloud.jp"
    path = "/"
  }

  bind_ports {
    proxy_mode = "http"
    port       = 80

    # HTTPSへのリダイレクトを有効化
    redirect_to_https = true
  }
  bind_ports {
    proxy_mode = "https"
    port       = 443

    # HTTP/2サポートの有効化
    support_https = true
  }
  servers {
      ipaddress = "${sakuracloud_server.server01.ipaddress}"
      port = 80
  }
}

Let's Encryptの利用

Let's Encryptを利用するには新設されたリソースsakuracloud_proxylb_acmeを利用する必要があります。

# エンハンスドロードバランサでのLet's Encrypt設定
resource sakuracloud_proxylb_acme "foobar" {
  proxylb_id = sakuracloud_proxylb.foobar.id
  accept_tos = true # 規約への同意
  common_name = "www.example.com"
  update_delay_sec = 120
}

注意点としてはさくらのクラウドのマニュアルに記載の条件を満たす必要があるという点があります。

f:id:febc_yamamoto:20190625160913p:plain

manual.sakura.ad.jp

  • 待ち受けポート(bind_ports)を適切に設定すること
  • 対象のコモンネーム(FQDN)がエンハンスドロードバランサのVIP or FQDNに向いていること

2番目の条件である、DNSレコードの設定を含めたtfファイルの例は以下の通りです。

# エンハンスドロードバランサの定義
resource "sakuracloud_proxylb" "foobar" {
  name = "terraform-test-proxylb-acme"
  plan = 100
  vip_failover = true
  health_check {
    protocol = "http"
    delay_loop = 10
    path = "/"
  }

  # Let's Encryptを利用するにはhttp/https両方のbind_portsが必要
  bind_ports {
    proxy_mode = "http"
    port       = 80

    redirect_to_https = true
  }
  bind_ports {
    proxy_mode = "https"
    port       = 443

    support_https = true
  }
  servers {
      ipaddress = "${sakuracloud_server.server01.ipaddress}"
      port = 80
  }
}

# エンハンスドロードバランサでのLet's Encrypt設定
resource sakuracloud_proxylb_acme "foobar" {
  proxylb_id = sakuracloud_proxylb.foobar.id
  accept_tos = true # 規約への同意
  common_name = "www.example.com"
  update_delay_sec = 120
}

resource sakuracloud_server "server01" {
  name = "terraform-test-server01"
  graceful_shutdown_timeout = 10
}

# エンハンスドロードバランサのVIP/FQDNを解決するためのDNSレコード設定
data sakuracloud_dns "zone" {
  name_selectors = ["example.com"]
}

resource "sakuracloud_dns_record" "record" {
  dns_id = data.sakuracloud_dns.zone.id
  name   = "www"
  type   = "CNAME"
  value  = "${sakuracloud_proxylb.foobar.fqdn}."
  ttl    = 10
}

この例ではエンハンスドロードバランサのFQDNを証明書発行対象のFQDNのCNAMEとして登録しています。

注意点として、DNSレコード登録直後は証明書発行対象のFQDNが解決できない場合があります。 このためにsakuracloud_proxylb_acmeにはupdate_delay_secという項目を設けています。
これはリソース作成時に指定秒数待つための項目です。手元の環境では120秒くらいに設定すると上手くいっていました。

終わりに

TerraformからLet's Encryptの設定〜設定を行うためのレコードの登録まで一括して行えるのは非常に楽だと思います。
ぜひご活用ください。

以上です。