Terraform CloudをBackendとしてのみ利用した際のGitHub ActionsでのTokenの扱い方

GitHub ActionsTerraformTerraform CloudCI/CDDevOps

はじめに

このブログサイトはCloudflare Pagesを使用してホストされています。 このCloudflare Pagesの構成管理についてはTerraformを利用しており、特定のブランチに応じてトリガーされるGitHub Actions WorkflowでTerraform PlanやApplyが実行されます。 Terraformを実行するにあたっては、Stateファイルを格納しておいたり、StateをロックするためのBackendなるコンポーネントが必要になります。 今回はBackend(のみ)をTerraform Cloudにしました。 Terraform Cloudに対するアクセスには専用のAPI Tokenが必要となります。 このAPI Tokenをどのように扱っていくのかを記載します。

API Tokenの取り扱い

Terraform CloudへアクセスするためのAPI TokenをGitHub Actionsで扱う方法を記載します。 まず、このAPI Token自体の生成方法は公式ドキュメントが参考になります。 生成されたAPI Tokenの扱い方を見ていく前に、BackendとしてTerraform Cloudを指定する方法を記述します。

Terraform CloudをBackendに指定する

通常は以下のコードのようにremoteを利用してTerraform Cloudを指定することができます。

terraform {
  backend "remote" {
    hostname     = "app.terraform.io"
    organization = "<your_organization_name>"

    workspaces {
      name = "<your_workspace_name>"
    }
  }
}

ただし、Terraform Cloud Configurationにもある通り、次のようなコードでも対応できます。 コード内にはhostnameが存在していませんが、デフォルト値としてapp.terraform.ioが設定されているため、省略しています。 Terraform Enterpriseをご契約されている場合には、適宜記載してください。

terraform {
  cloud {
    organization = "<your_organization_name>"

    workspaces {
			name = "<your_workspace_name>"
    }
  }
}

Tokenの指定方法

Terraform CloudのTokenの指定方法にはいくつかの方法があります。ひとつはterraform loginコマンドの利用です。ただし、このコマンドは対話式に実行されるため、GitHub Actionsで利用するには適当ではありません。 また、もうひとつは以下のようにcredentialsブロックを利用する方法があります。しかしながら、このTokenの値をコードとして格納しなければならないので、機密情報の取り扱いという観点では不安が残ります。

credentials "app.terraform.io" {
  token = "xxxxxx.atlasv1.zzzzzzzzzzzzz"
}

Tokenを環境変数に設定する

そこで今回は、ドキュメントにもあるようにTokenを環境変数として設定する方法を実践します。 環境変数名はTF_TOKEN_をプレフィックスとして、その後ろにドメイン名を付け加えます。 今回はapp.terraform.ioがドメイン名になるので、環境変数名はTF_TOKEN_app_terraform_ioとなります。 この環境変数にTokenの値を設定することで、Terraform Cloudへアクセスすることができます。

GitHub Actionsでの環境変数の設定

GitHub Actionsでの環境変数の設定方法自体は本ポストの内容からは若干それるので、簡単に記述していきます。 前提条件として、すでにTokenはリポジトリのSecretsにTF_API_TOKENとして格納されていることとします。 すると、環境変数を設定するコードとして次のようになります。参考までに。

jobs:
	terraform:
		env:
			TF_TOKEN_app_terraform_io: ${{ secrets.TF_API_TOKEN }}

これで設定は完了です。

さいごに

いかがでしたでしょうか。API TokenのようなCredentialの扱いには神経を使います。 そのような中で、手段のひとつとして参考になれば幸いです。