現在、Apigee と Apigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントを表示する
ResourceDoesNotExist
エラー メッセージ
Apigee UI または API を使用した API プロキシのデプロイに失敗すると、次のエラー メッセージが表示されます。
Error Deploying Revision <var>revision_number</var> to <var>environment</var>
Resource with name <var>ResourceURL</var> and type java does not exist.
エラー メッセージの例
Error Deploying Revision 1 to test
Resource with name myresource.jar and type java does not exist.
エラーのスクリーンショットの例
原因
JavaCallout ポリシーの <ResourceURL>
要素で指定されたリソースが API プロキシレベルまたは環境レベルで存在しない場合、API プロキシのデプロイは失敗します。
診断
環境とリソース名を特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、環境は
test
で、<ResourceURL>
要素で使用されているリソース名はmyresource.jar
です。Error Deploying Revision 1 to test Resource with name myresource.jar and type java does not exist.
上記のステップ 1 で特定したリソースを使用している JavaCallout ポリシーを確認します。
たとえば、次のポリシーでは、<
ResourceURL>
の値がmyresource.jar
に指定されており、これはエラー メッセージの値と一致します。<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <JavaCallout name="hello-java"> <ClassName>com.apigeesample.HelloJava</ClassName> <ResourceURL>java://myresource.jar</ResourceURL> </JavaCallout>
そのリソースが、エラーが発生している API プロキシの一部であるか、または環境レベルでアップロードされているものかを判別します。そうではない場合は、それがエラーの原因です。
API プロキシ エディタの [Navigator] ペインで [Resources] タブに移動すると、API プロキシレベルでアップロードされたすべてのリソースが表示されます。この例では、API プロキシにはアップロードされたリソースがありません。
リソースは環境レベルで利用できます。詳しくは、リソース ファイルをご覧ください。
リソースが環境レベルで存在するかどうかを判別するには、curl を使用して次の API 呼び出しを発行します。
curl \ "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \ -H "Authorization: Bearer $TOKEN"
ここで、OAuth 2.0 アクセス トークンの取得で説明されているように、
$TOKEN
は OAuth 2.0 アクセス トークンに設定されます。この例で使用されているcurl
オプションの詳細については、curl の使用をご覧ください。使用される環境変数の説明については、Apigee API リクエストの環境変数の設定をご覧ください。
これらの API のレスポンスとして 404 ステータス コードを受信した場合、環境レベルではリソースがありません。
リソースが API プロキシレベルと環境レベルで使用可能でない場合、デプロイエラーが返されます。
Resource with name myresource.jar and type java does not exist. ```
解決策
<ResourceURL>
要素で指定されたリソースが API プロキシまたは環境レベルで存在するかどうかを確認します。詳細については、リソースの管理をご覧ください。
上記の JavaCallout ポリシーの例を修正するには、適切なレベル(API プロキシレベルまたは環境レベル)で JAR ファイルをアップロードしてください。
NoResourceForURL
エラー メッセージ
Apigee UI または API を使用した API プロキシのデプロイに失敗すると、次のエラー メッセージが表示されます。
Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL <var>ResourceURL</var>
エラー メッセージの例
Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar
エラーのスクリーンショットの例
原因
このエラーは、リソース ファイルが、API プロキシまたは環境レベルで存在していても、破損しているか、部分的にアップロードされた場合に発生する場合があります。
診断
環境とリソース名を特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、環境名は
test
で、<ResourceURL>
要素で使用されているリソース名はmyresource.jar
です。Error in deployment for environment test The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar
リソースが API プロキシレベルまたは環境レベルでアップロードされていることを確認します。以下の例では、リソース
myresource.jar
が API プロキシレベルでアップロードされています。リソースは環境レベルで利用できます。詳しくは、リソース ファイルをご覧ください。
リソースが環境レベルで存在するかどうかを判別するには、curl を使用して次の API 呼び出しを発行します。
curl \ "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \ -H "Authorization: Bearer $TOKEN"
ここで、OAuth 2.0 アクセス トークンの取得で説明されているように、
$TOKEN
は OAuth 2.0 アクセス トークンに設定されます。この例で使用されているcurl
オプションの詳細については、curl の使用をご覧ください。これらの API のレスポンスとして 404 ステータス コードを受信した場合、環境レベルではリソースがありません。
解決策
- リソースが API プロキシレベルまたは環境レベルで存在すると判別できた場合は、リソースを削除し、ステップ 2 の説明に従ってリソースを再アップロードします。それ以外の場合は、手順 3 に進みます。
API プロキシレベルでリソースを削除するには、API プロキシ エディタの [Navigator] ペインで [Resources] タブに移動し、以下に示すようにリソースの横にある [X] ボタンをクリックします。
環境のリソースを削除するには、以前に診断ステップで使用していた API 呼び出しに対し DELETE 動詞を使用します。たとえば、環境レベルでリソースを削除するには、次のコマンドを入力します。
curl -X DELETE \ "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \ -H "Authorization: Bearer $TOKEN"
ここで、OAuth 2.0 アクセス トークンの取得で説明されているように、
$TOKEN
は OAuth 2.0 アクセス トークンに設定されます。この例で使用されているcurl
オプションの詳細については、curl の使用をご覧ください。適切なレベル(API プロキシレベルまたは環境レベル)で JAR ファイルをアップロードします。
リソースを再アップロードしても解決しない場合は、Apigee サポートにお問い合わせください。
JavaCalloutInstantiationFailed
エラー メッセージ
Apigee の UI または API を使用した API プロキシのデプロイに失敗すると、次のエラー メッセージが表示されます。
Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class <var>class_name</var>
または
Error in deployment for environment <var>environment</var>.
The revision is deployed and traffic can flow, but flow may be impaired. Failed to instantiate the JavaCallout Class <var>class_name</var>
エラー メッセージの例
Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
エラーのスクリーンショットの例
原因
このエラーの一般的な原因は次のとおりです。
原因 | 説明 |
JAR ファイルがない | エラーで特定された Java クラスを含む JAR ファイルがアップロードされていません。 |
破損した JAR ファイル | エラーで特定された Java クラスを含む JAR ファイルが破損しているか、部分的にアップロードされています。 |
クラスファイルがない | エラーで特定された Java クラスファイルが、>ResourceURL< または依存 JAR ファイルで指定された JAR ファイルに含まれていません。 |
Java コードの問題 | コンストラクタがない、コードの依存関係の問題など、コードに関するエラーがあります。 |
一般的な診断手順
環境名とインポートに失敗したクラスを特定します。たとえば、次のエラー メッセージでは、環境名は
test
で、クラス名はmy.class
です。Error in deployment for environment test The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
原因: JAR ファイルがない
診断
- クラス(上記のステップ 1 で特定)が含まれることになっているが、インスタンス化できなかった JAR ファイルを判別します。
- 特定の JAR ファイルが API プロキシレベルまたは環境レベルでアップロードされたかどうかを確認します。JAR ファイルがどのレベルにもアップロードされていない場合は、解決策に進みます。
- JAR ファイルがアップロードされている場合は、原因: JAR ファイルが破損をご覧ください。
解決策
- JAR ファイルが破損しているか部分的にアップロードされた場合は、JAR を再作成して、適切なレベル(API プロキシレベルまたは環境レベル)で JAR ファイルをアップロードします。
- API プロキシを再デプロイします。
原因: JAR ファイルが破損
診断
- インスタンス化できなかったクラス(上記のステップ 1 で特定)が含まれることになっている JAR ファイルを判別します。
- 特定の JAR ファイルが破損しているかどうかを確認します。たとえば、ファイルが解凍できない場合は、ファイルが破損していることや、部分的にアップロードされていることが原因です。ファイルが破損している場合は、解決策に進みます。
- JAR ファイルが破損していない場合は、原因: クラスファイルがないをご覧ください。
解決策
- 破損した JAR ファイルを再作成して、適切なレベル(API プロキシレベルまたは環境レベル)で JAR ファイルをアップロードします。
- API プロキシを再デプロイします。
原因: クラスファイルがない
診断
- 特定の Java クラスファイル(上記のステップ 1 で特定)が、>ResourceURL< または依存 JAR ファイルのいずれかで指定された JAR ファイルに含まれているかどうかを確認します。
- クラスファイルがどの JAR ファイルにも存在しない場合、これがエラーの原因であると判断します。解決策に進みます。
- JavaCallout ポリシーで指定された JAR ファイルにクラスファイルが存在する場合は、このエラーを引き起こす原因となる Java コードまたは依存クラスに問題があるはずです。サポートが必要な場合は、Apigee サポートにお問い合わせください。
解決策
- 欠落しているクラスファイルを含む JAR を再作成して、適切なレベル(API プロキシレベルまたは環境レベル)で JAR ファイルをアップロードします。
- API プロキシを再デプロイします。
JAR ファイルをアップロードする
すべての必要なクラスを含むリソース要素が API プロキシレベルまたは環境レベルで存在することを確認します。詳しくは、リソース ファイルをご覧ください。
API プロキシレベルでリソースをアップロードするには、[Resources] タブで +(プラス記号)をクリックして、[Import file] を選択し、ローカルマシンからファイルをアップロードします。ファイル名は >ResourceURL< 要素と一致する必要がありますが、
java://
接頭辞は付けません。同じ環境の複数の API プロキシでリソースを使用できるようにするには、その環境にリソースをアップロードします。リソース ファイルで説明されているように、Apigee API を使用する必要があります。
たとえば、ローカルマシンから次の API 呼び出しを入力して、指定したファイルを環境レベルでアップロードします。
curl -H "Content-Type: application/octet-stream" \ -X POST -H "Authorization: Bearer $TOKEN" --data-binary @{classes.jar} \ "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles?name=myresouce.jar&type=java"
ここで、OAuth 2.0 アクセス トークンの取得で説明されているように、
$TOKEN
は OAuth 2.0 アクセス トークンに設定されます。この例で使用されているcurl
オプションの詳細については、curl の使用をご覧ください。そのファイルと同じディレクトリから API 呼び出しを発行します。
組織内のすべての環境内のすべての API プロキシでファイルを利用できるようにするには、ベースパスの環境の詳細を省略します。次に例を示します。
curl -H "Content-Type: application/octet-stream" \ -X POST -H "Authorization: Bearer $TOKEN" --data-binary @{classes.jar} \ "https://apigee.googleapis.com/v1/organizations/$ORG/resourcefiles?name=myresouce.jar&type=java"
ここで、OAuth 2.0 アクセス トークンの取得で説明されているように、
$TOKEN
は OAuth 2.0 アクセス トークンに設定されます。この例で使用されているcurl
オプションの詳細については、curl の使用をご覧ください。