Terraform CloudをBackendとしてのみ利用した際のGitHub ActionsでのTokenの扱い方
はじめに
このブログサイトは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の扱いには神経を使います。 そのような中で、手段のひとつとして参考になれば幸いです。