Vertex AIでClaudeモデルを使おう!GCPからの設定ガイド完全版

はじめに

こんにちは!年度末ということもあり、最近はもっぱら業務に追われているなーがです。今回は業務でAzure FunctionsからVertex AIのClaudeモデルを呼び出す機会があったので、その設定手順をまとめてみました。

AnthropicのClaudeモデルは直接Anthropic APIを使う方法が一般的ですが、Google Cloud Vertex AIを経由して利用することもできます。既にGCPを利用している組織であれば、Vertex AI経由のほうがIAMによるアクセス管理や既存の請求体系との統合ができて便利です。

ただ、Vertex AIからClaudeを使うための設定手順は、GCPの認証周りも絡むため少し複雑です。今回は、GCPの基本的な設定からPython SDKを使った動作確認まで、一通りの手順をまとめてみました。

Vertex AIのClaudeモデルとは

Vertex AIでは、AnthropicのClaudeモデルをModel Garden経由で利用できます。自分のGCPプロジェクト内でClaudeを呼び出せるため、データの送信先やアクセス制御をGCPの仕組みで管理できるのがメリットです。

利用可能なモデル一覧

2026年2月時点で、Vertex AIで利用可能なClaudeモデルは以下の通りです。

モデル名モデルID特徴
Claude Opus 4.6claude-opus-4-6@20260205最高性能モデル。高度な推論・分析向け
Claude Opus 4.5claude-opus-4-5@20251101高性能モデル。複雑なタスク向け
Claude Sonnet 4.5claude-sonnet-4-5@20250929パフォーマンスとコストのバランスが良い
Claude Opus 4.1claude-opus-4-1@20250805高性能モデル
Claude Opus 4claude-opus-4@20250514高性能モデル
Claude Sonnet 4claude-sonnet-4@20250514コスト効率の良い汎用モデル
Claude Haiku 4.5claude-haiku-4-5@20251001高速・低コストモデル

以下のモデルは非推奨(Deprecated)となっています。既存のコードで使用している場合は、上記のモデルへの移行を検討してください。

モデル名非推奨開始日
Claude 3.7 Sonnet2025年11月11日
Claude 3.5 Haiku2026年1月5日

参照: Vertex AI – Claude models

サポートリージョン

Claudeモデルを利用できるリージョンはモデルによって異なります。

モデル利用可能なリージョン
Opus 4.6us-east5, global
Opus 4.5 / Sonnet 4.5us-east5, europe-west1, asia-southeast1, global
Sonnet 4us-east5, europe-west1, asia-east1, global
Haiku 4.5us-east5, europe-west1, asia-east1, global
Opus 4.1 / Opus 4us-east5, global

リージョンによっては利用できないモデルがあるため、事前に確認しておきましょう。最新情報はModel Gardenでチェックしてください。

前提条件

