普段プライベートでは Terraform Cloud は Azure のリソース(このブログの Static Apps や自宅ラボと連携しているサービス)を管理するために使ってます。

最近 Terraform Cloud を触る、というかドキュメントを読み漁る機会があって、この機会に Terraform Cloud Operator for Kubernetes を自宅ラボに入れてみるかぁ、となったのでやってみました。

ちなみに最近アップデートされた v2 のほうです。

HCP Terraform Operator for Kubernetes | Terraform | HashiCorp Developer

The HCP Terraform Operator for Kubernetes allows you to provision infrastructure directly from the Kubernetes control plane.


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] から取得します。

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 Pod

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 エージェントから参照されます。

Terraform Cloud エージェントプールのトークン

AgentPool リソースをデプロイすると edu 名前空間にTerraform Cloud エージェントの Pod が起動してきます。

Terraform Cloud Agent Pod

Terraform Cloud のエージェントプールを確認するとマニフェストで指定した homelab という名前のエージェントプールが作成されていました。

Terraform Cloud エージェントプール

エージェントを使う

それでは TFC Operator で作成したエージェントを使ってみます。

TFC Operator でワークスペースの管理もできるのですが、今回は既存のワークスペースの実行モードを手動で [Agent] に変更しました。

ワークスペースで実行モードをエージェントに変更

この状態で実行タイプ [Plan only] で実行します。 リソースに変更がないため今回は差分は発生しませんでした。

エージェントで実行

Kubernetes 上の Terraform Cloud エージェントを見てみると、しっかりと実行されたログが記録されていました。

Terraform Cloud エージェントのログ

Apply まで実行していませんが、Terraform Cloud から自宅ラボの Terraform Cloud エージェントを起動することができました。

まとめ

TFC Operator こと Terraform Cloud Operator for Kubernetes を使うことで簡単に Terraform Cloud エージェントとエージェントプールを用意することできました。

自宅ラボでの用途はないですが、盆栽なのでいいよね?

AKS でもアドオンとして登場してくれたら嬉しいなぁ。