Workload Identityを用いてAKSクラスタからGoogle Cloudへアクセスする

2022年5月13日掲載

キービジュアル

こんにちは!クラウドエンジニアリング本部の三改木 裕矢(@_uya116)です。

先日業務で Google Workload Identity 連携を用いて AKS (Azure Kubernetes Service) クラスタ内の Pod から Google Cloud (GCP)  へのアクセスを検証したのですが、ハマりどころが多く苦戦したので、その設定方法についてこの記事にまとめておきます。

目次

  • 本記事では Azure AKS クラスタ内のアプリケーション Pod から Google Cloud (GCP) へアクセスする方法を説明します。
  • Google Workload Identity 連携の前提知識があると読みやすい内容になっています。

AKS Pod から Google Cloud へのアクセスフロー

まず、Azure AKS クラスタ内の Pod から Google Cloud API へのアクセスフローは以下のようになります。

  1. AKS Pod → Azure AD (Active Directory) アプリケーション(OIDC プロバイダ)へアクセスしトークンを取得する
  2. Azure AD アプリケーションから取得したトークンを用いて Google Cloud の Workload Identity プールにアクセスしトークンを交換する
  3. 上記で取得したトークンを用いて Google Cloud API へアクセスする

ポイントは 1 つ目の Azure AD アプリケーションからのトークン取得になります。Workload Identity が連携する OIDC プロバイダとして事前に Azure AD アプリケーションを作成しておく必要があります。

実現方法

さて、それでは Azure、Google Cloud それぞれの設定方法を説明していきます。
前節で述べた 3 段階のアクセスフローは、Workload Identity プールのプロバイダ用に生成した認証情報の構成ファイルを用いた以下の設定で実現することが可能です。

Azure 側

  1. Azure AD アプリケーションを作成する
  2. 構成ファイルを準備する
  3. 構成ファイルのパスを AKS Pod に設定する

Google Cloud 側

  1. Workload Identity プールおよびプロバイダを作成する
  2. Service Account の権限を設定する

それでは順に上記の設定について詳細を説明していきます。

[Azure] Azure AD アプリケーションを作成する

まず、OIDC プロバイダとなる Azure AD アプリケーションを作成します。Azure ポータルの場合、Azure Active Directory → アプリの登録 → 新規登録 で作成することが可能です。Azure AD アプリケーションを作成した後にアプリケーション API を公開してアプリケーション ID の URI を取得してください。後の設定にて必要になります。

azure ad application

また、AKS 内の Pod から作成した Azure AD アプリケーションへアクセスするため、AKS Pod には Azure API の実行権限が必要です。

我々のチームではマネージド ID および AAD Pod Identity を用いて Pod への権限付与を実施しておりますが Service Principal を用いた方法でも実現が可能です。

それぞれの比較は Azure テクニカルサポートチームがまとめていたこちらの記事が参考になりました。また、AAD Pod Identity の詳細についてはAAD Pod Identity のドキュメントをご参照ください。

[Azure] 構成ファイルを準備する

次に Workload Identity プールのプロバイダ用に認証情報の構成ファイルを作成します。

以下が構成ファイルの例となります。

{
  "type": "external_account",
  "audience": "//iam.googleapis.com/projects/{gc project number}/locations/global/workloadIdentityPools/{pool id}/providers/{provider id}",
  "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
  "token_url": "https://sts.googleapis.com/v1/token",
  "credential_source": {
    "url": "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource={azure ad application uri}",
    "headers": {
      "Metadata": "true"
    },
    "format": {
      "type": "json",
      "subject_token_field_name": "access_token"
    }
  },
  "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/{gc service account name}@{gc project id}.iam.gserviceaccount.com:generateAccessToken"
}

構成ファイルは Google Cloud コンソール の Workload Identity ページもしくは、gcloud iam workload-identity-pools create-cred-config コマンドで取得できます。

ここでの注意点として、いずれの方法でも取得した構成ファイルの credential_source.metadata フィールドは True となっていますが、Azure の IMDS の仕様では小文字の true を期待しているため、構成ファイルの取得後に該当部分の書き換えが必要です。

また、今回は Pod からのアクセスが目的のため、作成した構成ファイルは AKS クラスタ上に格納します。我々のチームでは Kubernetes の Secret を用いています。

[Azure] 構成ファイルのパスを AKS Pod に設定する

まず、AKSクラスタ上に準備した構成ファイルを Google Cloud API を使用する Pod にマウントします。その後、マウントした構成ファイルのパスを Pod の GOOGLE_APPLICATION_CREDENTIALS 変数に設定します。これにより Pod から Google Cloud API にアクセスする際に、自動的に指定された構成ファイルの情報に従ってトークンを取得することができます。

[Google Cloud] Workload Identity プールおよびプロバイダを作成する

さて、続いては Google Cloud 側の設定です。

まず、Google Cloud のドキュメントに従って Workload Identity プールおよびプロバイダを作成します。

workload identity

発行元の末尾には連携先の Azure テナント ID を、オーディエンスには先ほど作成した Azure AD アプリケーションの URI を設定します。

また我々のチームでは属性のマッピングにて [assertion.tid] をマップすることで Azure テナント ID に応じた権限制限を行っております。

[Google Cloud] Service Account の設定

次は Workload Identity と連携する Google Service Account の設定です。

こちらもGoogle Cloud のドキュメントに従って 連携用の Google Service Account に Workload Identity ユーザーロール(roles/iam.workloadIdentityUser)を付与します。

service account

上記画像の設定では Workload Identity プロバイダで設定した Azure テナント ID のマッピングを用いて特定のテナントからのアクセスに限り連携する Service Account の権限を借用できるようにしています。

実際に試してみる

以上の設定により AKS 内の Pod から Google Cloud API へのアクセスが可能になります。

今回は試しに以下のサンプルコードを AKS の Pod から実行し、特定の Google Cloud Storage 内のファイルリストを取得してみました。

from google.cloud import storage

storage_client = storage.Client()
for blob in storage_client.list_blobs('your-gcs-name'):
    print(blob.name)
terminal

このようにファイルリストが取得できたのでアクセス成功です。(ぼかしが多くてすみませんmm)

まとめ

本記事では AKS クラスタ内のアプリケーション Pod から Google Cloud (GCP) API へアクセスする方法を説明しました。

再掲すると、以下の設定を行うことで AKS Pod から Google Cloud API へのアクセスが可能になります。

Azure 側

  1. Azure AD アプリケーションを作成する
  2. 構成ファイルを準備する
  3. 構成ファイルのパスを AKS Pod に設定する

Google Cloud 側

  1. Workload Identity プールおよびプロバイダを作成する
  2. Service Account の権限を設定する

この記事が理解の一助になれば幸いです。また、本記事では説明していない細かい部分については公式ドキュメントを参照ください。

関連サービス

MSPサービス

MSP(Managed Service Provider)サービスは、お客さまのパブリッククラウドの導入から運用までをトータルでご提供するマネージドサービスです。

おすすめの記事

条件に該当するページがございません