【エラー解決】Terraform CloudとGCP Workload Identity 連携エラーを解決する

今回は自信が経験したエラーを共有します。
2024.01.22

Workload Identityとは

外部ワークロードのための ID 連携の概要について説明します。ID 連携を使用することで、サービス アカウント キーを使用せずに、Google Cloud リソースへのアクセス権を、オンプレミスまたはマルチクラウドのワークロードに付与できます。
ID 連携は、アマゾン ウェブ サービス(AWS)や、OpenID Connect(OIDC)をサポートする任意の ID プロバイダ(IdP)(Microsoft Azure など)、SAML 2.0 で使用できます。

本来、Google Cloud(GCP)のサービスアカウントを使用して、認証する場合、Jsonファイル形式のキーをコンソールからダウンロードし、そのキーを認証情報として使用します。

ただし、この方式は推奨されておらず、Terraform Cloud(TFC)やAWS、Azureなどの外部プロバイダーと連携する場合には、Workload Identity Federationの仕組みを使用して、認証を行うことが推奨されています。

キーを利用する場合では、セキュリティ的なリスクになりかねないという理由が大きでしょう。(キーが盗まれれば操作されてしまう)

今回は、TFCとの連携の途中で詰まったエラーの解決方法について解説していきます。

今回のエラー

Planのエラー

TFC内でPlanの実行をテストした所、下記のようなエラーが出てしまいました。

【エラー内容】

(※プロジェクトIDは念の為マスクしています)

下記のように、invalid_targetというエラーが含まれており、The target service indicated by the "audience" parameters is invalidは、指定されたaudienceパラメーターによるターゲットのサービスが無効であることを示しています。

アクセスしようとしているリソースが存在しない、削除されている、またはプールやプロバイダが有効でないことを意味していると思われます。

{"error":"invalid_target","error_description":"The target service indicated by the \"audience\" parameters is invalid. This might either be because the pool or provider is disabled or deleted or because it doesn't exist."}

Applyのエラー

次に、Planの実行はできたが、Applyの実行ができませんでした。
社内でも相談したところ、GCP環境の読み取りは成功しているが、リソースの作成の実行が失敗していると推測しました。

【エラー内容】

(※プロジェクトIDは念の為マスクしています)

このエラーを見ると、アクセストークンを生成する過程で失敗しています。

さらに、エラーコードはinvalid_grantであり(エラー①とは異なる)、ターゲット無効で、audienceパラメータ無効ということがわかります。

credential’s issuerの部分では、認証情報発行者に接続することができなかった可能性があり、クレデンシャルが適切でない、あるいは有効期限が切れているか、設定が間違っている可能性があることを示しています。

{“error”:“invalid_grant”,“error_description”:“Error connecting to the given credential’s issuer.“}

解決方法

Planエラーの解決

TFC内での設定のミスが原因でした。

Variablesを登録する時に、TFC_GCP_WORKLOAD_PROVIDER_NAMEをキーとして登録します。

この値の形式の正しい記述は下記のようになります。
projects/プロジェクトNumber/locations/global/workloadIdentityPools/プールID/providers/プロバイダーID

私の場合、プロジェクトNumberの箇所が、プロジェクトIDとして登録してしまっていたため、このようなエラーが出ていたようです。

プロジェクトNumberの確認は、下記のGoogle Cloud コンソールのトップページから確認できます。
https://console.cloud.google.com/

Applyエラーの解決

Google Cloud内での設定のミスが原因でした。

プロバイダを作成する時に、発行元のURLを指定するのですが(今回はTFC)、ここのURLの値が若干違っていました。
変更前:https://app/terraform/io → 変更後:https://app.terraform.io

再度、発行元(URL)の値を確認する事で、エラーの解決につながるかもしれません。

その他エラー解決で試したこと

上記のエラー解説策含め、確認した事をまとめます。少しでも参考になれば幸いです。

  • サービスアカウントの認証情報が有効であることを確認する(無効化されていないか)
  • サービスアカウントに必要な権限(compute.networks.createなどのそのリソースの操作権限)があることを確認する
  • TFC内で必要なVariableが揃っているかを確認する
  • TFC内のVariableのキーと値が正しく記載されているかを確認する
  • Google Cloud内で設定したプールのマッピングが正しいか確認する
  • Google Cloud内で設定したCEL式の条件と操作するTFCのアカウントがマッチしているか確認する(CELの条件式とマッチしていなければ、認証エラーで弾かれます )

まとめ

案外、灯台下暗し的な部分でのエラーがありますので、細かい値までチェックを重ねる事が重要だと改めて感じました。

今後は、Terraform CloudとGCP Workload Identity 連携方法について解説できればと思います。

ダイエットな余談

筋トレで消費するカロリーは意外と少ない

元トレーナーなので、趣味でダイエットな余談を共有します。

ダイエット=筋トレ、そのように聞くことが多いと思います。
ただし、これは筋トレの消費カロリーで直接的に脂肪が減少するというよりかは、間接的な効果になります。

これは筋トレは短時間であるということ、エネルギーの使い方による結果です。
およそ1階の筋トレで、消費できるカロリーは、およそ100キロカロリー前後かと思います。(体重などにより変動する)

もちろん人により変わりますが、基本的に長時間できるマラソンや水泳などの有酸素運動の方が直接的な体脂肪減少には効果的です。

長期的に見て、健康的に痩せたい体をかっこよくしながら痩せたい、そういった美容系のニーズと合わせるのであれば、筋トレはとても効果的だと思います。

また、筋トレを主運動として、さらに体脂肪減少に有酸素運動を使用する、こういった方法はボディーメイク界隈でもベターな方法です。

筋トレは、筋肉を増やすことにより、日常の基礎代謝活動代謝を上げることで、体脂肪減少に寄与します。

今回はあまり詳しく触れませんが、筋トレによる無酸素運動の効果とマラソンなどによる有酸素運動の効果、この2つの原理を理解して、ダイエットをすることが効率的な体脂肪減少につながります。