Cato APIのためのPythonスクリプトの説明

この記事では、Cato APIの紹介とサンプルのPythonアプリケーションの分析を行います。

導入

Cato APIは、GraphQL 仕様に基づいて実装されています。 GraphQLは使いやすいAPIを生成することを目的としていますが、新しい技術を使いこなすには開発者の時間を投資する必要があります。 本ドキュメントの目的は、この投資のレベルを低下させ、admins Cato API呼び出しを実行し、アカウントに定義された管理者の数を単純に返す小さなPythonアプリケーションを案内することです。 その過程で、Cato GraphQL APIアプリケーションの重要な要素が読者に紹介されます。

注意

メモ:

読者には以下の基本的な理解が期待されています:

  • スクリプトまたはプログラミング(例:変数やコードライブラリの概念に精通している)

  • JSON 仕様(例:JSON文書を扱った経験がある)

  • ネットワーキング(例:HTTPプロトコルの存在とサーバーが何であるかを知っている)

Python言語についての多少の経験は役立ちますが、この記事を理解するのに必須ではありません。

基本的なCato APIアプリケーションの解説

ここで紹介されるアプリケーションはPythonで書かれており、Cato APIのadmins呼び出しを使用して、アカウントに定義されている管理者の総数を取得します。  Pythonとadmins API呼び出しが選ばれた理由は次の通りです:

  • Pythonは非常に一般的な言語であり、読みやすく、理解しやすい

  • admins API呼び出しは、Cato GraphQL APIの呼び出し例を非常にシンプルに作成するために使用できます

このサンプルプログラムは基本的でエラーチェックを含んでいません。  プログラムは、アカウントに定義された管理者の総数を表示するだけです。 

注意

注意: Cato APIは特定のプログラミング言語に結び付けられていません。  HTTP POST機能を使用し、JSON文書を処理できる言語であれば、どんな言語でもアプリケーションを実装することが可能です。  

サンプルプログラムの概要

このサンプルプログラムは短く、判断ロジックや動作を繰り返すコードを含んでいません。  コードのいくつかの行を1行にまとめることで、さらに短く保つことができました。  説明を容易にするために追加のコード行が含まれています。

# Pythonライブラリコードのインポート
import os
import urllib.request
import ssl
import json

# 環境変数からCato APIキーを取得
cato_api_key = os.getenv("CATO_API_KEY")

# 送信するGraphQL要求を作成
get_total_admins = '''{
    admins (accountID: 12345) {
        total        
    }
}'''
graphql_query = {'query': get_total_admins}

# HTTPリクエストの構築
cato_api_url = "https://api.catonetworks.com/api/v1/graphql2"
headers = {'x-api-key': cato_api_key,
           'Content-Type':'application/json'}
unverified_ctx = ssl._create_unverified_context()
json_post = json.dumps(graphql_query)
json_post_encoded = json_post.encode()
request = urllib.request.Request(url=cato_api_url, data=json_post_encoded, headers=headers)

# クエリを送信し、応答をPython辞書に変換
response = urllib.request.urlopen(request, context=unverified_ctx, timeout=30)
json_response_encoded = response.read()
json_response = json_response_encoded.decode()
get_admins_total_result = json.loads(json_response)

# 戻りデータから合計を抽出して出力
total = get_admins_total_result['data']['admins']['total']
print('アカウントに定義されている管理者の総数は: {}'.format(total))

注意

重要! このプログラムは、PythonでCato APIにアクセスする方法を示すデモンストレーションとして提供されています。 これは正式なCatoのリリースではなく、サポートの保証はありません。 エラーハンドリングは、スクリプトがAPIと協働するために必要な最低限に制限されており、本番環境には不十分かもしれません。

質問やフィードバックは、api@catonetworks.comまでお願い致します。

以下に提供された図は、プログラムが実行される際に発生するイベントの順序を示しています:

  1. プログラムはCato API GraphQLサーバーに送信されるJSON文書を作成します。

  2. Cato API GraphQLサーバーは、JSON文書内に定義されたAPI呼び出しが正しいかを確認し、Catoサービスから要求されたデータを取得します。

  3. Cato API GraphQLサーバーは、データをプログラムにJSONファイルとして返します。

Cato_API_FLow.jpeg

Pythonライブラリコードのインポート

