はじめに
Apigee は、APIプロキシで公開されたエンドポイントを文書化するための統合開発者ポータルを提供するAPI管理プラットフォームです。これにより、開発者はAPIを簡単に操作し、あまり複雑にすることなく慣れることができます。
すべてのAPIは変更される可能性があるため、これらの更新を反映するためにApigeeDeveloperPortalを変更する必要があります。ただし、API仕様を手動で更新することは、すぐに複雑な作業になります。
この記事では、ApigeeでAPIを更新するプロセスを自動化する方法について説明します。
前提条件
- Apigee開発者ポータル
Apigee DeveloperPortalAPIの自動更新
API仕様をApigee開発者ポータルに表示するには、次の3つが必要です。
- OpenAPI仕様 、略してスペックファイルと呼ばれます。私たちの場合、クラシックなペットショップを使用しています。
- API製品 –これはAPIのコレクションです。 Apigee Developer Portalはそれらと連携するため、APIを表示するためのポータルを作成します。デモンストレーションの目的で、API製品にはAPIが1つだけあります。
- 既存の開発者ポータル API製品と仕様を公開または更新します。
以下のセクションでは、ApigeeでAPIを更新するプロセスを自動化する方法について説明します。
ステップ1:API仕様をアップロードする
現在、Apigeeは、AdminAPIを介してAPI仕様をアップロードする手段を提供していません。 Apigee UIを使用して、API仕様を追加または更新します。
1.ファイルのインポートを選択します ペットショップ仕様をインポートするオプション。その間、Chrome DevTools(または同等のもの)を開いてください。
2.次の画像のように、API仕様(この例では「petshop」)が一覧表示されます。
3.API仕様が正常にアップロードされました。 ネットワークを参照して、バックグラウンドで何が起こったかを見てみましょう。 ChromeDevToolsのタブ。
API仕様を追加するには、最大で3つのAPI呼び出しが必要です。
-
POST
-
PUT
-
GET
POST、PUT、およびGETAPI呼び出し
以下は最初のAPI呼び出しです:
POST https://apigee.com/dapi/api/organizations/lukeb-eval/specs/doc
{
"folder": "173137",
"kind": "Doc",
"name": "petstore"
}
folder
:組織のスペックフォルダのID。各組織には1つのスペックフォルダがあり、変更されることはないため、これは常に同じです。kind
:この場合、常にDoc
になります ドキュメントをアップロードしているので。name
:API仕様の名前。強制されていませんが、一意の名前を使用してください。そうしないと、API仕様を表示するときに混乱する可能性があります。
この呼び出しの結果は、指定された名前で空のAPI仕様が作成されます。 Apigeeからの予想される応答は次のとおりです。
{
"id": "299536",
"kind": "Doc",
"name": "petstore",
"created": "2020-06-05T13:24:07.977Z",
"creator": "/orgs/lukeb-eval",
"modified": "2020-06-05T13:24:07.977Z",
"permissions": null,
"self": "/organizations/lukeb-eval/specs/doc/299536",
"content": "/organizations/lukeb-eval/specs/doc/299536/content",
"contents": null,
"folder": "/organizations/lukeb-eval/specs/folder/173137",
"folderId": "173137",
"body": null,
"trashed": false
}
id
をメモします 。次の呼び出しでこれを使用して、コンテンツを配置する必要のあるファイルをApigeeに通知します。
PUT https://apigee.com/dapi/api/organizations/lukeb-eval/specs/doc/299536/content
この呼び出しのリクエスト本文は、API仕様YAML全体です。応答として、Apigeeは 200 OK
で応答します 、 API仕様が正常にアップロードされたことを通知します。
最後の呼び出しは次のとおりです:
GET https://apigee.com/dapi/api/organizations/lukeb-eval/specs/folder/home
次の応答が生成されます:
{
"id": "173137",
"kind": "Folder",
"name": "/orgs/lukeb-eval root",
"created": "2019-06-06T07:39:58.805Z",
"creator": "/orgs/lukeb-eval",
"modified": "2019-06-06T07:39:58.805Z",
"permissions": null,
"self": "/organizations/lukeb-eval/specs/folder/173137",
"content": null,
"contents": [{
"id": "299536",
"kind": "Doc",
"name": "petstore",
"created": "2020-06-05T13:24:07.977Z",
"creator": "/orgs/lukeb-eval",
"modified": "2020-06-05T13:24:08.740Z",
"permissions": null,
"self": "/organizations/lukeb-eval/specs/doc/299536",
"content": "/organizations/lukeb-eval/specs/doc/299536/content",
"contents": null,
"folder": "/organizations/lukeb-eval/specs/folder/173137",
"folderId": "173137",
"body": null,
"trashed": false
}],
"folder": null,
"folderId": null,
"body": null,
"trashed": false
}
この時点で、スペックファイルが組織で利用可能であることがわかります。新しい仕様を追加した後、Apigeeが最新の仕様を表示するようにUIを更新する必要があるため、これが最後に実行される呼び出しです。
この呼び出しは、仕様を開くだけでも実行されます Apigeeのタブ。
HTTPリクエストを処理した後、仕様の作成または更新を自動化できるようになりました:
-
GET https://apigee.com/dapi/api/organizations/lukeb-eval/specs/folder/home
–これにより、folderId
が提供されます 。次の呼び出しで必要です。また、仕様がすでに存在するかどうかに応じて、仕様を作成または更新する必要があるかどうかも示します。 -
POST https://apigee.com/dapi/api/organizations/lukeb-eval/specs/doc
–仕様が存在しない場合は、この呼び出しを実行して空のファイルを作成します。 -
PUT https://apigee.com/dapi/api/organizations/lukeb-eval/specs/doc/299536/content
–仕様に最新情報を入力します。作成リクエストか更新リクエストかに応じて、id
仕様の一部は、手順1または2から取得できます。
これらの手順は、自動化スクリプト upload_spec.pyに反映されています。 。このスクリプトを正常に実行するには、次の引数が必要です。
name
–Apigeeにアップロードされるスペックの名前。これが一意でない場合、Apigeeの同じ名前の仕様が更新されます。file
–マシン上のスペックファイルのパス。-
org
–Apigeeでの組織名。 https://apigee.com/organizations/johnd-eval/proxies 組織名はjohnd-eval 。 username
–スクリプトがアクセストークンをフェッチするために使用するApigeeユーザーのユーザー名。このアクセストークンは、スクリプトによって実行されるすべてのREST呼び出しに使用されます。 access_tokenは12時間ごとに期限切れになります。通常、ここでは専用の自動化ユーザーが使用されます。password
–上記のユーザー名のパスワード。
上記の例の仕様を作成または更新するには、次を使用します。
upload_spec.py --name petstore --file petstore.yaml --org lukeb-eval --username $APIGEE_USER --password $APIGEE_PASSWORD
自動化パイプラインから得られる典型的な成功の結果は次のとおりです。
ステップ2:API製品のアップロード
自動化の取り組みでは、 upload_product.pyを作成しました 、ApigeeManagementAPIを活用してAPI製品を作成または更新します。
スクリプトを正常に実行するには、次の引数が必要です。
file
–作成するAPI製品を表すJSONファイル。作成方法の例は、ApigeeManagementAPIドキュメントの「API製品の作成」または「API製品の更新」セクションにあります。名前は、API製品が存在するかどうかを確認するために使用されるため、JSONファイルでは常に必須です。 API製品が存在する場合は、新しいJSONファイルで更新されます。-
org
–Apigeeでの組織名。 username
–スクリプトがアクセストークンをフェッチするために使用するApigeeユーザーのユーザー名。password
–上記のユーザー名のパスワード。
次のように実行できます:
upload_api_product.py --file product_settings.json --org lukeb-eval --username $APIGEE_USER --password $APIGEE_PASSWORD
自動化パイプラインから得られる典型的な成功の結果は次のとおりです。
ステップ3:API仕様を開発者ポータルにアップロードする
API仕様を更新しても、Apigee Developer Portalに最新の仕様が自動的に表示されるわけではなく、Apigeeは管理APIを介してこれを提供していません。
これはUIを介して手動で実行できるため、デベロッパーポータルでAPIドキュメントを作成または更新するためにどのAPI呼び出しが使用されているかを調査する必要があります。
1. API Apigeeで選択したポータルのセクションで、 + APIをクリックします ボタン:
2.API製品とAPI仕様を選択します。最後に、APIの名前と説明を追加し、[完了]をクリックします 。
3.完了を押す ボタンは次のHTTP呼び出しを促します:
POST https://apigee.com/portals/api/sites/lukeb-eval-portal/apidocs
{
"title": "Pet Store",
"description": "",
"edgeAPIProductName": "Pet Store",
"visibility": true,
"anonAllowed": true,
"requireCallbackUrl": false,
"specId": "petstore",
"specContent": "299536"
}
4.ポータルでAPI仕様を表示するには、次のパラメーターが必要です。
-
edgeAPIProductName
–以前に作成されたAPI製品の名前。 -
specId
–以前に作成された仕様の名前。 -
specContent
–以前に作成された仕様のファイルID。
紛らわしいことに、 specId
は実際には仕様の名前であり、その一意性はApigeeによって強制されません。自動化スクリプトでは、仕様に一意の名前が付けられていると想定しています。これは、 specContent
の取得に役立ちます。 specId
を介して さらに。
スペックが変更されたときにApigeeUIが何をするかを考えてみましょう。ペットショップの仕様が更新されると、デベロッパーポータルのAPI画面に次のように表示されます。
スペックスナップショットの管理をクリックする 右側の黄色の画像には、次の画面が表示されます。
スナップショットの更新をクリックします 。これにより、開発者ポータルが最新の仕様に更新されます。
APIリクエストの自動化
プロセスを自動化するには、3つのAPIリクエストが必要です。
GET https://apigee.com/portals/api/sites/lukeb-eval-portal/apidocs
1つ目は、次の応答を生成します。
{
"status": "success",
"message": "all visible apidocs returned",
"data": [{
"id": 57782,
"siteId": "lukeb-eval-portal",
"title": "Pet Store",
"description": "Pet Store Description",
"visibility": true,
"enrollment": null,
"apiId": "pet-store",
"edgeAPIProductName": "Pet Store",
"specId": "petstore",
"specContent": "299536",
"specTitle": null,
"snapshotExists": true,
"snapshotModified": 1591371293000,
"modified": 1591371290000,
"anonAllowed": true,
"imageUrl": null,
"snapshotState": "OK_DOCSTORE",
"requireCallbackUrl": false,
"categoryIds": [],
"productExists": true,
"specModified": null,
"snapshotOutdated": false,
"snapshotSourceMissing": false
}],
"request_id": "1309320113",
"error_code": null
}
自動化の観点から、このリクエストは開発者ポータルのIDを提供し、ポータルのすべての仕様を一覧表示します。
ポータルIDを取得したら、次のAPI呼び出しが必要です。
PUT https://apigee.com/portals/api/sites/lukeb-eval-portal/apidocs/57782
{
"specId": "petstore",
"imageUrl": null,
"visibility": true,
"anonAllowed": true,
"description": "Pet Store Description"
}
上記の呼び出しは、ポータルでのAPIの基本設定を確認するために使用されます。 ID 57782 リクエストURLの最後には、開発者ポータルのIDがあります。
完了すると、別のリクエストが実行されます:
PUT https://apigee.com/portals/api/sites/lukeb-eval-portal/apidocs/57782/snapshot
このリクエストには本文がなく、開発者ポータルに最新の仕様を表示するように指示します。
これらすべての情報により、ポータル仕様の展開を次のように自動化できるようになりました。
1. GET https://apigee.com/dapi/api/organizations/lukeb-eval/specs/folder/home
を使用します 表示したい仕様が存在することを確認します。
2. GET https://apigee.com/portals/api/sites/lukeb-eval-portal/apidocs
を含めます ポータルIDを取得し、ポータルで仕様を作成または更新する必要があるかどうかを確認します。
- 作成する必要がある場合:
POST https://apigee.com/portals/api/sites/lukeb-eval-portal/apidocs
- 更新する必要がある場合:
PUT https://apigee.com/portals/api/sites/lukeb-eval-portal/apidocs/57782
PUT https://apigee.com/portals/api/sites/lukeb-eval-portal/apidocs/57782/snapshot
この趣旨で、 upload_portal_documentation.py 自動化スクリプトが作成されました。これには次のパラメータが必要です:
file
–作成するAPIポータルドキュメントを表すJSONファイル。 JSONの例は、この投稿で以前に示されています。orgname
以降 およびspecId
パラメータとして提供されます。JSONファイルの一部にすることはできません。そうしないと、上書きされます。specContent
specId
から取得されます ただし、スペック名は常に一意であるという前提で作業しているためです。portal
–ドキュメントを作成するポータルのフルネーム。例えばhttps://johnd-eval-test.apigee.ioからポータルにアクセスする場合、ポータルのフルネームは johnd-eval-testです。 。-
org
– upload_spec.pyと同じ 。 username
– upload_spec.pyと同じ 。password
– upload_spec.pyと同じ 。
次のように実行できます:
upload_portal_documentation.py --file portal_documentation_setup.json --org lukeb-eval --spec_name petstore --portal portal --username $APIGEE_USER --password $APIGEE_PASSWORD
自動化パイプラインから得られる典型的な成功の結果は次のとおりです。
ステップ4:CI/CDパイプライン統合
これらのスクリプトはDockerイメージに含まれているため、CI/CDパイプラインにインポートして実行するのは非常に簡単です。
GitLabを例にとってみましょう:
apigee-spec-deploy:
image: ghcr.io/phoenixnap/apigee-automation:v1.0.0
stage: spec-deploy
variables:
SPEC_NAME: petstore
SPEC_PATH: petstore.yaml
APIGEE_PRODUCT: product.json
APIGEE_PORTAL_DOC: portal_documentation.json
script:
- /automation/upload_spec.py --name $SPEC_NAME --file $SPEC_PATH --org $ORG_NAME --username $APIGEE_USER --password $APIGEE_PASSWORD
- /automation/upload_api_product.py --file $APIGEE_PRODUCT --org $ORG_NAME --username $APIGEE_USER --password $APIGEE_PASSWORD
- /automation/upload_portal_documentation.py --file $APIGEE_PORTAL_DOC --org $ORG_NAME --spec_name $SPEC_NAME --portal $APIGEE_PORTAL --username $APIGEE_USER --password $APIGEE_PASSWORD
apigee-spec-deployというパイプラインジョブを作成しました 、画像をプルします apigee-automation GitHubパッケージから、必要なパラメーターを使用してここで説明した3つのPythonスクリプトを実行します。
スクリプトが失敗すると、GitLabジョブは実行を停止します。その場合、詳細なエラーが出力に表示されます。これにより、スクリプトが実行されるたびに、以前のスクリプトから必要なすべての情報が利用できるようになります。