フォーム読み込み中
こんにちは!クラウドエンジニアリング本部の三改木 裕矢(@_uya116)です。
先日業務で Google Workload Identity 連携を用いて AKS (Azure Kubernetes Service) クラスタ内の Pod から Google Cloud (GCP) へのアクセスを検証したのですが、ハマりどころが多く苦戦したので、その設定方法についてこの記事にまとめておきます。
まず、Azure AKS クラスタ内の Pod から Google Cloud API へのアクセスフローは以下のようになります。
ポイントは 1 つ目の Azure AD アプリケーションからのトークン取得になります。Workload Identity が連携する OIDC プロバイダとして事前に Azure AD アプリケーションを作成しておく必要があります。
さて、それでは Azure、Google Cloud それぞれの設定方法を説明していきます。
前節で述べた 3 段階のアクセスフローは、Workload Identity プールのプロバイダ用に生成した認証情報の構成ファイルを用いた以下の設定で実現することが可能です。
Azure 側
Google Cloud 側
それでは順に上記の設定について詳細を説明していきます。
まず、OIDC プロバイダとなる Azure AD アプリケーションを作成します。Azure ポータルの場合、Azure Active Directory → アプリの登録 → 新規登録 で作成することが可能です。Azure AD アプリケーションを作成した後にアプリケーション API を公開してアプリケーション ID の URI を取得してください。後の設定にて必要になります。
また、AKS 内の Pod から作成した Azure AD アプリケーションへアクセスするため、AKS Pod には Azure API の実行権限が必要です。
我々のチームではマネージド ID および AAD Pod Identity を用いて Pod への権限付与を実施しておりますが Service Principal を用いた方法でも実現が可能です。
それぞれの比較は Azure テクニカルサポートチームがまとめていたこちらの記事が参考になりました。また、AAD Pod Identity の詳細についてはAAD Pod Identity のドキュメントをご参照ください。
次に 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 を用いています。
まず、AKSクラスタ上に準備した構成ファイルを Google Cloud API を使用する Pod にマウントします。その後、マウントした構成ファイルのパスを Pod の GOOGLE_APPLICATION_CREDENTIALS 変数に設定します。これにより Pod から Google Cloud API にアクセスする際に、自動的に指定された構成ファイルの情報に従ってトークンを取得することができます。
さて、続いては Google Cloud 側の設定です。
まず、Google Cloud のドキュメントに従って Workload Identity プールおよびプロバイダを作成します。
発行元の末尾には連携先の Azure テナント ID を、オーディエンスには先ほど作成した Azure AD アプリケーションの URI を設定します。
また我々のチームでは属性のマッピングにて [assertion.tid] をマップすることで Azure テナント ID に応じた権限制限を行っております。
次は Workload Identity と連携する Google Service Account の設定です。
こちらもGoogle Cloud のドキュメントに従って 連携用の Google Service Account に Workload Identity ユーザーロール(roles/iam.workloadIdentityUser)を付与します。
上記画像の設定では 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)
このようにファイルリストが取得できたのでアクセス成功です。(ぼかしが多くてすみませんmm)
本記事では AKS クラスタ内のアプリケーション Pod から Google Cloud (GCP) API へアクセスする方法を説明しました。
再掲すると、以下の設定を行うことで AKS Pod から Google Cloud API へのアクセスが可能になります。
Azure 側
Google Cloud 側
この記事が理解の一助になれば幸いです。また、本記事では説明していない細かい部分については公式ドキュメントを参照ください。
条件に該当するページがございません