この記事の手順を進めるにあたり、以下が必要です。

  • Google Cloudアカウント
  • GCPプロジェクト(課金が有効になっていること)
  • gcloud CLIがインストール済みであること(インストール方法は後述
  • 以下のいずれかの権限を持つIAMロール
ロール用途
roles/serviceusage.serviceUsageAdminAPIの有効化
roles/iam.workloadIdentityPoolAdminWorkload Identityプール/プロバイダの管理
roles/iam.serviceAccountCreatorサービスアカウントの作成
roles/resourcemanager.projectIamAdminプロジェクトIAMの管理
roles/iam.serviceAccountAdminサービスアカウントIAMの管理

Vertex AIの有効化

まず、GCPプロジェクトで必要なAPIを有効化します。

gcloud services enable \
  iam.googleapis.com \
  sts.googleapis.com \
  iamcredentials.googleapis.com \
  aiplatform.googleapis.com

各APIの役割は以下の通りです。

API役割
iam.googleapis.comIAMの管理
sts.googleapis.comSecurity Token Service(トークン交換)
iamcredentials.googleapis.comサービスアカウントの認証情報生成
aiplatform.googleapis.comVertex AI本体

Model GardenからClaudeモデルを有効化する

APIを有効化しただけでは、まだClaudeモデルは使えません。Model Gardenから利用したいモデルを有効化する必要があります。

  1. Google Cloud Consoleにログインします
  2. 左側メニューから Vertex AI > Model Garden を選択します
  3. 検索バーで「Claude」と入力します
  4. 利用したいClaudeモデル(例: Claude Sonnet 4.5)を選択します
  5. 有効化 ボタンをクリックします
  6. 利用規約を確認し、同意して有効化を完了します

有効化が完了すると、そのモデルをVertex AI API経由で呼び出せるようになります。

参照: Model Garden でパートナー モデルを有効にする

認証設定: ADCによるローカル開発

ローカル環境からVertex AIを利用する最も簡単な方法は、Application Default Credentials(ADC)を使う方法です。

gcloud CLIのインストール

ADCの設定にはgcloud CLIが必要です。まだインストールしていない場合は、以下の手順でインストールしてください。

brew install --cask google-cloud-sdk
  • Linux(Debian/Ubuntu):
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates gnupg curl
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
  sudo gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \
  sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
sudo apt-get update && sudo apt-get install -y google-cloud-cli

参照: gcloud CLI をインストールする

ADCの設定

ADC(Application Default Credentials)は、Google Cloudクライアントライブラリが自動的に認証情報を検索する仕組みです。以下のコマンドでローカルにADCファイルを作成できます。

gcloud auth application-default login

このコマンドを実行するとブラウザが開き、Googleアカウントでのログインが求められます。ログインが完了すると、認証情報が以下のパスに保存されます。

  • Linux/macOS: ~/.config/gcloud/application_default_credentials.json
  • Windows: %APPDATA%\gcloud\application_default_credentials.json

Python SDKなどのクライアントライブラリは、このファイルを自動的に読み取って認証します。

参照: アプリケーションのデフォルト認証情報を設定する

認証設定: Workload Identity FederationによるGCP外からのアクセス

Azure FunctionsなどのGCP外の環境からVertex AIにアクセスしたい場合は、Workload Identity Federationを使います。

Workload Identity Federationは、外部のIDプロバイダ(Azure AD、AWS IAMなど)が発行したトークンをGCPの短命トークンに交換する仕組みです。サービスアカウントキーを直接配布する必要がないため、セキュリティ面で優れています。

最初に設定するときは「プール?プロバイダ?SA Impersonation?」と概念が多くて面食らいましたが、一度理解すると鍵を一切管理しなくていいのが本当に楽です。

ここでは、Azure Functions の Managed Identity を使った連携を例に手順を説明します。WIF のベストプラクティスとして、--allowed-audiences にはAzure側でアプリの登録(サービスプリンシパル)を作成し、そのApplication IDを指定します。これにより、認証を受け付けるトークンの対象を自分のアプリケーション固有のIDに絞り込むことができます。

Azureサービスプリンシパルの作成

まず、Azure側でアプリの登録(サービスプリンシパル)を作成します。このApplication IDをWIFの --allowed-audiences に指定することで、Managed Identityが取得するトークンの受け入れ対象を自分のアプリケーションに限定できます。

Azure Portal で以下の手順を実行してください。

  1. Microsoft Entra ID > アプリの登録 > 新規登録 を選択
  2. 名前を入力(例: gcp-workload-identity)し、登録 をクリック
  3. 登録後に表示される アプリケーション(クライアント)ID をメモしておく

このApplication IDが --allowed-audiences に指定する値になります。

Workload Identityプールの作成

外部IDを管理するためのWorkload Identityプールを作成します。

gcloud iam workload-identity-pools create "azure-pool" \
    --location="global" \
    --display-name="Azure Pool"

OIDCプロバイダの追加

作成したプールにAzure ADをOIDCプロバイダとして追加します。

gcloud iam workload-identity-pools providers create-oidc "azure-provider" \
    --location="global" \
    --workload-identity-pool="azure-pool" \
    --display-name="Azure Provider" \
    --issuer-uri="https://sts.windows.net/<AZURE_TENANT_ID>/" \
    --allowed-audiences="<SERVICE_PRINCIPAL_APPLICATION_ID>" \
    --attribute-mapping="google.subject=assertion.sub,attribute.tid=assertion.tid,attribute.oid=assertion.oid" \
    --attribute-condition="attribute.tid == '<AZURE_TENANT_ID>' && attribute.oid == '<MANAGED_IDENTITY_OBJECT_ID>'"

各パラメータの説明です。

パラメータ説明
--issuer-uriAzure ADのIssuer URI。Managed Identityが発行するv1トークンの場合はこの形式
--allowed-audiences作成したサービスプリンシパルのApplication ID(Client ID)
--attribute-mappingOIDCトークンのクレームをGCP属性にマッピング。assertion.oid はObject IDに対応
--attribute-condition受け入れるトークンの条件。テナントIDとObject IDを指定して不正なトークンを弾く

Azure Functionsが複数ある場合など、複数のManaged IdentityのObject IDを許可したい場合は、in 演算子で列挙できます。

    --attribute-condition="assertion.tid == '<AZURE_TENANT_ID>' && assertion.oid in ['<MANAGED_IDENTITY_OBJECT_ID_1>', '<MANAGED_IDENTITY_OBJECT_ID_2>']"

--allowed-audiences にテナントIDを使う場合

--allowed-audiences にはサービスプリンシパルのApplication ID(Client ID)の代わりに、認証用テナントのテナントIDを指定することもできます。

ただし、Azure Functionsが属するテナント(呼び出し側テナント)と、サービスプリンシパルが登録されているテナント(認証用テナント)が異なる場合は、サービスプリンシパルをマルチテナントとして設定する必要があります。シングルテナントのサービスプリンシパルは、自テナント以外のManaged Identityからのトークン取得を受け付けないためです。

マルチテナント設定は以下のいずれかの方法で行います。

Azure Portal の場合:

  1. アプリの登録 > Authentication を選択
  2. Supported account typesAccounts in any organizational directory に変更
  3. Save をクリック

Azure CLI の場合:

az ad app update \
    --id "<SERVICE_PRINCIPAL_APPLICATION_ID>" \
    --sign-in-audience AzureADMultipleOrgs

サービスアカウントの作成と権限付与

Vertex AI呼び出し用のサービスアカウントを作成し、必要な権限を付与します。

# サービスアカウントの作成
gcloud iam service-accounts create vertex-ai-workload \
    --display-name="Vertex AI for Azure Workload"

# Vertex AI利用権限の付与
gcloud projects add-iam-policy-binding YOUR_GCP_PROJECT_ID \
    --member="serviceAccount:vertex-ai-workload@YOUR_GCP_PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/aiplatform.user"

YOUR_GCP_PROJECT_ID は自分のGCPプロジェクトIDに置き換えてください。

Azure Managed Identityへの権限借用許可

Azure FunctionsのManaged Identityがこのサービスアカウントを借用できるように設定します。attribute.oid 属性を使ってバインディングするため、principalSet:// 形式で指定します。

gcloud iam service-accounts add-iam-policy-binding \
    "vertex-ai-workload@YOUR_GCP_PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/iam.workloadIdentityUser" \
    --member="principalSet://iam.googleapis.com/projects/YOUR_PROJECT_NUMBER/locations/global/workloadIdentityPools/azure-pool/attribute.oid/MANAGED_IDENTITY_OBJECT_ID"

YOUR_PROJECT_NUMBER はGCPプロジェクトの番号(プロジェクトIDではありません)、MANAGED_IDENTITY_OBJECT_ID はAzure FunctionsのManaged IdentityのObject IDに置き換えてください。

サンプルコード(WIF認証フロー)

以下のサンプルは、credential config ファイルを使用せず、辞書形式で load_credentials_from_dict に渡す方式です。実際の実装では AzureFunctionsWIFCredentials と Azure Functions のエントリポイントを別ファイルに分けることが多いですが、ここでは見通しよく1ファイルにまとめています。
google.auth ライブラリが IMDS へのトークン取得・WIF STS との交換・SA Impersonation をすべて自動で処理します。

credential_config 辞書の構造は、Google Cloud が定義する外部認証情報設定ファイルの仕様に準拠しています。各フィールドの意味は以下のとおりです。

フィールド説明
type: "external_account"WIF を使った外部アカウント認証であることを示す
audience認証先の WIF プール・プロバイダーの識別子
subject_token_typeAzure から取得するトークンの種別(JWT)
token_urlGCP の Security Token Service (STS) エンドポイント
credential_sourceトークン取得元(Azure IMDS)の URL・ヘッダー・形式
service_account_impersonation_urlSA への権限借用リクエスト先 URL
import os

from google.auth import load_credentials_from_dict
from google.auth.credentials import Credentials
from anthropic import AnthropicVertex


class AzureFunctionsWIFCredentials:
    """Azure Functions の Managed Identity を使った Workload Identity Federation 認証"""

    def __init__(
        self,
        service_principal_app_id: str,
        project_number: str,
        pool_id: str,
        provider_id: str,
        service_account_email: str,
    ) -> None:
        self.service_principal_app_id = service_principal_app_id
        self.project_number = project_number
        self.pool_id = pool_id
        self.provider_id = provider_id
        self.service_account_email = service_account_email

    def get_credentials(self) -> Credentials:
        identity_endpoint = os.environ["IDENTITY_ENDPOINT"]
        identity_header = os.environ["IDENTITY_HEADER"]

        credential_config = {
            "type": "external_account",
            "audience": (
                f"//iam.googleapis.com/projects/{self.project_number}/locations/global/"
                f"workloadIdentityPools/{self.pool_id}/providers/{self.provider_id}"
            ),
            "subject_token_type": "urn:ietf:params:oauth:token-type:jwt",
            "token_url": "https://sts.googleapis.com/v1/token",
            "credential_source": {
                "url": f"{identity_endpoint}?resource={self.service_principal_app_id}&api-version=2019-08-01",
                "headers": {"X-IDENTITY-HEADER": identity_header},
                "format": {"type": "json", "subject_token_field_name": "access_token"},
            },
            "service_account_impersonation_url": (
                f"https://iamcredentials.googleapis.com/v1/projects/"
                f"-/serviceAccounts/{self.service_account_email}:generateAccessToken"
            ),
        }

        credentials, _ = load_credentials_from_dict(
            credential_config, scopes=["https://www.googleapis.com/auth/cloud-platform"]
        )
        return credentials


class VertexAIClaudeClient:
    """Vertex AI Claude クライアント"""

    def __init__(self, project_id: str, region: str, credentials: Credentials) -> None:
        self._client = AnthropicVertex(
            region=region,
            project_id=project_id,
            credentials=credentials,
        )

    def generate(self, prompt: str, model: str = "claude-sonnet-4-5@20250929") -> str:
        message = self._client.messages.create(
            model=model,
            max_tokens=1024,
            messages=[{"role": "user", "content": prompt}],
        )
        return message.content[0].text


import azure.functions as func

app = func.FunctionApp()

# クライアントはコールドスタートのコストを避けるためモジュールレベルで初期化
_wif = AzureFunctionsWIFCredentials(
    service_principal_app_id="<SERVICE_PRINCIPAL_APPLICATION_ID>",
    project_number="<YOUR_PROJECT_NUMBER>",
    pool_id="azure-pool",
    provider_id="azure-provider",
    service_account_email="vertex-ai-workload@<YOUR_GCP_PROJECT_ID>.iam.gserviceaccount.com",
)
_client = VertexAIClaudeClient(
    project_id="<YOUR_GCP_PROJECT_ID>",
    region="us-east5",
    credentials=_wif.get_credentials(),
)


@app.route(route="generate", methods=["POST"])
def generate(req: func.HttpRequest) -> func.HttpResponse:
    prompt = req.get_json().get("prompt", "")
    if not prompt:
        return func.HttpResponse("prompt is required", status_code=400)

    result = _client.generate(prompt)
    return func.HttpResponse(result, mimetype="text/plain")

参照: Workload Identity Federation の構成

認証設定(ローカルDevContainer環境)

ローカルDevContainerを使用する場合の手順です。DevContainerはコンテナ内で開発環境を構築するため、コンテナ内にgcloud CLIをインストールし、ADCの設定を行う必要があります。また、コンテナ内ではブラウザを直接起動できないため、認証方法にも工夫が必要です。Google Cloudのアカウントが割り当てられている前提です。

私もDevContainerでの認証は最初かなりハマりました。「ブラウザが開かない!」となったところで、後述する --no-launch-browser オプションに気づいて解決した経験があります。同じところで詰まっている方はぜひ参考にしてみてください。

gcloud CLIのインストール(DevContainer内)

DevContainerではコンテナビルド時にgcloud CLIをインストールしておくのがベストプラクティスです。Dockerfile に以下を追記することでインストールできます。

RUN apt-get update && apt-get install -y apt-transport-https ca-certificates gnupg curl \
  && curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
     gpg --dearmor -o /usr/share/keyrings/cloud.google.gpg \
  && echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" \
     > /etc/apt/sources.list.d/google-cloud-sdk.list \
  && apt-get update && apt-get install -y google-cloud-cli \
  && apt-get clean && rm -rf /var/lib/apt/lists/*

Dockerfileを更新したら、コンテナを再ビルド(Rebuild Container)してください。これでDevContainer内からgcloudコマンドが使えます。

参照: gcloud CLI をインストールする

サービスアカウントの権限借用設定

ユーザーアカウントがサービスアカウントのトークンを生成できるように、serviceAccountTokenCreator ロールを付与します。

この操作には resourcemanager.projects.setIamPolicy 権限が必要です。

gcloud iam service-accounts add-iam-policy-binding \
    SERVICE_ACCOUNT_EMAIL \
    --member="user:YOUR_EMAIL_ADDRESS" \
    --role="roles/iam.serviceAccountTokenCreator"

ADCの設定(権限借用)

サービスアカウントの権限借用を使って、ローカルADCファイルを作成します。

gcloud auth application-default login \
    --impersonate-service-account=SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com

このコマンドを実行するとブラウザ認証が開き、認証完了後にサービスアカウントの権限借用を使ったADCが設定されます。以降、Python SDKなどがこの認証情報を自動的に利用します。

参照: サービスアカウントの権限借用を使用して、ローカル ADC ファイルを作成

代替手段: –no-launch-browserオプション

DevContainer内でブラウザが起動できない場合の代替手段として、--no-launch-browser オプションも利用できます。

gcloud auth application-default login --no-launch-browser

このコマンドを実行すると、認証用のURLがターミナルに表示されます。ホストマシンのブラウザでそのURLを開いて認証を完了し、表示された認証コードをターミナルに貼り付けてください。

サービスアカウントの権限借用を設定せずに済むため手軽ですが、認証されるのはユーザーアカウント自身のため、サービスアカウントベースのアクセス制御が必要な場合は前述の権限借用方式を使用してください。

Global vs Regionalエンドポイント

Vertex AIのClaudeモデルには、GlobalRegionalの2種類のエンドポイントがあります。

項目GlobalRegional
ルーティング動的に最適なリージョンへ指定リージョンのみ
料金追加料金なし10%のプレミアム料金
データ所在地の保証なしあり
ユースケース一般的な利用データ所在地の要件がある場合

Globalエンドポイントは、リクエストを自動的に最適なリージョンにルーティングするため、可用性が高く、追加料金もかかりません。特にデータ所在地の要件がなければ、まずはGlobalを選んでおけば間違いないでしょう。

Regionalエンドポイントは、指定したリージョン内でのみデータが処理されることが保証されます。コンプライアンス上、データの所在地を制御しなければならないケースで活躍します。

なお、10%のプレミアム料金が発生するのはClaude Sonnet 4.5・Haiku 4.5以降のモデルのみ。それ以前のモデル(Sonnet 4、Opus 4など)は既存の料金体系のままです。

コード上では、region パラメータで使い分けます。

# Globalエンドポイント
client = AnthropicVertex(region="global", project_id="your-project-id")

# Regionalエンドポイント(例: 東京に近いリージョン)
client = AnthropicVertex(region="asia-southeast1", project_id="your-project-id")

参照: Vertex AI – Claude models

Python SDKのセットアップ

Vertex AI経由でClaudeを使うには、Anthropic Python SDKのVertex AI拡張をインストールします。

pip install -U google-cloud-aiplatform google-auth "anthropic[vertex]"

anthropic[vertex] をインストールするだけで、AnthropicVertex クライアントがすぐ使えます。

サンプルコード

基本的なテキスト生成

最もシンプルなテキスト生成のサンプルです。

from anthropic import AnthropicVertex

# クライアントの初期化
client = AnthropicVertex(
    region="us-east5",
    project_id="your-gcp-project-id",
)

# メッセージの送信
message = client.messages.create(
    model="claude-sonnet-4-5@20250929",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Vertex AIとは何ですか?簡潔に教えてください。"}
    ],
)

