ユースケースクラウド

(連載) HashiCorp活用例5: プライベートネットワークでのIaC

東京エレクトロンデバイスではHashiCorp社製品とその他各社製品とのマルチベンダー連携を通じて、お客様のWebアプリやクラウド、ITインフラなどの展開から運用までを効率化できるソリューション開発に取り組んでいます。さまざまな活用例をご紹介することで、HashiCorp社製品の提供する価値や可能性を発信していきたいと思っております。

はじめに

連載5記事目で取り上げるのは、プライベートネットワークでのIaC実現方法です。プライベートネットワークでTerraform Cloudを使ったIaCの実現方法と、その設定方法をご紹介します。
連載初回の記事で取り上げたユースケースに基づいて記載しておりますので、ユースケースの詳細につきましては過去の記事も併せてご参照ください。

連載記事一覧:

  1. Webアプリ用マルチベンダーインフラの自動構築
  2. 動的なバックエンドSSL証明書の管理
  3. 動的なDNSレコード管理
  4. 動的なロードバランサの構築
  5. プライベートネットワークでのIaC        ←本記事     
  6. 一連のWebアプリ用のマルチベンダーインフラ展開を効率化

プライベートネットワークでのIaC

本活用例の中で利用しているTerraform Cloudは、HashiCorp社によるフルマネージドのクラウドサービスです。クラウド上にTerraformの実行環境があるため、パブリックアクセスが可能なリソースに対してプロビジョニングが可能です。AWS / Azure / GCPほか各種クラウドのAPIエンドポイント、パブリックIPアドレスが付与されているサービスや製品各種が該当します。
対して、オンプレミスやIaaS等のパブリックアクセスを許可しないプライベートネットワーク上にあるリソースは、そのままではTerraform Cloudからプロビジョニングすることができません。
また、Terraform Cloudがプロビジョニングのためにリソースへアクセスする際に利用するパブリックIPアドレス群は公開されておらず、変更の可能性もあるため、ホワイトリストによる通信許可は非推奨です。(VCS連携など他の一部機能で使われるパブリックIPアドレスはAPIで取得可能です)

この問題を解決し、プライベートネットワークにあるリソースをTerraform Cloudでプロビジョニングするために、Terraform Cloudエージェントが提供されています。

Terraform Cloud エージェント

Terraform Cloudエージェント(以下TFCエージェント)は軽量なエージェントソフトウェアです。プロビジョニング対象にIP通信が可能なネットワークのホストやコンテナ上で動作させ、Terraform Cloudとtcp/443のアウトバウンド通信で接続を確立します。Terraform Cloudで実行されたプライベートネットワークのリソースに対するジョブを、TFCエージェントが代理でアクセスして実行します。ファイアウォールへインバウンドポリシーを設定する必要が無く、安全なプライベートネットワーク上のリソースプロビジョニングを可能にします。

TFCエージェントのセットアップ

TFCエージェントを利用するためには、以下のフローで設定を行います。

  1. Terraform Cloudの設定
    1. エージェントプールを作成
    2. エージェントトークンを生成
    3. ワークスペースの実行モードをAgentに設定し、利用するエージェントプールを指定
  2. TFCエージェントのセットアップ
    1. インストール
    2. 構成
    3. 実行

1. Terraform Cloudの設定

TFCエージェントを利用するためには、まずTerraform Cloudの設定を行います。一連の作業はTerraform Cloudのコンソール上から行うことも可能ですが、本記事ではTerraform Enterprise Providerを使ったIaCにより、Terraform CloudからTerraform Cloud自身の設定を行っていきます。

注意:エージェントトークンはシークレット(機密情報)ですので、取り扱いにご注意ください。

1.1. エージェントプールを作成

※Terraform構成ファイルの記述サンプル

resource "tfe_agent_pool" "agent_pool" {
  name         = ←エージェントプール名
  organization = ←Terraform Cloudのオーガナイゼーション名
}

1.2. エージェントトークンを生成

※Terraform構成ファイルの記述サンプル

resource "tfe_agent_token" "agent_token" {
  agent_pool_id = tfe_agent_pool.agent_pool.id    # エージェントプールのID
  description   = ←エージェントトークンに設定する説明文
}

1.3. ワークスペースの実行モードをAgentに設定し、利用するエージェントプールを指定

ここでは新規ワークスペースを作成し、設定しています。
※Terraform構成ファイルの記述サンプル

resource "tfe_workspace" "workspace" {
  name           = ←ワークスペース名
  organization   = ←Terraform Cloudのオーガナイゼーション名
  agent_pool_id  = tfe_agent_pool.agent_pool.id    # エージェントプールのID
  execution_mode = "agent"
}

2. TFCエージェントのセットアップ

Terraform Cloudの設定が完了したら、TFCエージェントのセットアップに進みます。
TFCエージェントはx86_64 Linux OS上での実行をサポートしております。システム要件はTFCエージェントを利用するワークスペースの数によって変化しますが、最低要件として4GBのストレージ空き容量と、2GBのメモリ空き容量が必要です。
その他の要件は公式ドキュメントをご参照ください。
HashiCorpドキュメント(英語): Terraform Cloud Agents – Requirements

2.1. インストール

TFCエージェントのインストールは、単一のバイナリファイルをダウンロードして配置するのみです。TFCエージェントのダウンロードページから指定のバージョンのものを選び、リンクをメモしてエージェントを実行するホストでダウンロードします。ダウンロードしたファイルはZIPファイルなので、ZIPファイルを展開するためのパッケージ(unzipなど)をあらかじめインストールしておく必要があります。

ZIPファイルとハッシュチェック用ファイル(以下はバージョン1.9.0の例)をダウンロードし、ZIPファイルのハッシュ値をチェックしてから、ZIPファイルを展開します。

