この記事はConoHa Advent Calendar 2018の21日目の記事です!
ConoHaのDNS APIは便利
という話を2年前にもしたのでした。
皆さん、ConoHaのDNS API使ってますか? Let's EncryptのDNS-01チャレンジの自動化にも使える!のでイケてますね。
APIクライアントについて
さて、ではどうやってAPIを叩くか? 先に紹介した記事の要旨は「ConoHa DNS用 APIクライアント 作った」なんですが、あまりにも使い辛いので無視します。
Designateクライントを使う
ConoHaのDNSはOpenStack Designateを使っているようです。多分。API体系がソレっぽいので。
なので、Designateのクライアントが使えるかもしれない……?(未確認)
しかし、ConoHaではdeprecatedなv1 APIのみ提供されているので、互換性の面で死ぬかもしれません。 一応v2も動いているようですが、不完全なようですし、そもそもundocumentedです。
Lexiconを使う
様々なDNSサービスを1つのCLIから使えるようにしたソフトウェアがLexiconです。
なんとConoHa DNSに対応しています!すごい!! (まぁ、ボクが使うために対応させたからなんですケド……)
便利なので使ってください。pipさえあればGetできます。 こんな具合に使えるかと思います。
$ pip install dns-lexicon
$ lexicon conoha
usage: lexicon conoha [-h] [--name NAME] [--content CONTENT] [--ttl TTL]
[--priority PRIORITY] [--identifier IDENTIFIER]
[--log_level {CRITICAL,ERROR,WARNING,INFO,DEBUG,NOTSET}]
[--output {TABLE,TABLE-NO-HEADER,JSON,QUIET}]
[--auth-region AUTH_REGION] [--auth-token AUTH_TOKEN]
[--auth-username AUTH_USERNAME]
[--auth-password AUTH_PASSWORD]
[--auth-tenant-id AUTH_TENANT_ID]
{create,list,update,delete} domain
{A,AAAA,CNAME,MX,NS,SOA,TXT,SRV,LOC}
$ lexicon conoha --auth-region tyo1 --auth-username gncu01234567 --auth-password xxxxxxxxxxx --auth-tenant-id 0123456789abcdef0123456789abcdef create narusejun.com A --name local --content 127.0.0.1
$ lexicon conoha --auth-region tyo1 --auth-username gncu01234567 --auth-password xxxxxxxxxxx --auth-tenant-id 0123456789abcdef0123456789abcdef list narusejun.com A
ID TYPE NAME CONTENT TTL
------------------------------------ ---- ------------------- --------- ----
42929801-5111-41d5-a115-9f67a1d07810 A local.narusejun.com 127.0.0.1 3600
詳しくは公式のドキュメントを読んでください。 Let's EncryptのDNS-01を自動化するやり方も紹介されていますよ!
Let's EncryptのDNS-01チャレンジを自動化する
せっかくAPIでDNSレコードを操作できるわけですし、活用したいですね!
最近ワイルドカード証明書が取れるようになったLet's Encryptと連携してみましょう。 ちなみに、ワイルドカード証明書はDNS-01チャレンジでしか取得できません!
LexiconとDehydratedを使う
先ほど紹介したlexiconと、ACMEクライアントDehydratedを組み合わせるやり方がlexiconの作者さんによって紹介されています。
Legoを使う
2つのソフトウェアを連携させるのは面倒ですし、できればパパッとコマンド1つで証明書取りたいですよね? そこで、Go製のACMEクライアントlegoを使いましょう! legoでは、いろんなDNS-Providersが提供されていて、対応しているDNSサービスならすぐに証明書を発行できます。
なんとConoHa DNSに対応しています!すごい!! (まぁ、ボクが使うために対応させたからなんですケド……)
バイナリが入手可能なほか、goがインストールされているならgo get
ですぐに入手できます。 こういう感じで使います。とっても便利ですよ!
$ go get -u github.com/xenolf/lego/cmd/lego
$ lego dnshelp
Credentials for DNS providers must be passed through environment variables.
Valid providers and their associated credential environment variables:
conoha: CONOHA_REGION, CONOHA_TENANT_ID, CONOHA_API_USERNAME, CONOHA_API_PASSWORD
Additional configuration environment variables:
conoha: CONOHA_POLLING_INTERVAL, CONOHA_PROPAGATION_TIMEOUT, CONOHA_TTL, CONOHA_HTTP_TIMEOUT
$ export CONOHA_REGION=tyo1
$ export CONOHA_TENANT_ID=0123456789abcdef0123456789abcdef
$ export CONOHA_API_USERNAME=gncu01234567
$ export CONOHA_API_PASSWORD=xxxxxxxxxxx
$ lego --dns conoha --server https://acme-staging-v02.api.letsencrypt.org/directory --email [email protected] --domains narusejun.com --domains *.narusejun.com run
2018/12/21 02:44:58 [INFO] [narusejun.com, *.narusejun.com] acme: Obtaining bundled SAN certificate
2018/12/21 02:44:59 [INFO] [*.narusejun.com] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/wcYZJB5aWmfi4WzGuwv2JlSaYjryGf67zqES8h8bmEg
2018/12/21 02:44:59 [INFO] [narusejun.com] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/gwXBvxvuHk7TrUYbuu3MWp7heVoLTTle7Nh2ng98b74
2018/12/21 02:44:59 [INFO] [narusejun.com] acme: Authorization already valid; skipping challenge
2018/12/21 02:44:59 [INFO] [narusejun.com] acme: Preparing to solve DNS-01
2018/12/21 02:45:00 [INFO] [narusejun.com] acme: Trying to solve DNS-01
2018/12/21 02:45:00 [INFO] [narusejun.com] Checking DNS record propagation using [1.0.0.1:53]
2018/12/21 02:45:00 [INFO] Wait [timeout: 1m0s, interval: 2s]
2018/12/21 02:45:37 [INFO] [narusejun.com] The server validated our request
2018/12/21 02:45:38 [INFO] [narusejun.com, *.narusejun.com] acme: Validations succeeded; requesting certificates
2018/12/21 02:45:39 [INFO] [narusejun.com] Server responded with a certificate.
$ openssl x509 -in ~/.lego/certificates/narusejun.com.crt -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
fa:78:5b:6e:73:74:37:e6:c4:36:54:82:02:04:d2:7e:bd:0b
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = Fake LE Intermediate X1
Validity
Not Before: Dec 20 16:45:40 2018 GMT
Not After : Mar 20 16:45:40 2019 GMT
Subject: CN = narusejun.com
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:*.narusejun.com, DNS:narusejun.com
……と、サクッとワイルドカード証明書が取れてしまいました。すごい!便利!
上の例はstaging環境から証明書を取得しているので、マネする際はご注意ください! 詳しくは、例によって公式ドキュメントをごらんください。
traefikを使う
traefikは強いL7ロードバランサみたいなものです(ざっくりとした説明)。 Let's Encryptから自動で証明書を取る機能がついてるんですが、この機能は内部で先述したlegoを利用しています。
……ということは、ConoHa DNSに対応しています! 詳しい説明は省きますが、公式ドキュメントを参考に設定してみてください。 ちゃんとConoHa DNSと連携して動作することを確認済みです。
おわりに
紹介したソフトウェア以外にも、LexiconやLegoを内部で使ってる系ソフトが実はConoHaに対応してるパターンがいっぱいあるかもしれません。このソフトでもConoHa DNS使えたよ!とかあったら教えてください。 ちなみに、CaddyというHTTPサーバがLegoの全DNSプロバイダに対応しそうだったりするので、そしたらConoHaも使えるようになりますね!
ConoHaのDNS、めっちゃ便利なので使いましょう。 APIでレコードいじれるし、ゾーン数がいくつあっても無料ってマジ!?神じゃん。
あっ、ボクのパソコン見てください。
このはちゃんガチ勢なのでな✋#isucon pic.twitter.com/mgIRDxO6B4
— sekai (@sekai67) October 20, 2018
さっきからずっとこのはちゃんとベタベタしてる pic.twitter.com/FyyDBpZtxe
— sekai (@sekai67) October 20, 2018
このはちゃんとツーショット撮れた!!!!嬉しい!!!!#isucon pic.twitter.com/Tb25Fr39lD
— sekai (@sekai67) October 20, 2018