サンプルプログラムにPythonを使用した理由の一つは豊富なライブラリセットの利用可能性です。  これらのライブラリは、幅広いタスクを処理できる関数とオブジェクトを提供します。  インポートした各ライブラリを通して、一つ一つそれが必要な理由を説明するノートを提供します。

import os
  • osライブラリは、コードがオペレーティングシステムの環境変数内のデータにアクセスすることができる機能を提供します。

import urllib.request
  • urllibライブラリのrequestモジュールは、URLを通じてリモートサーバーとの通信をハンドルできるオブジェクトを作成するRequestクラスを定義しています。

  • これにより、Cato GraphQL APIサーバーにCato API リクエストを送信することができます

import ssl
  • sslライブラリは、Cato GraphQL API サーバーに送信されるリクエストのためにカスタム未確認コンテキストを作成するために必要です。

import json
  • このライブラリには、Python辞書をJSON文字列に、またその逆に変換する機能があります。

  • この二つの異なるフォーマットの間で変換する能力により、JSON文書と協働できるコードを書くのが大幅に簡単になります。

Cato APIキーの取得

このコード行は、APIキーを環境変数から読み込み、変数に割り当てるためにgetenvライブラリ関数を使用します。

cato_api_key = os.getenv("CATO_API_KEY")

Cato GraphQLサーバーは、このキーをHTTPヘッダーで受け取ることを期待しています。  キーはJSON文書内で提供されていません、なぜならGraphQL仕様では認証が標準の一部として含まれていないからです。  JSON文書に認証を含めることは仕様の違反になります。  Cato APIキーはCato管理アプリケーションを通じて生成されます。  APIキーの作成方法についての詳細は、Cato APIのAPIキー生成を参照してください。

注意

警告! Cato APIキーをコードにハードコードすることは可能ですが、これは強く推奨されません。

送信されるGraphQL要求の作成

次のいくつかのコード行は、一つのキー/バリューペアを含むPythonディレクトリを作成します。  エントリーの値は、GraphQLサーバーに送信されるクエリを定義するPythonのマルチライン文字列を使用して構築されます。

get_total_admins = '''{
    admins (accountID: 12345) {
        total    
    }
}'''
graphql_query = {'query': get_total_admins}

Cato GraphQLサーバーは、この文字列を以下のように解釈します:関数get_total_adminsを実行し、二つの引数(accountIDとtype)を渡し、エンティティの「合計」数のみを返します。  または、より直接的に述べると、「例のアカウント # 12345 に定義された管理者のエンティティの合計数を返す」。  このadmins API呼び出しの具体的な例は、GraphQL APIの重要な利点を示しています

  • サーバーはアプリケーションが要求したデータのみを返します

実際には、admins呼び出しはもっと多くのデータを返すことができます。  たとえば、アプリケーションはadminsに各管理者の詳細を返すように要求することが可能です。  しかし、このアプリケーションが必要としているのは管理者の総数を知ることだけです。  GraphQLのこの特性により、過剰取得を回避し、アプリケーションを実装するために必要なコードを大幅に簡素化できます。

HTTPリクエストの構築

プログラムのこの部分では、要求オブジェクトが作成されます。  このオブジェクトはHTTPSを使用してGraphQLサーバーにAPI呼び出しを送信するために使われます。 この要求オブジェクトには、まず作成する必要のあるいくつかの他のオブジェクトから提供される情報が必要です。   まず最初に、要求オブジェクトがクエリを送信するGraphQLサーバーのURLを含むシンプルな文字列オブジェクトが作成されます。

cato_api_url = "https://api.catonetworks.com/api/v1/graphql2"

注意

注意: GraphQL APIはすべてのAPI呼び出しに一つのURLのみを使用します。  呼び出しの詳細(引数など)はJSON文書で提供されます。  これは、各API呼び出しに異なるURLを使用し、引数をURLに追加して呼び出しに渡すREST APIとは対照的です。  引数でごちゃごちゃしていない一つのURLだけを使うことは、GraphQL APIのもう一つの利点と考えられています。 

次に二つのHTTPヘッダーを定義する辞書が作成されます。  これらのヘッダーは、GraphQLサーバーが受け入れるHTTP POSTリクエストを構築するために要求オブジェクトで使用されます。  これらのヘッダーがなければ、HTTP POSTリクエストはサーバーによって拒否されます。

headers = {'x-api-key': cato_api_key,           
           'Content-Type':'application/json'}

