0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AzureのAppServiceからVertexAIを使う~WIF(Workload Identity Federation)を添えて~

Posted at

やりたいこと

  • 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アプリを作成
    • App ServiceからVertexAIを使う事を目的にしているので、何つかってもいいがここではNode 22 LTSを使用
    • 検証用で特に細かい設定は考えないのでランタイムスタックだけ決めて作成
      image.png

  • マネージドIDを有効化
    • デフォルトOFFになっているシステム割り当てマネージドIDを有効化
    • 上記を有効化することで、以下の環境変数が動的にセットされる
      • IDENTITY_HEADER
      • IDENTITY_ENDPOINT
        image.png

  • 環境変数の設定
    • GOOGLE_APPLICATION_CREDENTIALS:/home/test.json
      • WIF連携利用時に使うJSONファイルの配置場所
    • GOOGLE_CLOUD_LOCATION:global
      • 利用するモデルによって制約があるが、ここではとりあえずglobal
    • GOOGLE_CLOUD_PROJECT:hogehoge
      • GCPのプロジェクト番号を指定
    • GOOGLE_GENAI_USE_VERTEXAI:true
      image.png

Entra IDの調理手順

Entra IDに関しては無くても動作させることは出来るが、セキュリティを強化させるという意味ではあったほうが良いので作成する。
※Entra IDを使わない手順に関しては後述する。

  • Entra IDのアプリ登録
    • Microsoft Entra IDのアプリの登録から登録

image.png

  • APP_ID_URIの追加

APP_ID_URIは後で使うので控えておく

image.png

Workload Identity Federationの調理手順

  • WIF用Poolを作成
    • プール名(プールID):test-pool

image.png

  • WIF用Providerを作成
    • プロバイダ:OIDC
    • プロバイダ名:test-provider
    • プロバイダID:test-provider
      • 後述するJSONファイルに必要なのは名前ではなくプロバイダIDのため注意
    • 発行元:https://sts.windows.net/AzureのテナントID
    • 許可するオーディエンス:先ほど追加したAPP_ID_URI
    • プロバイダの属性:assertion.sub

image.png

image.png

オーディエンスに関しては、EntraIDを利用しない場合https://management.azure.com/でも利用可能。

SAの調理手順

  • impersonate(権限借用)のためのSAを作成
    • SA作成の流れで権限も付与可能だが、後述するIAMの項目で権限を付与
      image.png

IAMの調理手順

  • Vertex AI ユーザーの権限をSAに付与
    image.png

  • Workload Identity ユーザーの権限をWIF用のプリンシパルに付与
    • Subjectを利用して細かく制御も可能だが、今回は割愛
      principalSet://iam.googleapis.com/projects/GCPプロジェクト番号/locations/global/workloadIdentityPools/プールID/*
      
      image.png

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" }
      }
    }
    

IDENTITY_ENDPOINTIDENTITY_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初めて触ったので権限周りの理解に時間がかかった
  • 躓いたところや細かい技術については記事で触れていない(あくまでサクッと検証してみようの記事なので)ので、どこかで追記するか別途記事にする予定
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?