WordPressを動かしている場合にAIコネクタでGoogle接続エラーになる〜さくらVPSのIPv6が災いしているので対策した

Wordpressロゴ Linux

WordPressのAIコネクタでGoogle Geminiとの接続が失敗する問題は、サーバーのIPv6アドレスによる地域判定エラーが原因です。さくらVPSなどの特定のネットワーク環境下でGoogle APIが位置情報を正しく認識できず、アクセスが制限される現象が発生しています。

この場合の対策として、外部リクエスト時にIPv4接続を強制するカスタムプラグインを導入します。通信プロトコルを制御するコードを実装することで、位置情報による誤判定を回避し、WordPress上での安定したAIサービス連携が可能になります。

WordPressのAIコネクタでGoogle認証に失敗する

WordPress 7.0からAIコネクタ(AIサービスとの接続を管理する画面)が実装されて、より簡単にAIとの連携が出来るようになりました。早速使ってみることにしたのがもう3週間位前の話。

WordPressのAIコネクタ画面から、OpenAIとの接続は簡単にAPIキー入力で成功しました。しかしGoogle(Gemini)との接続がどうしても上手く出来ません。Google AI Studioに5,000円分課金しましたが(前払い)試行錯誤を繰り返すだけでチャージした金額が減っています。使い物になってないのにふざけんなよと言いたくなります。

It was not possible to connect to the provider using this key.

WordPressのエラーメッセージが不親切なので、APIキーがどう受け付けられていないのか?が判別出来ません。この辺りはWordPressのAIコネクタ周りを開発している人が改善してくれるのを待つしか無さそうです。まだまだWordPress 7.0のAIプラグイン周りは弱いと思います。

Google APIの有効性を確認する

そもそも、Google APIが有効なのかを調べることにしました。それが順番的に最初だろうとようやく気づいた次第です。Google AI Studioを触っていて手がかりになりそうな方法を発見したのです。

Google AI StudioでAPIキーを発行しますが、そこに「cURLクイックスタートをコピー」というボタンがあります。cURLコマンドを使って有効性をターミナルから実行して確認します。もちろんサーバー環境のターミナルから実行しなくては意味が有りません。SSHで接続してコピーしたコマンドをサーバー上で実行します。

~$ curl "https://generativelanguage.googleapis.com/v1beta/mode                                                                                                              ls/gemini-flash-latest:generateContent" \
-H 'Content-Type: application/json' \
-H 'X-goog-api-key: AQ.apikey-apikey-apikey_apikey' \
-X POST \
-d '{
"contents": [
{
"parts": [
{
"text": "Explain how AI works in a few words"
}
]
}
]
}'
{
"error": {
"code": 400,
"message": "User location is not supported for the API use.",
"status": "FAILED_PRECONDITION"
}
}

“User location is not supported for the API use.”

この一行で対象外地域(日本は対象)からの接続だと判定されていることが分かりました。WordPressのエラーでは判定出来なかった詳細なエラー内容です。

おそらくIPv6でGoogle APIに接続しようとしていて、Google側がさくらVPSのIPv6アドレスの国特定が出来ないため拒否っているのでしょう。これが原因だと推測が立ちました。

強制的にcurl -4オプションを付けて、IPv4でコマンドを実行しなおしてみます。

~$ curl -4 "https://generativelanguage.googleapis.com/v1beta/models/gemini-flash-latest:generateContent" \
-H 'Content-Type: application/json' \
-H 'X-goog-api-key: AQ.apikey-apikey-apikey_apikey' \
-X POST \
-d '{
"contents": [
{
"parts": [
{
"text": "Explain how AI works in a few words"
}
]
}
]
}'

{
"candidates": [
{
"content": {
"parts": [
{
"text": "AI works by analyzing massive amounts of data to learn patterns, which it then uses to make predictions, decisions, and solve problems.",
"thoughtSignature": "ここに証明書情報がズラズラと表示される。"
}
],
"role": "model"
},
"finishReason": "STOP",
"index": 0
}
],
"usageMetadata": {
"promptTokenCount": 8,
"candidatesTokenCount": 26,
"totalTokenCount": 502,
"promptTokensDetails": [
{
"modality": "TEXT",
"tokenCount": 8
}
],
"thoughtsTokenCount": 468,
"serviceTier": "standard"
},
"modelVersion": "gemini-3.6-flash",
"responseId": "responseId_responseId-Qg"
}

curl -4コマンドでの接続に成功したので、やはりさくらVPSのIPv6が災いしている様です。

さくらVPSのIPv6接続は以前にサーバー(debian)の設定変更で抑制したハズだったのですが効果がなかったみたいなので、WordPress側で対処することにします。WordPressのAIコネクタによるGoogleサービスへの接続のみ問題がある訳ですからWordPress側で対処するのが筋だと思います。

メモ:サーバーOS側でIPv4を優先する方法

OS全体でIPv4を優先する方法として考えられるのは、/etc/gai.confの内容を編集する方法です。具体的には下記の様に行います。

#precedence ::ffff:0:0/96 100

のコメントを外して

precedence ::ffff:0:0/96 100

