GitHub Actions から OIDC 認証で各クラウドを Terraform デプロイする – Terraform Cloud 編

Microsoft Azure

今回は GitHub Actions で Terraform を実行し、その際に安全に認証できるよう OIDC 認証を利用する方法をまとめていきたいと思います。

2021 年に GitHub Actions で OIDC 認証がサポートされました。通常 GitHub Actions など外部のサービスからクラウドを操作するときは、事前に資格情報を保存しておく必要があります。しかし、OIDC 認証を使えばパスワードやシークレットといった情報を直接保存しなくて良くなります。

スポンサーリンク

OIDC 認証を利用したアーキテクチャ

具体的には、クラウド側で事前にアクセス許可を設定したロールを作成しておき、特定のリポジトリーから要求があったときのみアクセスに必要なトークンを返す動作になります。そして、GitHub Actions の環境からはそのトークンを持ってクラウド操作を試みます。

今回は GitHub Actions で Terraform を実行してクラウド リソースを操作することが目的です。Terraform Cloud 自体は OIDC に対応していないため、tfstate ファイルを保存する目的で利用しています。PR をトリガーとして、自動的に各種クラウドへの認証と Terraform 実行するワークフローを起動します。

GitHub Actions で OIDC 認証して 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] をクリックします。

GitHub Actions で OIDC 認証して Terraform を実行するアーキテクチャ

先ほど控えておいたトークンを、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

GitHub Actions から OIDC 認証で各クラウドを Terraform デプロイする - AWS 編
GitHub Actions で Terraform を実行し、AWS にリソースをデプロイします。OIDC を利用することで、GitHub 内に AWS アカウントのシークレットなどを保存しなくて良いため、セキュリティが向上します。...

GCP

GitHub Actions から OIDC 認証で各クラウドを Terraform デプロイする – GCP 編
今回は GitHub Actions から Terraform を実行し、GCP にリソースをデプロイします。OIDC 認証を用いることにより、GitHub Actions のワークフローや資格情報内にクレデンシャルを残す必要がないため、セキュリティを向上できます。必要に応じて適切な権限を付与できるので、最小権限を意識して不正なアクセスが発生した場合でも被害を抑えることができます。

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)

追記 (5/24) : Azure でも OIDC 認証での Terraform デプロイがサポート

先日 Azure も OIDC 認証できるようサポートされた AzureRM プロバイダー 3.7.0 がリリースされました。設定を試した内容は次の記事にあります!

コメント

タイトルとURLをコピーしました