ちょっと話題の記事

[アップデート]Terraform CloudがValutやAWS,Azure,Google Cloudに対してOIDCで動的なクレデンシャル生成に対応

2023.01.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

「Terraform CloudもGithub ActionsみたいにOIDCを使ってAWS認証とかできたら最高だな」

と思ったことはありません?

そんな方に朗報です。Terraform CloudがValutとクラウドプロパイダー(AWS,Azure,GCP)に対してOIDCで動的なクレデンシャル生成に対応しました。(beta版 2023/1/31時点 2023/4/9 GAになりました)

Terraform Cloud Adds Dynamic Provider Credentials for Vault and Official Cloud Providers

今回はAWSでこのアップデートの内容を試してみました。

アップデート概要

これまでは、Terraform CloudでAWS,Azure,GCPなどにリソースをデプロイする際に、静的なクレデンシャル(AWSだったら、IAMアクセスキー)が必要でした。

静的なクレデンシャルの手動ローテーションは、運用負荷やセキュリティ的なリスクがあります。

今回のアップデートでOIDCを使って、動的なクレデンシャルを生成できるようになりました。

凄くざっくりいうと、「Terraform CloudでAWS認証にIAMアクセスキーを使っていた部分を、IAMロールに置き換えられるようになった」ということです。

ちなみに、OpenID Connectの仕組みは以下の記事がわかりやすかったです。

一番分かりやすい OpenID Connect の説明 - Qiita

やってみた

以下のチュートリアルをやってみました。

Authenticate Providers with Dynamic Credentials | Terraform | HashiCorp Developer

OIDC用のIAM関連リソース作成

IDプロパイダーやIAMロールもTerraformで作成します。

コードについては、チュートリアルやGithubで見てもらった方がわかりやすいと思うので省略します。

learn-terraform-dynamic-credentials/main.tf at main · hashicorp-education/learn-terraform-dynamic-credentials

作成されるリソースは以下です。

  • Terarform Cloud用のIDプロパイダー
  • Terarform Cloudのワークスペースで使用するIAMロール

Terraform CloudがIAMロールを引き受けれるように、信頼関係を設定します。 (大文字部分は各自の環境に置き換える必要があります)

その際に、SITE_ADDRESS:subの部分でどのWorkspace・Projectで許可するという設定もできます。(最近追加されたProjectも対象になってて嬉しい)

RUN_PHASEの部分では、plan・applyといったフェーズでも許可を設定できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "OIDC_PROVIDER_ARN"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "SITE_ADDRESS:aud": "AUDIENCE_VALUE",
                    "SITE_ADDRESS:sub": "organization:ORG_NAME:project:PROJECT_NAME:workspace:WORKSPACE_NAME:run_phase:RUN_PHASE"
                }
            }
        }
    ]
}

Dynamic Credentials with the AWS Provider - Workspaces - Terraform Cloud | Terraform | HashiCorp Developer

Workspaceの作成

前の手順でTerraform Cloud用のIAMロールを作成できました。

作成したIAMロールを使って Terraform Cloud上からAWSリソースを作成できるか確認するために、Workspaceを作成します。

以下設定でWorkspaceを作成します。

チュートリアルの手順をやっている場合は、Terraform Working Directoryaws/infra に設定するのを忘れないようにしましょう。

  • Project: Default Project
  • Workspace: learn-terraform-dynamic-credentials

IAMアクセスキーを使う方法では、Workspaceの環境変数にアクセスキーとシークレットアクセスキーを登録しました。

今回はIAMロールを使って動的クレデンシャル生成するため、IAMロールのARNを登録します。

ちなみに、ApplyとPlanで異なるロールを使うこともできます。

Dynamic Credentials with the AWS Provider - Workspaces - Terraform Cloud | Terraform | HashiCorp Developer

Applyを実行してみる

Applyも問題なく成功しています。

Tips: TerraformでWorkspaceと一緒にOIDC用のリソースを作成

「OIDC用のIAMリソース作成・Workspaceに環境変数として設定」を毎回行うのは少し面倒なので、一連の作業をTerraformで自動化したくなるとお思います。

そんな時には、以下のサンプルコードが参考になります。

hashicorp/terraform-dynamic-credentials-setup-examples: Example code for bootstrapping trust between Terraform Cloud and cloud providers in order to use TFC's Workload Identity

サンプルコードには、以下の内容が含まれています。

  • OIDC用のリソース作成
  • Terraform CloudのWorkspace作成
  • Workspaceの環境変数に認証に必要な値を設定

おわりに

Terraform Cloudで動的なクレデンシャル作成が可能になったアップデートでした。

永続的なクレデンシャル管理の必要がなくなって、Terraform Cloudの運用負荷が下がる嬉しいアップデートでした。

以上、AWS事業本部の佐藤(@chari7311)でした。

参考