次のコード行はSSLコンテキストオブジェクトを作成します。 Pythonはこのオブジェクトを使用して、HTTPリクエストをどのように暗号化し、トランスポートレベルセキュリティ(TLS)を使用して送信するかを決定します。 ここでは、証明書を検証しないSSLコンテキストオブジェクトを作成しています。 これは、上流のTLSインスペクションを受けるネットワークでの証明書エラーを回避するために行われました。

unverified_ctx = ssl._create_unverified_context()

注意

重要! 未検証のSSLコンテキストオブジェクトを使用することは、証明書が有効であることを確認するためのチェックが行われないことを意味します。 Cato Networksは、プロダクション環境でそのようなアプローチを使用しないことを推奨します。 セキュリティを強化する方法の詳細は、このドキュメントの範囲を超えています。

次の二行のコードは、Cato API呼び出しを含むPython辞書を文字列に変換し、その文字列をバイトにエンコードします。  この第二のステップは、文字列をネットワーク上で送信可能にするために必要です。

json_post = json.dumps(graphql_query)
json_post_encoded = json_post.encode()

最後に、要求オブジェクトが作成され、プログラムはサーバーにget_total_admins呼び出しを送信する準備が整いました。

request = urllib.request.Request(url=cato_api_url, data=json_post_encoded, headers=headers)

クエリの送信と応答の処理

ここでプログラムは、urllibライブラリのurlopen関数を呼び出すことによって、GraphQLサーバーにリクエストを送信します。  この関数の呼び出しは、HTTPResponseオブジェクトを返す結果となります。  

response = urllib.request.urlopen(request, context=unverified_ctx, timeout=30)

注意

警告! urlopen関数を呼び出すと、エラーが生成される可能性があります。  たとえば、GraphQLサーバーは文法エラーによりリクエストを拒否することが可能で、ネットワークの問題はタイムアウト(例:30秒後に応答なし)を引き起こすかもしれません。  これらのエラーはここでは処理されていません。

urlopen関数によって返されるオブジェクトには、サーバーによって返されたJSON文書を保持するボディフィールドが含まれています。  これは、そのreadメソッドを実行することによってオブジェクトから抽出することができる、バイトオブジェクトを返します。  このバイトオブジェクトは、そのバイトオブジェクトのデコードメソッドを呼び出すことで文字列オブジェクトに変換されます。

json_response_encoded = response.read()
json_response = json_response_encoded.decode()

このデコードされた文字列は、このように見えるJSON文書を含んでいます:

{
    "data" : {
         "admins" : {
              "total": 4
         }
    }
}

ご覧のように、返されたデータの形式は、サーバーに送信されたリクエストの形式と非常によく似ています。  これは意図的なものであり、APIを実装するためのGraphQL仕様を使用する利点の一つです。  このアプローチは、リクエストと同じ形状でデータを返すことで、アプリケーションのコーディングを簡素化します。

プログラムのこのセクションの最後のコード行は、返されたJSON文字列をPythonのネストされた辞書に変換するために json ライブラリ関数 'loads' を使用しています。  

get_total_admin_result = json.loads(json_response)

返されたデータから合計を抽出し、それを出力する

コードの最後の2行は、サーバーから返された total フィールドの値を抽出し、それをコンソールに出力します。 

total = get_total_admins_result['data']['get_total_admins']['total']
print('The total number of admins defined for your account is: {}'.format(total)) 

出力は次のようになります。

The total number of admins defined for your account is: 4

概要

このドキュメントの目的は、Cato APIの使用がいかに簡単であるかを読者に示すことでした。  Cato APIに関する詳細な情報は含まれておらず、エラーを処理するためのコードは記述されていません。  代わりに、シンプルなPythonプログラムを使用して、Cato APIアプリケーションの最も重要な要素を強調しました。  それらは次の通りです:

  • Cato APIの呼び出しを作成し、それをJSONドキュメントに追加する

  • Cato APIキーを取得する

  • Cato APIキーを含み、送信されるデータの形式(JSON)を定義するHTTPヘッダーを作成する

  • TLSで暗号化されたHTTP POSTコマンドを使用して、Cato GraphQl APIサーバにバイトでエンコードされたJSONドキュメントを送信する

  • サーバーから返されたレスポンスオブジェクトをJSONドキュメントに変換する

  • JSONドキュメントをプログラムで使用できる形式に変換する

この記事は役に立ちましたか?

5人中5人がこの記事が役に立ったと言っています

0件のコメント