terraform Advent Calendar 2021の22日目!
今日はTerraformとConsulを組み合わせる仕組みによって自動化ができるんだよという話。
Terraformでネットワーク機器の設定!
TerraformをAWSやGCPなどクラウドプロバイダーの設定に利用している人は多いと思うが、それだけでなくネットワーク機器の設定にも利用可能だ。
たとえばCiscoはさまざまなProviderを提供しているし、F5 BIG-IPやFortinet、VMwareのNSX ALB(AVI)などもVerified Providerがある。
コンピューティングリソースだけでなくネットワークの設定もTerraformで統一できるのは結構便利だと思う。 オンプレ環境でも積極的に活用していきたい。
ちなみに自分は自宅にVMware環境があるので、vSphereもNSX ALBもTerraformで管理している。
余談だがTerraform特集も載っている今月のSoftware Designには、自宅にvSphere環境を作っていく連載企画『はじめよう、おうちクラウド』も載っているので是非読んでね(宣伝)
ネットワーク周りのあれこれを実現するConsul
HashiCorpには、Consulというプロダクトもある。
Consulでやれることは沢山あるのだが、今回の話に関係する機能が "Service Discovery" だ。
たとえばapiはどこかとconsulに問い合わせると、該当のIPが返ってくる。
Kubernetesの経験がある人だと、たとえば api
という名前のServiceを作ると、 Podから api.namespace.svc.cluster.local
を引けば該当ServiceのIPアドレスが得られることを知っているだろう。これがService Discovery。KubernetesにはService Discoveryの仕組みが含まれているのでこういうことが可能になる。これをKubernetesがない世界でも同じようなことを実現したい場合、Consulを使えばいいということになる。
Consulを利用したService Discoveryを使いたい場合、それぞれの環境にConsul Clientを設定することになるのだが、たとえばService DiscoveryではなくLoad Balancerを経由するサービスの場合どうなるか。
Load BalancerにはBackendの設定を入れておき、それを元に振り分けて貰う形になるのだが、たとえばその振り分け先情報としてConsulに登録されているアドレスを利用できれば、わざわざLBの設定を手動で変更しなくていいので便利じゃない?と。
ただ世の中のLBにはConsulの情報をそのまま利用できる仕組みは入っていない。じゃあ、Consulの値が変更されるごとにTerraformを叩いて設定を流し込むようにすればいいのでは?
ネットワーク自動化をするConsul-Terraform-Sync
ということで、ConsulとTerraformの連携を可能にするのが、Consul-Terraform-Syncだ。この連携による自動化を、 Network Infrastructure Automation(NIA)と呼んでいる。
ドキュメント: Network Infrastructure Automation | Consul by HashiCorp
仕組みとしてはこんな感じ
Consul-Terraform-Syncを立ち上げておくと、それがConsul Clientをチェックしに行き、変更があったらTerraformを叩いて対象のインフラに変更を入れてくれる。
試してみるには
Terraform Registryで "nia" でmoduleを検索すると、Consul-Terraform-Syncで使えるモジュールが色々見つかる。
また、HashiCorp LearnでもA10やPalo Alto Networks、F5 BIG-IPとの連携例がある。
このF5の例だと、環境をAWSに構築しBIG-IP Virtual Editionを自動化している。試すのにいくらか費用はかかるが、さっと立ち上げて試してすぐに消す分には少額でいけるのでCTSを試す用途としては良い。
リポジトリはこちら
GitHub - hashicorp/f5-terraform-consul-sd-webinar
このリポジトリの中で特に重要なのがこのConsul-Terraform-Syncに食わせるconfigだ。
driver "terraform" { log = true required_providers { bigip = { source = "F5Networks/bigip" } } } #log_level = "trace" consul { address = "${consul}:8500" } terraform_provider "bigip" { address = "${addr}:${port}" username = "admin" password = "${pwd}" } task { name = "AS3" description = "BIG-IP example" source = "./bigip-example" providers = ["bigip"] services = ["nginx"] }
driver blockで、このConsul-Terraform-Syncによって実行されるサブプロセスを指定する。terraform
以外に、 terraform_cloud
が指定可能になっている。
consul blockで接続しに行くconsul agentを指定。
terraform_providerは、その名の通り利用するterraform providerとパラメータを指定する。
そして重要なのがtask blockで、consulの何を元に自動化するかや、実行するterarformのコードが入ったフォルダを指定する。Consulの何をきっかけに動かすかを設定するConditionというものも設定可能で、たとえばConsul上のServiceの状態によってトリガーしたり、Consul KVの中身をみたり、あるはCron記法でスケジュール実行したりという設定が可能だ。上記の例ではデフォルト値を利用しているためconditionの設定が見当たらないが、詳しくはドキュメントを参考にすると良い。
実際に動かす場合の解説をステップバイステップで書いてもよかったが、Learnの内容と特に代わり映えしない感じになるので今回は割愛・・・Learnの通りにやってみて、良い感じにロードバランシングの設定が入ることを試して欲しい。
あと実際に動かした様子をHashiCorpのYouTubeチャンネルで公開しているので、気になる人はこちらも見てみるといいかも(録画に問題があったようでカックカク・・・)