print(message.content[0].text)

regionproject_id は自分の環境に合わせて変更してください。ADCが設定されていれば、認証情報は自動的に読み取られます。

ストリーミングレスポンス

長い応答を逐次的に受け取りたい場合は、ストリーミングを使います。

from anthropic import AnthropicVertex

client = AnthropicVertex(
    region="us-east5",
    project_id="your-gcp-project-id",
)

# ストリーミングでメッセージを送信
with client.messages.stream(
    model="claude-sonnet-4-5@20250929",
    max_tokens=1024,
    messages=[
        {"role": "user", "content": "Pythonで簡単なWebサーバーを作る方法を教えてください。"}
    ],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

print()  # 最後に改行

messages.stream() を使うと、レスポンスが生成されるたびにチャンク単位でテキストを受け取れます。チャットアプリケーションのようなリアルタイムな応答表示に便利です。

トラブルシューティング

Vertex AIからClaudeを利用する際によく遭遇するエラーとその対処法をまとめました。

「Permission denied」エラー

google.api_core.exceptions.PermissionDenied: 403 Permission denied on resource project

原因: ADCに設定されたアカウントにVertex AIの利用権限がない。

対処法:

  • roles/aiplatform.user ロールが付与されているか確認する
  • gcloud auth application-default login を再実行して認証情報を更新する

「Model not found」エラー

anthropic.NotFoundError: 404 Model not found

原因: 指定したモデルがModel Gardenで有効化されていない、またはリージョンで利用できない。

対処法:

  • Model Gardenで対象モデルが有効化されているか確認する
  • 指定したリージョンでモデルが利用可能か確認する(サポートリージョンを参照)

「Could not automatically determine credentials」エラー

google.auth.exceptions.DefaultCredentialsError: Could not automatically determine credentials.

原因: ADCファイルが存在しない、または読み取れない。

対処法:

  • gcloud auth application-default login を実行してADCを再設定する
  • 環境変数 GOOGLE_APPLICATION_CREDENTIALS が意図しないパスを指していないか確認する

「Quota exceeded」エラー

anthropic.RateLimitError: 429 Rate limit exceeded

原因: APIの呼び出しレートまたはトークン数の上限に達した。

対処法:

  • しばらく待ってからリトライする
  • Google Cloud Consoleの IAMと管理 > 割り当て でクォータの引き上げをリクエストする

さいごに

今回は、Vertex AIからClaudeモデルを利用するための設定手順を一通り紹介しました。

ポイントをまとめると以下の通りです。

  • Model Gardenでの有効化が必要(APIの有効化だけでは不十分)
  • ローカル開発にはADCが最も手軽(gcloud auth application-default login
  • GCP外からのアクセスにはWorkload Identity Federationを使うことでサービスアカウントキーの配布が不要になる。--allowed-audiences にはサービスプリンシパルのApplication IDを指定し、--attribute-condition で認証対象を絞り込むのがベストプラクティス
  • Globalエンドポイントは追加料金なしで可用性が高いのでおすすめ
  • Python SDKは anthropic[vertex] をインストールするだけで使える

GCPを既に利用している方にとっては、Vertex AI経由でClaudeを使うことで既存のIAM管理や課金体系にそのまま統合できるのが大きなメリットです。ぜひ試してみてください!

最後までお読みいただき、ありがとうございます!

参照:

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
エンジニア募集中!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です