とすれば、IPv4が優先される様になります。ただし既存プロセスはまだ切り替わらないので、PHP-FPMを再起動するなど行えば確実です。

メモ:PHPだけでIPv4強制にする対策方法

上記の様な方法でOS全体に影響を与えたくない、という場合は、PHP/cURLで

URLOPT_IPRESOLVE = CURL_IPRESOLVE_V4

を設定する方法がある様です。これならばcURLのみをIPv4に強制することが出来そうです。実際には試してないので単なるメモです。この辺りは、WordpressのAIコネクタ(プラグイン)で実装して、IPv4を強制する様なオプションスイッチを実装して欲しいものです。

日本語でレポート出来るようであればWordpressの要望に出してみても良さそうですが、AIコネクタプラグインの要望はどこに出せば良いのか知らないので、どなたか知っている人がいたら要望をだして欲しいものです。私はWordpressの開発コミュニティの状況を良く知らないもので・・・

さくらVPS上で動いているWordPressの外部接続をIPv4にする

まず考えられる対策方法は、function.phpへの記述によってIPv4に抑制する方法です。当サイトの場合はCocoonテーマを使っていて、子テーマを使っているので子テーマのfunction.phpに記述する方法で切り分けてみます。

/**
* WordPressの外部HTTPリクエストでIPv4を強制する
*/
add_action('http_api_curl', function($handle) {
if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')) {
curl_setopt($handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
}
});

これでAIコネクタよりGoogleに接続するAPIを入力してみたところ接続に成功しました。

AIコネクタによるGoogle APIへの接続成功

これで原因と対策方法が分かったので、今後のことも考えて簡単なプラグイン化しておくことにします。function.phpへの記述は削除して元の状態に戻します。

簡単なプラグインを作ってIPv4接続を強制する

WordPressの場合、function.phpに書いておくのも一案ですが、見通しが悪くなり長期的に運用していると忘れるので、プラグイン化しておいた方がパッと見思い出しやすいのでそうすることにしました。プラグインファイルをテキストエディタで作成してアップします。

<?php
/**
 * Plugin Name: Force IPv4 for HTTP API
 * Description: WordPressの外部HTTPリクエストにおいて、IPv6の位置情報誤判定を防ぐためにIPv4通信を強制します。
 * Version: 1.0.0
 * Author: Your Name
 */

if (!defined('ABSPATH')) {
    exit; // 直接アクセスを禁止
}

add_action('http_api_curl', function($handle) {
    if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')) {
        curl_setopt($handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
    }
});Code language: HTML, XML (xml)

もう一ひねりして、Googleへの接続のみIPv4に強制するパターンのコード。

<?php
/**
 * Plugin Name: Force IPv4 for Google AI API
 * Description: Google AI API(Gemini)との通信時のみ、IPv6の位置情報誤判定を防ぐためにIPv4通信を強制します。
 * Version: 1.1.0
 * Author: Your Name
 */

if (!defined('ABSPATH')) {
    exit; // 直接アクセスを禁止
}

add_action('http_api_curl', function($handle, $parsed_args, $url) {
    // 接続先URLに「googleapis.com」が含まれている場合のみIPv4を強制
    if (strpos($url, 'googleapis.com') !== false) {
        if (defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')) {
            curl_setopt($handle, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
        }
    }
}, 10, 3); // $parsed_args と $url を受け取るために引数の数を「3」に指定Code language: HTML, XML (xml)

いずれかを「force-ipv4.php」というファイル名で保存して、WordPressのフォルダー(/wp-content/plugins/)へアップロードして、Wordpressのプラグイン画面から有効にしました。

※先に記した「function.php」へ追記したコードは使いたくないので忘れずに削除しておきます。個人的にはfunction.phpはクリーンに維持したいです。

コネクタの承認でAI機能を制御する

WordPressの「ツール」ー「コネクタの承認」画面から、OpenAIとGoogleのコネクタに対してどのプラグインがアクセス出来るかをスイッチングすることができます。この辺りは必要に応じて調整することになると思います。

基本的には、OpenAIには呼び出し元「AI Provider for OpenAI」からのアクセスを許可する必要がありますし、Googleには呼び出し元「AI Provider for Google」からのアクセスを許可する必要があります。

詳細なAIのスイッチング(プラグイン割付)は使い込んでみないと分からない印象です。ネット上にもあまりこの部分の解説情報は無いみたいですし。

とにかくこれでGoogleに課金した5,000円分のAI機能はAPIを通して使用することが出来る様になりました。現状、OpenAI(ChatGPT)の方が明らかに賢いですが、OpenAIにはまだ課金していないので直ぐに無料枠一杯でロックされてしまいます。Google Geminiにもっと賢くなって貰って活躍させて恩恵を受けたいものです。使い分けてみてOpenAIの方が有用であればOpenAIの方に課金することも検討してみます。

コメント

Comment spam is annoying.

There has been an increase in comment spam, but we decline it. It’s pointless because we use Akismet to block spam comments. Spam comments will not be posted.

コメントスパムが増えていますがお断りします。akismetでスパムコメントを弾いているので無意味です。スパムコメントは掲載されません。

ブロックしたスパム

DMM広告

タイトルとURLをコピーしました