今回は GitHub Actions で Terraform を実行し、その際に安全に認証できるよう OIDC 認証を利用する方法をまとめていきたいと思います。
2021 年に GitHub Actions で OIDC 認証がサポートされました。通常 GitHub Actions など外部のサービスからクラウドを操作するときは、事前に資格情報を保存しておく必要があります。しかし、OIDC 認証を使えばパスワードやシークレットといった情報を直接保存しなくて良くなります。
OIDC 認証を利用したアーキテクチャ
具体的には、クラウド側で事前にアクセス許可を設定したロールを作成しておき、特定のリポジトリーから要求があったときのみアクセスに必要なトークンを返す動作になります。そして、GitHub Actions の環境からはそのトークンを持ってクラウド操作を試みます。
今回は GitHub Actions で Terraform を実行してクラウド リソースを操作することが目的です。Terraform Cloud 自体は OIDC に対応していないため、tfstate ファイルを保存する目的で利用しています。PR をトリガーとして、自動的に各種クラウドへの認証と Terraform 実行するワークフローを起動します。
GitHub リポジトリーを作成
GitHub で Terraform コードを管理するリポジトリーを作成します。プライベート リポジトリーでも可能なので、好きな公開設定にします。
Terraform Cloud ワークスペースの作成
tfstate ファイルの保存先として Terraform Cloud を利用します。本当は Terraform Cloud で OIDC 認証して実行したかったのですが、現時点では対応していないため tfstate ファイルの保存のみで、実行は GitHub Actions で行います。
Terraform Cloud は Terraform をクラウド サービスとして利用できる SaaS です。特定のリポジトリーと連携して、自動デプロイすることもできます。無料版でも 5 ユーザーまで共有して利用できるらしいです。
Terraform | HashiCorp Cloud Platform
初めて利用する場合は Organization を作成しておきます。
GitHub リポジトリーと連携するワークスペースを作成します。ワークスペースの一覧から [New workspace] をクリックします。
GitHub Actions からのリクエストをもとにトリガーするので、[API-driven workflow] を選択します。ワークスペースの名前と説明を指定して作成します。
ワークスペースができたら、Terraform にアクセスするためのトークンを作成します。[Settings]>[Tokens] を開き、[Create an API token] をクリックします。
トークンの説明を記載して [Create API token] をクリックします。
表示されたトークンをコピーして控えておきます。このトークンは再度表示できないのでご注意ください。
また、今回は GitHub Actions で取得した資格情報を使い、GitHub Actions 側で Terraform を実行するので、ローカル (アクセス元側) で実行するよう設定しておきます。
[Settings]>[General] を開き、[Execution Mode] で [Local] を選択し、[Save Setting] をクリックして保存します。
Terraform Cloud での手順は以上です。
GitHub Actions の構成
再び GitHub リポジトリーに戻り、GitHub Actions で Terraform を実行するための構成を行います。
まず、Terraform Cloud 用の API トークンをシークレットとして保存します。[Settings]>[Secrets]>[Actions] を開き、[New repository secret] をクリックします。
先ほど控えておいたトークンを、TF_API_TOKEN
という名前でシークレットとして保存します。
次に、GitHub Actions で Terraform をトリガーするための構成を行います。
[Actions] を開き、[Terraform] の [Configure] をクリックします。
自動で設定ファイルが準備されるので、[Start commit] をクリックします。
これで自動的に .github/workflow
ディレクトリ配下に、terraform.yml
が作成されます。
あとはこのワークフロー ファイルと、連携先のクラウドで認証の設定を行なっていきます。それぞれのクラウドでの設定方法については後述します。
Terraform ファイルでの指定
Terraform Cloud と連携できるよう、Terraform ファイル内で次のように指定します。organization
とワークスペースの name
は適宜環境に合わせて変更してください。
terraform {
required_version = ">= 0.11.0"
cloud {
organization = "Ether-Zone"
workspaces {
name = "snylab-terraform-cloud"
}
}
}
各クラウドでの設定
主要クラウドについては次の記事で設定方法を記載します。
AWS
GCP
Azure
Azure では OIDC 認証した資格情報を持って Terraform デプロイすることはまだできないようでした。
GitHub Actions での OIDC 認証には対応していますが、Terraform 側で Azure CLI 経由での認証をサービス プリンシパルで行うとその資格情報を利用することができませんでした。
Authenticating via the Azure CLI is only supported when using a User Account. If you’re using a Service Principal (for example via
az login --service-principal
) you should instead authenticate via the Service Principal directly (either using a Client Secret or a Client Certificate).Azure Provider: Authenticating via the Azure CLI | Guides | hashicorp/azurerm | Terraform Registry
この Issue はすでに上がっており、今後の対応が話し合われているようです。こちらをウォッチしながら、OIDC を活用できる方法がないかも探していきます。
New Authentication Method: OIDC · Issue #91 · hashicorp/go-azure-helpers (github.com)
コメント