🫠

Terraform CloudにおけるAWS OIDC認証の実装Tips

2023/07/20に公開

はじめに

本記事では、Terraform Cloud(以下、「TFC」とする)を使用してAWSにプロビジョニングする際にOIDC認証を利用する方法を紹介します。

2023年1月にHashiCorpより、TFCが各種クラウドプロバイダーへのOIDC認証へ対応した旨のアナウンスがありました。
Terraform Cloud Adds Dynamic Provider Credentials for Vault and Official Cloud Providers

従来、Terraformから各種クラウドにプロビジョニングする際にはWorkspaceのVariablesにシークレットを設定する必要があります。


AWSのアクセスキーおよびシークレットキーを環境変数として設定

上記アップデートにより、あらかじめTFCとAWSに信頼関係を設定していれば、OIDC認証を利用すること、およびIAM RoleのArnの指定のみでプロビジョニングを行うことができ、シークレットの運用から解放されます。


AWS OIDC認証を利用する場合の環境変数の設定

OIDC認証の実装方法は、HashiCorpから公式チュートリアルが公開されています。
Authenticate Providers with Dynamic Credentials

下記では実際にチュートリアルに基づき実施した手順といくつかの工夫点を紹介しています。

概要

  1. 環境準備
  2. 信頼関係の設定
  3. OIDC認証を利用したプロビジョニング

1. 環境準備

チュートリアルは下記環境で実施しました。

2. 信頼関係の設定

まず、TFCがAWSのOIDC認証を利用できるように信頼関係を設定します。
公式チュートリアルでは、下記リポジトリ配下のtfファイル群をapplyすることで設定できます。
learn-terraform-dynamic-credentials/aws/trust/

上記リポジトリのmain.tfファイルについて解説します。

下記コードではOIDC設定を行うリソースを作成しています。'tls_certificate'でTerraform Cloudの公開証明書を取得し、'aws_iam_openid_connect_provider'で証明書の情報を設定しています。

https://github.com/hashicorp-education/learn-terraform-dynamic-credentials/blob/7353d7d747c53eeeb4bfa9542193636c684b4b46/aws/trust/main.tf#L8-L16

また、'aws_iam_role'でTFCのためのIAM Roleを作成し、フェデレーショントークンを経由してAWSにアクセスできるようにしています。Condition句では、このIAM Roleを利用できるTFCを制限しています。

https://github.com/hashicorp-education/learn-terraform-dynamic-credentials/blob/7353d7d747c53eeeb4bfa9542193636c684b4b46/aws/trust/main.tf#L18-L43

'aws_iam_policy'でTFCがAWS上で実行可能な権限を定義しています。

https://github.com/hashicorp-education/learn-terraform-dynamic-credentials/blob/7353d7d747c53eeeb4bfa9542193636c684b4b46/aws/trust/main.tf#L45-L63

信頼関係の設定が完了するとAWSコンソールからIAMのIDプロバイダにTFCが登録されていることを確認できます。

また、apply実行後に出力される'role_arn'の値を控えます。

3. OIDC認証を利用したプロビジョニング

TFCでAWSのOIDC認証を利用してプロビジョニングする際には、下記2つのEnvironment Variableを設定します。

Key Value Sensitive
TFC_AWS_PROVIDER_AUTH true No
TFC_AWS_RUN_ROLE_ARN 前期手順で出力された'role_arn'の値 No


実際のTFCのWorkspace Variable設定画面

applyを実行し任意のクラウドリソースを作成します。

おわりに

AWS OIDC認証を利用することでTFCのWorkspaceにプロバイダのシークレットを管理することなくプロビジョニングを実施でき、よりセキュアかつ低コストなクラウド運用を実現できます。

Discussion