Terraformのメモ

zipファイルをダウンロードしてインストール

terraformは各ディストリビュータからパッケージが出ている。 Install | Terraform | HashiCorp Developer

Ubuntuのインストール方法としては下記。

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

ただ ubuntu:24.04 のコンテナイメージだと lsb_release でエラーというか余計な行が出力されているようだ。

$ lsb_release -cs
No LSB modules are available.
noble

No LSB modules are available. と出力されている。 aptで管理するメリットとしては、apt upgradeした際にパッケージアップデートできる点があると思う。 ただ私は定期的にCUI用のコンテナイメージを更新しているので、このメリットはあまり無い。

このためアーカイブからダウンロードしてインストールする。 下記のURLから対象プラットフォームのzipファイルをダウンロード。 Install | Terraform | HashiCorp Developer unzipで展開するとカレントディレクトリにterraformのバイナリができるので、/usr/local/binにコピーした。

Gentooでのterraformインストール

マスクされているので解除する

!!! All ebuilds that could satisfy "app-admin/terraform" have been masked.
!!! One of the following masked packages is required to complete your reque
st:
- app-admin/terraform-1.7.5::gentoo (masked by: BUSL-1.1 license(s), ~arm64
 keyword)
A copy of the 'BUSL-1.1' license is located at '/var/db/repos/gentoo/licens
es/BUSL-1.1'.

- app-admin/terraform-1.7.2::gentoo (masked by: BUSL-1.1 license(s), ~arm64
 keyword)

For more information, see the MASKED PACKAGES section in the emerge
man page or refer to the Gentoo Handbook.

BUSL-1.1 ライセンスに同意する必要がある

/etc/portage/package.license に下記追加

app-admin/terraform BUSL-1.1

/etc/portage/package.accept_keywords に下記追加

app-admin/terraform ~arm64

インストール

sudo emerge -av app-admin/terraform

エラー集

TLS 証明書の検証が失敗している

kubernetes_job.example: Creating...
╷
│ Error: Failed to create Job! API error: Post "https://127.0.0.1:6443/apis
/batch/v1/namespaces/default/jobs": tls: failed to verify certificate: x509
: certificate signed by unknown authority
│
│   with kubernetes_job.example,
│   on main.tf line 1, in resource "kubernetes_job" "example":
│    1: resource "kubernetes_job" "example" {

3つのアプローチがありそう

Kubernetes プロバイダの設定変更

Terraform の Kubernetes プロバイダ設定で insecure オプションを使って、証明書の検証をスキップする方法。 ただし、これはセキュリティ上のリスクを伴うため、本番環境では推奨されない。 テストや開発環境での一時的な解決策として使用できる。

参考 Docs overview | hashicorp/kubernetes | Terraform | Terraform Registry

provider "kubernetes" {
  config_path    = "~/.kube/config"
  load_config_file = true
  insecure = true
}

CA 証明書を信頼する

k3s クラスターで使用されている CA (認証局) 証明書を信頼する設定を追加する方法です。 kubeconfig ファイルに certificate-authority-data が含まれているか確認し、その証明書が正しくシステムにインストールされているかを確認。 システムの信頼された証明書ストアに CA 証明書を追加することも一つの方法らしい。

証明書のパスを明示的に指定

kubeconfig ファイルに記載されている証明書のパスを直接 Terraform に指定する方法です。 これには client_certificate, client_key, および cluster_ca_certificate パラメータを使用。

k3sの場合、証明書は /var/lib/rancher/k3s/server/tls/ にあるので、 ~/.kube 配下にコピーする。 その上でprovider.tfを下記のように記述

provider "kubernetes" {
  config_path = "~/.kube/config"

  client_certificate     = file("~/.kube/client-cert.pem")
  client_key             = file("~/.kube/client-key.pem")
  cluster_ca_certificate = file("~/.kube/server-ca.crt")
}

curlで証明書を用いて接続できるか確認する

curl --cacert ~/.kube/server-ca.crt https://127.0.0.1:6443

私はself-signed certificateで駄目だった(オレオレ証明書はNG)

curl: (60) SSL certificate problem: self-signed certificate in certificate chain
More details here: https://curl.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

証明書を登録する。

Linuxシステムで使える証明書アップデートツールに update-ca-certificates がある。 Gentooの場合、update-ca-certificates が参照する証明書のディレクトリが異なる可能性があるので man update-ca-certificates でコマンドが参照するパスを確認する。

sudo mkdir -p /usr/local/share/ca-certificates/
sudo cp ~/.kube/server-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

再度確認。update-ca-certificates でOSに証明書を登録したので証明書を使わなくてもアクセスできる

curl --cacert ~/.kube/server-ca.crt https://127.0.0.1:6443

ジョブの確認 kubectl get jobs

ログ確認 kubectl logs jobs/example-job