Terraformからウェブアクセラレータの証明書を管理する

Terraformからウェブアクセラレータを参照/一部の操作ができるように

Terraformのさくらのクラウドプロバイダー v1.18.1からウェブアクセラレータ向けのリソースが追加されました。

github.com

sakuracloud_webaccelデータソース

サイト情報を参照するためのものです。
名前 or ドメインを指定して対象サイトの情報を参照できます。

以下のようなtfファイルで利用します。

data sakuracloud_webaccel "example" {
  domain = "www.example.com"
  # または
  # name = "example"
}

以下のような情報が参照可能です。

$ terraform show
data "sakuracloud_webaccel" "example" {
    cname_record_value = "xxxxxx.user.webaccel.jp."
    domain             = "www.example.com"
    domain_type        = "own_domain"
    has_certificate    = true
    id                 = "xxx"
    name               = "example"
    origin             = "192.0.2.1"
    site_id            = "xxx"
    status             = "enabled"
    subdomain          = "xxxxx.user.webaccel.jp"
    txt_record_value   = "webaccel=xxxxx.user.webaccel.jp"
}

利用例: サイト有効化に必要なDNSレコードの登録

ウェブアクセラレータでは独自ドメイン利用時にCNAMEまたはTXTレコードの設定が必要になります。
このデータソースはそのための値を持っており、以下のようにすることでレコードの登録が簡単に行えます。

data sakuracloud_webaccel "example" {
  domain = "www.example.com"
}

data sakuracloud_dns "zone" {
  name_selectors = ["example.com"]
}

# webaccelデータソースの値を参照してDNSレコード登録
resource "sakuracloud_dns_record" "webaccel" {
  dns_id = sakuracloud_dns.zone.id
  name   = "www"
  type   = "CNAME"
  value  = data.sakuracloud_webaccel.example.cname_record_value
}

証明書の登録/更新が行えるsakuracloud_webaccel_certificateリソース

以下のようなコードで証明書の登録/更新が行えるようになりました。

data sakuracloud_webaccel "site" {
  name = "example"
}

resource sakuracloud_webaccel_certificate "example" {
  site_id           = data.sakuracloud_webaccel.site.id
  certificate_chain = file("crt")
  private_key       = file("key")
}

応用例: TerraformのACMEプロバイダーと組み合わせる

ウェブアクセラレータに登録する証明書をTerraformのACMEプロバイダーを用いてLet's Encryptで取得してみます。

www.terraform.io

今回はDNSを用いて取得します。ACMEプロバイダーではDNSプロバイダーとしてさくらのクラウドDNSがサポートされていますのでこちらを利用します。

www.terraform.io

コードは以下のようになります。

data sakuracloud_webaccel "site" {
  name = "example"
}

resource sakuracloud_webaccel_certificate "foobar" {
  site_id           = data.sakuracloud_webaccel.site.id
  certificate_chain = "${acme_certificate.cert.certificate_pem}${acme_certificate.cert.issuer_pem}"
  private_key       = acme_certificate.cert.private_key_pem
}

provider "acme" {
  # レートリミットに注意
  server_url = "https://acme-v02.api.letsencrypt.org/directory"
}

resource "tls_private_key" "private_key" {
  algorithm = "RSA"
}

resource "acme_registration" "reg" {
  account_key_pem = "${tls_private_key.private_key.private_key_pem}"
  email_address   = "nobody@example.com" #自分のメールアドレスに置き換える
}

resource "acme_certificate" "cert" {
  account_key_pem           = "${acme_registration.reg.account_key_pem}"
  common_name               = "www.example.com"    # 任意のドメインに変更
  subject_alternative_names = ["www2.example.com"] # 任意のドメインに変更

  dns_challenge {
    provider = "sakuracloud"
    config = {
      # APIキーを環境変数から指定する場合は以下2つの指定は不要
      #      SAKURACLOUD_ACCESS_TOKEN = "APIトークン"
      #      SAKURACLOUD_ACCESS_TOKEN_SECRET = "APIシークレット"
      SAKURACLOUD_PROPAGATION_TIMEOUT = "300"
    }
  }
}

あとは定期的にterraform applyするようにすれば良いでしょう。

終わりに

ぜひご利用ください!