$ curl https://releases.hashicorp.com/tfc-agent/1.9.0/tfc-agent_1.9.0_linux_amd64.zip
$ curl https://releases.hashicorp.com/tfc-agent/1.9.0/tfc-agent_1.9.0_SHA256SUMS
$ sha256sum -c tfc-agent_1.9.0_SHA256SUMS
$ unzip -d tfc-agent_1.9.0_linux_amd64.zip

2.2. 構成

TFCエージェントを構成します。環境変数 TFC_AGENT_TOKEN にエージェントトークン、TFC_AGENT_NAME にエージェント名を設定します。トークンはTerraform Cloudの構成の [1.2.  エージェントトークンを生成] で生成したトークンです。エージェント名は任意の名前です。

注意:エージェントトークンはシークレット(機密情報)ですので、取り扱いにご注意ください。

$ export TFC_AGENT_TOKEN=your-token
$ export TFC_AGENT_NAME=your-agent-name

2.3. 実行

TFCエージェントを起動、実行します。

$ ./tfc-agent

TFCエージェントをフォアグラウンドで実行する形になり、ログもコンソール上に標準出力として表示されます。
以上でTFCエージェントの準備は完了し、Terraform Cloudを使ったプライベートネットワークでのIaCが可能になります。

ただし、上記ではTFCエージェントプロセスがコンソールを専有してしまい、他のコマンド操作が不可能になってしまいます。そのため、TFCエージェントをバックグラウンドで実行したいという要望もあるかと思います。
バックグラウンドで実行する方法として、純粋にバックグラウンド実行にする(コマンド末尾に”&”を付ける)ことも可能ですが、他にもコンテナとして実行する、サービスとして実行する方法もあります。

コンテナでの実行方法はHashiCorp公式ドキュメントに記載されている通り、以下の方法でdockerコンテナとして実行できます。
HashiCorpドキュメント(英語): Optional Configuration: Run an Agent Using Docker | Install and Run Agents

$ docker pull hashicorp/tfc-agent:latest
$ docker run -e TFC_AGENT_TOKEN=your-token -e TFC_AGENT_NAME=your-agent-name hashicorp/tfc-agent

本記事では追加の参考例として、TFCエージェントをサービスとして常時実行にする方法も記載します。

参考情報: TFCエージェントの常時実行のためSystemdサービス化

以下はsystemdのサービスとして登録し、デーモン化する一連の手順です。

※Ubuntu向けシェルスクリプトの記述サンプル

#!/bin/bash
# 各種パッケージのアップデートとインストール
sudo apt-get clean
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get install -y unzip
# tfc-agent ユーザーを作成
sudo groupadd --system tfc-agent
sudo useradd --system -s /sbin/nologin -g tfc-agent tfc-agent
sudo mkdir /home/tfc-agent
sudo chown tfc-agent:tfc-agent /home/tfc-agent
# tfc-agentのバイナリをダウンロードして配置
curl -o /tmp/tfc-agent_1.9.0_linux_amd64.zip https://releases.hashicorp.com/tfc-agent/1.9.0/tfc-agent_1.9.0_linux_amd64.zip
curl -o /tmp/tfc-agent_1.9.0_SHA256SUMS https://releases.hashicorp.com/tfc-agent/1.9.0/tfc-agent_1.9.0_SHA256SUMS
cd /tmp
sha256sum -c tfc-agent_1.9.0_SHA256SUMS
sudo unzip -d /usr/local/bin /tmp/tfc-agent_1.9.0_linux_amd64.zip
sudo chown tfc-agent:tfc-agent /usr/local/bin/tfc-agent*
# ログディレクトリを作成、本例ではログは/var/log/hashicorpに出力する設定です
sudo mkdir /var/log/hashicorp
sudo chown tfc-agent:tfc-agent /var/log/hashicorp
# 環境変数ファイルを作成、エージェントの名前とトークンを指定
cat < ~/tfc-agent.env
TFC_AGENT_TOKEN=your-token
TFC_AGENT_NAME=your-agent-name
EOF
sudo chown tfc-agent:tfc-agent ~/tfc-agent.env
sudo mkdir /etc/tfc-agent
sudo mv ~/tfc-agent.env /etc/tfc-agent/tfc-agent.env
# Systemdユニットファイルの作成
cat < ~/tfc-agent.service
[Unit]
Description="HashiCorp Terraform Cloud Agent"
Documentation=https://www.terraform.io/cloud-docs/agents
Requires=network-online.target
After=network-online.target

[Service]
EnvironmentFile=/etc/tfc-agent/tfc-agent.env
User=tfc-agent
Group=tfc-agent
ExecStart=/usr/local/bin/tfc-agent
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGTERM
Restart=on-failure
LimitNOFILE=65536
StandardOutput=append:/var/log/hashicorp/tfc-agent.log
StandardError=append:/var/log/hashicorp/tfc-agent.log

[Install]
WantedBy=multi-user.target
EOF
chmod 664 ~/tfc-agent.service
sudo chown root:root ~/tfc-agent.service
sudo mv ~/tfc-agent.service /etc/systemd/system/tfc-agent.service
# Systemdユニットファイルの作成
sudo systemctl daemon-reload
sudo systemctl enable tfc-agent.service
sudo systemctl start tfc-agent.service

次回以降

本記事では、プライベートネットワーク上でTerraform Cloudを使ったIaCを実現するためのソフトウェアTFCエージェントについて、その実行方法までをご紹介しました。

次回は本活用例連載の最終回、これまでご紹介してきた記事の総まとめとして、一連のオペレーションを単一のterraform applyコマンドで実現するために作成したTerraform構成ファイルやテンプレートファイルなど含めて、実際に検証して動作確認ができたものをご紹介していきます。