普段プライベートでは Terraform Cloud は Azure のリソース(このブログの Static Apps や自宅ラボと連携しているサービス)を管理するために使ってます。
最近 Terraform Cloud を触る、というかドキュメントを読み漁る機会があって、この機会に Terraform Cloud Operator for Kubernetes を自宅ラボに入れてみるかぁ、となったのでやってみました。
ちなみに最近アップデートされた v2 のほうです。
Terraform Cloud Operator for Kubernetes は長すぎるので、以降 TFC Operator と記載します。
TFC Operator は何ができるの?
TFC Operator はカスタムリソースを使って Terarform Cloud のワークスペースやモジュール、そしてエージェントプールを Kubernetes のリソースとして管理することができます。
特にエージェントプールの管理では Terraform Cloud エージェント自体も Pod として起動してくれます。
ワークスペースやモジュールについては Kubernetes リソースとして管理したくなる場面を想像できてませんが、エージェントプールに関しては簡単にエージェントを用意できるので魅力かと思います。
Terraform Cloud エージェントを使うことで Terraform Cloud から直接アクセスできない環境に対してもエージェント経由で構成管理が可能となります。
自宅ラボに Proxmox VE が残っていたら Terraform Cloud エージェントを使って色々できたかもですが今は残ってないのでね……。
インストール
TFC Operator は Helm でインストールできます。
Terraform 公式のチュートリアルだと Helm でのインストールも Terraform でやる手順になっていてさすがにそれは……ということで、内容はチュートリアル通りにして作業自体は普通のやり方でインストールしました。
はじめに、TFC Operator をインストールする名前空間 tfc-operator-system
と、TFC Operator がウォッチする名前空間 edu
を作成します。
kubectl create ns tfc-operator-system
kubectl create ns edu
次に、TFC Operator が Terraform Cloud にアクセスする際に使用するトークンを Secret リソースとして作成します。 このトークンは Terraform Cloud の [Organization Settings] → [Teams] → [Team API Token] から取得します。
今回は直接 Secret リソースを作成していますが、Vault と連携させるのがよさそうです。 このトークンって裏で HCP Vault と連携できたりしないんですかね?
kubectl create secret generic terraformrc -n edu \
--from-literal=token=<Team API Token>
Helm を使って TFC Operator をインストールします。
operator.watchedNamespaces
で TFC Operator がウォッチする名前空間を指定します。
helm install terraform-operator hashicorp/terraform-cloud-operator \
-n tfc-operator-system \
--set operator.watchedNamespaces={edu}
トークン周りがうまく設定できていれば tfc-operator-system
名前空間に Pods が動いているはずです。
TFC Operator のインストールは以上、簡単ですね。
エージェントプールの作成
それでは TFC Operator が管理するリソースの一つ、エージェントプールを作成してみましょう。
とは言っても AgentPool
カスタムリソースをデプロイするだけです。
apiVersion: app.terraform.io/v1alpha2
kind: AgentPool
metadata:
name: homelab
namespace: edu
spec:
organization: nnstt1
token:
secretKeyRef:
name: terraformrc
key: token
name: homelab
agentTokens:
- name: tfc-operator-token
agentDeployment:
replicas: 1
spec:
containers:
- name: tfc-agent
image: "hashicorp/tfc-agent:1.14.1"
ぱっと見て何を示しているかは分かるかと思いますが、spec.agentTokens
は説明しておくと、Terraform Cloud エージェントが Terraform Cloud エージェントプールにアクセスするために使用するトークンで、TFC Operator が Terraform Cloud にアクセスする際に使用するトークンとは異なります。
このトークンは TFC Operator によってエージェントプール上で作成され、その値は Secret リソースとして格納され、Terraform Cloud エージェントから参照されます。
AgentPool
リソースをデプロイすると edu
名前空間にTerraform Cloud エージェントの Pod が起動してきます。
Terraform Cloud のエージェントプールを確認するとマニフェストで指定した homelab
という名前のエージェントプールが作成されていました。
エージェントを使う
それでは TFC Operator で作成したエージェントを使ってみます。
TFC Operator でワークスペースの管理もできるのですが、今回は既存のワークスペースの実行モードを手動で [Agent] に変更しました。
この状態で実行タイプ [Plan only] で実行します。 リソースに変更がないため今回は差分は発生しませんでした。
Kubernetes 上の Terraform Cloud エージェントを見てみると、しっかりと実行されたログが記録されていました。
Apply まで実行していませんが、Terraform Cloud から自宅ラボの Terraform Cloud エージェントを起動することができました。
まとめ
TFC Operator こと Terraform Cloud Operator for Kubernetes を使うことで簡単に Terraform Cloud エージェントとエージェントプールを用意することできました。
自宅ラボでの用途はないですが、盆栽なのでいいよね?
AKS でもアドオンとして登場してくれたら嬉しいなぁ。