CTC 教育サービス
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes
みなさん、こんにちは。
前回は、PythonからREST APIを呼び出す基本として、requests.get()、requests.post()、HTTPヘッダー、JSON、ステータスコードを取り上げました。API連携ができると、ネットワーク機器だけでなく、監視システム、IPアドレス管理、構成管理データベース、クラウドサービスなどとも連携しやすくなります。
ただし実務では、APIを呼べるだけでは不十分です。APIトークンをコードに直接書かないこと、応答がないときにスクリプトを止め続けないこと、HTTPエラーを見落とさないことが重要です。複数の機器やサービスをまとめて処理するネットワーク自動化では、1か所の失敗が全体に影響しやすいためです。
今回は、前回のREST API連携を踏まえ、環境変数による認証情報の扱い、requestsのtimeout、HTTPエラーを例外として扱う方法を確認します。たとえば、夜間バッチで複数拠点の機器情報をAPIから取得するようなケースでは、認証情報の扱いが雑だとセキュリティ事故につながりますし、タイムアウトや例外処理が弱いと、1つのAPI停止で処理全体が止まってしまいます。小さなスクリプトでも、最初から運用を意識した書き方にしておくことが大切です。試験対策としても、実務で安全な自動化を書くためにも、押さえておきたい内容です。
PythonスクリプトからAPIトークンを利用したい。セキュリティを考慮した扱いとして、最も適切なものはどれか。
A. APIトークンをソースコード内に文字列として直接書く
B. APIトークンを環境変数から読み取り、HTTPヘッダーに設定する
C. APIトークンをコメントとしてコード内に残しておく
D. APIトークンをURLの末尾に必ず付けて送信する
正解
B
解説
正解はBです。APIトークンやパスワードのような認証情報は、ソースコードに直接書かず、環境変数やシークレット管理の仕組みから読み取るのが基本です。Pythonでは、標準ライブラリの os.environ を使って環境変数を参照できます。
token = os.environ.get("API_TOKEN")
Aは、Gitへのコミットやコード共有を通じてトークンが漏えいする可能性があるため不適切です。Cもコメントなら安全というわけではなく、コード内に残る以上は同じリスクがあります。DのようにURLへトークンを含める方法も、ログや履歴に残りやすいため注意が必要です。
なお、実務では、開発環境、本番環境、CI/CD環境でトークンをどう設定するかまで考えましょう。試験では os.environ.get() の使い方と、認証情報を直書きしない理由を押さえておくことがポイントです。
また、環境変数が設定されていない場合の扱いも重要です。値が None のままAPIを呼び出すと、認証エラーになるだけでなく、動作不良の原因に気づきにくいことがあります。必要な環境変数が存在するかを起動時に確認し、不足していれば分かりやすいメッセージを出す設計にすると、運用時の切り分けが楽になります。
requests を使ってREST APIを呼び出すスクリプトがある。相手システムから応答が返らない場合に、処理が長時間止まり続けることを防ぎたい。最も適切な指定はどれか。
A. requests.get(url, timeout=10) のように timeout を指定する
B. requests.get(url, wait=True) のように wait を指定する
C. requests.get(url).json(timeout=10) のように .json() に timeout を指定する
D. time.sleep(10) をAPI呼び出しの前に必ず入れる
正解
A
解説
正解はAです。requests では、get() や post() などのリクエスト送信時に timeout を指定できます。相手APIの応答が遅い、経路に問題がある、APIサーバが停止しているといった場合に、スクリプトが待ち続けることを防げます。
response = requests.get("https://example.com/api/devices", timeout=10)
Bの wait=True は requests の一般的な引数ではありません。Cは指定する場所が誤りです。.json() はレスポンス本文をJSONとして読み取る処理であり、通信の待ち時間を制御するものではありません。Dの time.sleep(10) は処理を止めるだけで、API通信のタイムアウト対策にはなりません。
実務では、timeout の値を短すぎても長すぎても扱いづらくなります。対象APIやネットワーク環境に合わせ、失敗時にはログを残して次の対象へ進める設計にすると、自動化スクリプトを運用しやすくなります。特に、多数の機器を順番に処理する場合、timeout の有無は全体の実行時間に直結します。1台あたりの待ち時間が数十秒違うだけでも、対象が数十台、数百台になると大きな差になりますので注意しましょう。試験では引数名を覚えるだけでなく、なぜネットワーク自動化で必要になるのかも意識するとよいでしょう。
REST APIを呼び出した結果、HTTPステータスコードが 404 や 500 の場合に、成功時と同じ処理を続けないようにしたい。requests でHTTPエラーを例外として扱う方法として、最も適切なものはどれか。
A. response.raise_for_status() を呼び出す
B. response.json() を呼び出せば、HTTPエラーは必ず例外になる
C. response.status_code = 200 と代入する
D. requests.get() の戻り値を print() すれば、エラー処理は不要になる
正解
A
解説
正解はAです。response.raise_for_status() は、HTTPステータスコードが 400 番台や 500 番台の場合に HTTPError 例外を発生させるメソッドです。成功時とエラー時の処理を分けたい場合に役立ちます。
response.raise_for_status()
Bは誤りです。.json() はレスポンス本文をJSONとして読み取るための処理で、HTTPステータスコードの成功・失敗を判断するものではありません。Cのように status_code を200へ書き換えるのは、エラーを隠すだけで原因調査を難しくします。Dも表示するだけで、後続処理を止めるかどうかの制御にはなりません。
実務では、raise_for_status()、timeout、例外処理、logging を組み合わせます。たとえばIPAMから機器情報を取得できなかった場合は、対象機器名とエラー内容をログに残し、必要に応じて次の機器へ進むようにします。失敗を無視せず、かつ全体を止めすぎないことが大切です。
今回は、REST API連携を実務で使う際に重要になる、APIトークンの扱い、timeout 指定、raise_for_status() によるHTTPエラー処理を簡単に確認しました。
これらは単独で使うだけでなく、組み合わせることで価値を発揮します。環境変数で認証情報を安全に扱い、timeout で待ち続けることを防ぎ、HTTPエラーを例外として検知できるようにすると、自動化スクリプトの信頼性は高まります。
次回は、取得したデータをCSVやExcel、ログファイルとして出力するなど、レポート作成や運用記録に近いテーマを扱う予定です。APIや機器から情報を取るだけで終わらせず、人が確認しやすい形に整えるところまで意識していきましょう。
[IT研修]注目キーワード Python Power Platform 最新技術動向 生成AI Docker Kubernetes