😎

Terraform Cloud Agentsを試してみる

2023/03/17に公開

本記事のレベル感

Terraform Cloudをすでにご利用の方向けの内容になります。

はじめに

Terraform CloudはOSSのTerraformの最適なワークフローを提供してくれるSaaSサービスです。

OSS Terraformでは terraform コマンドを使って手元の端末からそれぞれのクラウドにアクセスしに行くことになりますが、Terraform CloudRemote実行をサポートしており、必要に応じてTerraformの実行元をTerraform Cloudにすることができます。

そこで困るのがインターネットからオンプレのリソースをプロビジョニングしたいようなときです。

そんなお悩みを解決してくれるのがTerraform Cloud Agentsになります。
ポイントは、Terraform Cloud AgentsからTerraform Cloud本体への外向きの通信だけでオンプレのプロビジョニングが可能になることです。

本記事では、Terraform Cloudからのオンプレプロビジョニングを、Docker providerを使って簡単に試してみます。

Step 1. Terraform Cloud Agentの準備 - Terraform Cloud側の作業

まずは、Terraform CloudでAgent Poolを作成します。Terraform Cloudでは、同じ役割をもったAgentをAgent Poolにまとめて管理します。
[Organization Settings] > [Agents] > [Create an agent pool]

次に、AgentからTerraform Cloudにアクセスするためのトークンを作成します。

トークンを生成すると、その下にAgentのセットアップ方法も表示されます。

Step 2. Terraform Cloud Agentの準備 - Agent側の作業

通常不要な作業にはなりますが、ここではDocker Containerとして起動したAgentから、同じマシン上の別のDockerを操作するため、以下のような手順でAgentの起動と一部設定変更を行なっておきます。

まず、以下のようにdocker socketをマウントしてAgentを起動します。

docker run --name tfc_agent -e TFC_AGENT_TOKEN -e TFC_AGENT_NAME -v /var/run/docker.sock:/var/run/docker.sock hashicorp/tfc-agent:latest

さらに、コンテナが起動したのち、以下のように docker.sock の権限を変更します。
今回docker版のagentを起動していますが、このagentの中ではtfc-agentユーザーがTerraformをRunする都合で、この操作が必要になります。

# Docker Containerにアクセス
docker exec -it -u 0 tfc_agent /bin/bash
# docker.sockの権限を666に変更
chmod 666 /var/run/docker.sock
# Containerから脱出
exit

この辺りで一度Terraform CloudのAgent画面を確認すると、以下のようにAgentの情報が見えてきているかなと思います。

Step 3. 使ってみる

Terraform Cloudでワークスペースを作成し、CLI-driven Workflowを選択します。
表示されるExample codeを terraform.tf に保存しておきます。

また、デフォルトではTerraform Cloudの実行モードがRemoteになっているはずなので、これをAgentに変更し、Agent poolとして先に作成しているものを選択します。
[Workspace Settings] > [General]

編集後に[Save settings]をお忘れなく!

main.tf には、こちら
に書いてある例をそのまま使います。

terraform {
  required_providers {
    docker = {
      source = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.image_id
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}

準備ができたら terraform init && terraform apply してみましょう〜

Step 4. 結果の確認

うまく動けば、以下のように手元の端末でdockerコンテナが起動していることを確認できるはずです。

内容は以上です。
Terraform Cloudから(私の場合)手元のMacBook上にdockerコンテナを起動することができました。

"Terraform"と聞くとなんとなくAWS, Azure, Google Cloudのようなクラウドインフラのプロビジョニングのイメージを持たれる方が多いかと思いますが、Terraform Cloud Agentを使うと、こんな感じでオンプレリソースのプロビジョニングやデプロイ後のライフサイクル管理にもTerraform Cloudは使えます!というご紹介でした。

参考: https://developer.hashicorp.com/terraform/tutorials/cloud/cloud-agents

Discussion