最近TerraformでGCP環境を構築することをやり始めたのですが、Cloud IAP周りで地味にハマったので備忘録として残しておきます。
構成について
Cloud DNS→Cloud Load Balancing→Cloud IAP→GCEという構成になります。
Cloud IAPのTerraformコード
Hashicorp社・Terraformの公式リファレンスを参考に実装しました。
このコード以外にもOAuth2.0の
- クライアントID
- クライアントシークレット
の事前設定は別途行う必要があります。
Terraform Registry
ハマったこと①:Terraform applyを実行するとエラー(403: Permission denied)
Terraform applyを実行した際、下記エラーが発生しました。
Error retrieving IAM policy for iap webbackendservice "projects/www.googleapis.com/iap_web/compute/services/compute": googleapi: Error 403: The caller does not have permission
サービスアカウントに必要な権限が無いからという理由は分かるのですが、
- どのサービスアカウントで
- 必要な権限は何?
について、GCPやTerraformの公式Docを確認や検索したところ中々見つからず地味にハマりましたが、Terraformを実行しているサービスアカウントにIAPポリシー管理者ロールを付与することで解決しました。
ハマったこと②:バックエンドサービスにリクエストするとエラーが返ってくる(Error 400: redirect_uri_mismatch)
Cloud IAPの適用が通ったので、ブラウザでバックエンドサービスにリクエストをしたところ、下記エラーが発生しました。
Error 400: redirect_uri_mismatch The redirect URI in the request〜
OAuth2.0のクライアントID/シークレットの設定画面のリダイレクトURIの値をドメインURIで設定していましたが、どうやら違うようです。
公式Docを確認したところバックエンドサービスがGCEの場合は、リダイレクトURIの値を下記内容で設定する必要があるとのことでした。
https://iap.googleapis.com/v1/oauth/clientIds/OAuth2.0で作成したクライアントID:handleRedirect
設定後、再度ドメインURIにブラウザでアクセスしたところ、Google認証画面が表示され、認証後無事バックエンドにリクエストが通りました。
まとめ
手を動かし検証しないと絶対分からなかったと思うので、ハマってよかったなと思います。
サービスアカウントの権限系やAPI周りはハマる時地味にハマるよな〜と改めて思った次第です。
参考情報
Terraform fails to create "google_iap_web_backend_service_iam_binding" · Issue #4515 · hashicorp/terraform-provider-google
Community Note Please vote on this issue by adding a 👍 reaction to the original issue to help the community and maintainers prioritize this request Please do no...
Compute Engine の IAP の有効化 | Identity-Aware Proxy | Google Cloud