🫠

Terraform の google_service_account リソースから OAuth2 Client ID を取得する方法

2024/11/12に公開

超小ネタなのですが色々 Document を探しても見つけられなかった内容だったので誰かの役に立てばと思い Zenn の記事として残します。

背景

Google Cloud 上から AWS 上のリソースにアクセスしたい要件が出てきたので

  • Google Cloud に専用の Service Account を作成する
  • AWS に必要な権限を付与した IAM Role を作成する
  • Service Account の Identity Token を発行して AWS STS に与え AssumeRoleWithWebIdentity で Assume Role を権限を一時的に取得して操作する

ということをしようとしていました。

このとき IAM Role は Terraform で以下のような定義になるかと思います。

resource "aws_iam_role" "assumable_role" {
  name               = "assumable-role"
  assume_role_policy = data.aws_iam_policy_document.trust_policy.json
}

data "aws_iam_policy_document" "trust_policy" {
  statement {
    effect = "Allow"
    actions = [
      "sts:AssumeRoleWithWebIdentity",
    ]
    principals {
      type        = "Federated"
      identifiers = ["accounts.google.com"]
    }
    condition {
      test     = "StringEquals"
      variable = "accounts.google.com:aud"
      values   = ["<Service Account に対応する OAuth2 Client ID>"]
    }
  }
}

上記の通り信頼ポリシーの trust_policy.statement.condition.values には Service Account に対応する OAuth2 Client ID を指定することになるのですがこの値をどこからとってくるのか?と疑問を持ったのでした。

手動で設定を行っている例はすぐ見つかって Google Cloud コンソールの Service Account 画面に「OAuth 2 Client ID」というそのままの値が表示されておりそこからコピー&ペーストすればよいということは分かりました。

でもせっかく Terraform でリソースを管理しているのでリソースの Attribute から取得したくなってくるのが心情というモノです。ではどの Attrbute を使えば良いのでしょうか?

結論

前置きが長くなりましたが結論としては unique_id の値が OAuth2 Client ID の値となっておりこの Attribute から欲しかった値を取得することができます。

なので以下のように書けば良いことになります。

resource "google_service_account" "service_account" {
  account_id   = "service-account"
}

resource "aws_iam_role" "assumable_role" {
  name               = "assumable-role"
  assume_role_policy = data.aws_iam_policy_document.trust_policy.json
}

data "aws_iam_policy_document" "trust_policy" {
  statement {
    effect = "Allow"
    actions = [
      "sts:AssumeRoleWithWebIdentity",
    ]
    principals {
      type        = "Federated"
      identifiers = ["accounts.google.com"]
    }
    condition {
      test     = "StringEquals"
      variable = "accounts.google.com:aud"
      values   = [google_service_account.service_account.unique_id]
    }
  }
}

本当に些細なことなのですが公式 Document にも記載がなく散々 Web の海で情報を探した結果, 実際の値を見て同一の値になっていることに気づいたというものだったのであえて記事にしました。誰かのお役に立てれば幸いです。

Discussion