やりたいこと
- App ServiceからVertex AIを利用したい
- SAキーによる認証ではなく、本番を想定したWIF連携の動作確認をしたい
- (本番環境への)SAキーによる認証は推奨されておらず、結局WIFの動作を確認することになるため
- コードを書かずにさくっとWIF連携の検証をしたい
- 検証したくなったタイミングで本記事を使えば脳死で検証出来るようにしたい
材料
Azure
- App Service
- Webアプリ作成
- JSONファイル準備
- gemini-cliのインストールなど
- Entra ID
- アプリ登録
- APP_ID_URIの追加
GCP
- Workload Identity Federation
- Pool作成
- Provider作成
- SA(サービスアカウント)作成
- IAM(付与する権限)
- Vertex AI ユーザー
- Workload Identity ユーザー
App Serviceの調理手順①
- Webアプリを作成
- マネージドIDを有効化
- 環境変数の設定
Entra IDの調理手順
Entra IDに関しては無くても動作させることは出来るが、セキュリティを強化させるという意味ではあったほうが良いので作成する。
※Entra IDを使わない手順に関しては後述する。
- Entra IDのアプリ登録
- Microsoft Entra IDのアプリの登録から登録
- APP_ID_URIの追加
APP_ID_URIは後で使うので控えておく
Workload Identity Federationの調理手順
- WIF用Poolを作成
- プール名(プールID):
test-pool
- プール名(プールID):
- WIF用Providerを作成
- プロバイダ:OIDC
- プロバイダ名:
test-provider
- プロバイダID:
test-provider
- 後述するJSONファイルに必要なのは名前ではなく
プロバイダID
のため注意
- 後述するJSONファイルに必要なのは名前ではなく
- 発行元:
https://sts.windows.net/AzureのテナントID
- 許可するオーディエンス:先ほど追加した
APP_ID_URI
- プロバイダの属性:
assertion.sub
オーディエンスに関しては、EntraIDを利用しない場合https://management.azure.com/
でも利用可能。
SAの調理手順
IAMの調理手順
-
Workload Identity ユーザー
の権限をWIF用のプリンシパルに付与
SAのimpersonateで実装する場合、権限の付与は対象のSAにVerteAI用の権限、WIF用のプリンシパルにWIF連携用の権限をそれぞれ実装する必要があるため注意。
※分かりにくいが、これを逆にしたりWIFの権限を誤ってSAに付与したりすると動作しない
App Serviceの調理手順②
-
JSONファイル準備(可変値は以下の通り)
- audience:
GCPプロジェクト番号
/プールID
/プロバイダID
- service_account_impersonation_url:
SA名@GCPプロジェクト名
- url:
${IDENTITY_ENDPOINT}
/APP_ID_URI
- headers:
${IDENTITY_HEADER}
{ "universe_domain": "googleapis.com", "type": "external_account", "audience": "//iam.googleapis.com/projects/GCPプロジェクト番号/locations/global/workloadIdentityPools/プールID/providers/プロバイダID", "subject_token_type": "urn:ietf:params:oauth:token-type:jwt", "token_url": "https://sts.googleapis.com/v1/token", "service_account_impersonation_url": "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SA名@GCPプロジェクト名.iam.gserviceaccount.com:generateAccessToken", "credential_source": { "url": "${IDENTITY_ENDPOINT}?api-version=2019-08-01&resource=APP_ID_URI", "headers": { "X-IDENTITY-HEADER": "${IDENTITY_HEADER}" }, "format": { "type": "json", "subject_token_field_name": "access_token" } } }
- audience:
IDENTITY_ENDPOINT
とIDENTITY_HEADER
は再起動やリフレッシュタイミングで変動するため、本番環境へ実装する際はこの値を動的に取得出来るよう構成すること。
本記事をそのまま利用する場合、以下コマンドを実行しその値をそのまま入れてください。
※再起動や24時間経過したタイミングでリフレッシュされます
- echo ${IDENTITY_ENDPOINT}
- echo ${IDENTITY_HEADER}
- JSONファイルの配置
-
/home/adc.json
という名前で上記で作成したファイルをAppServiceに配置
-
名前はなんでもいいので、環境変数設定時に指定したファイル名とパスで配置する
- gemini-cliのインストールなど
- 以下コマンドを実行し、Gemini-cliを利用出来るようにする
npm install -g @google/gemini-cli apt update apt install -y nodejs npm
再起動後にはインストールされたパッケージもリフレッシュされるので、必要に応じて再度インストールする、恒久的に利用出来るようインストールするなど調整が必要
実食
- gemini-cliコマンドからVertex AIを呼び出す
# gemini -m gemini-2.5-flash -p "土井善晴の得意料理" 土井善晴さんの「得意料理」として特定の料理が明示されているわけではありませんが、里芋を使った料理(里芋の煮ころがし、里芋のグラタンなど)や、山芋を加えてふわっと仕上げるお好み焼きなどがよく知られています。 また、彼の料理哲学である「一汁一菜でよいという提案」に基づいた、シンプルながらも素材の味を活かした家庭料理全般が得意と言えるでしょう。その他、鶏のから揚げ、肉じゃが、ゴーヤーチャンプルーなども彼のレシピにあります。
食レポ
- GCP初めて触ったので権限周りの理解に時間がかかった
- 躓いたところや細かい技術については記事で触れていない(あくまでサクッと検証してみようの記事なので)ので、どこかで追記するか別途記事にする予定