Akamai、Guardicoreを買収。ゼロトラスト・ソリューションを拡張し、ランサムウェアの阻止能力を強化。 続きを読む

Blog

Akamai API入門 Part 1 — API Client & EdgeGrid

Written by

Shane Kim

January 08, 2021

2010年代以後、IT技術と環境の飛躍的な発展が進む一方、世界的な少子化の影響もありIT業界に従事するエンジニア数は減少傾向にあります。その結果、情報資産管理自動化の必要性が増し、運用管理文化の改革を求めるDevOps概念の普及が推し進められました。そしてDevOpsや自動化を可能とする、異なる操作方法を持った機種間の汎用操作インターフェース技術としてAPIが広く使われるようになりました。

AkamaiもDevOpsへの全面的な参加を表明し、Akamai {Open}プロジェクトという名の下で様々な活動を進めており、より多くのユーザーにAkamaiソリューションを活用した自動化を提供し続けるミッションを遂行してきました。特に単なるAPIの提供に留まらず、初心者の方にもAkamaiのAPIを利用した自動化を実現して頂けるよう、様々なツールやガイドを提供しています。

しかしながら、直接的に開発に縁がなかった方々にとってAPIやDevOpsはまだ開発者の専有物と思われる場合も多く、APIの利用を高い壁として感じてしまうこともあるようです。例えば、APIを使うためには様々なプログラミング言語を深く学び、ツールにも慣れる必要があるに違いないと考え、なかなか気軽に手が出せていないのではないでしょうか。

本記事ではプログラミングとあまり縁がない方が初めてAPIを使うといった観点で、AkamaiのAPIを探し、準備し、活用するまでの道のりを実例と共に説明します。特に、使いたいAPIの検索方法や、見つかったAPIを使っていくまでの流れを分かりやすく説明することに重点をおいています。本記事は二つのPartで構成されており、最後まで進めて頂くことで、必要なAPIをユーザー自身で検索でき、使って頂けることを目指します。なお、APIを利用した自動化に汎用性と柔軟性を持たせるため、開発者以外でも広く使われているPythonを利用します。本記事で使ったすべてのSource Codeも例として提供します。(Part 2の記事はこちら)

※Part 1 アジェンダ

 - AkamaiのDevOps紹介

 - Akamai API利用の第一歩

 - API Client作成

 - EdgeGridの準備 

【AkamaiのDevOps紹介】

AkamaiのDevOps活動は多方面で多く存在し、日々その領域を広げています。それらの情報は下記二つのサイトに集約されています。

 

https://developer.akamai.com ※以後、本記事ではDEVサイトと表現します。

AkamaiのDEVサイトでは主に下記情報を提供しています。

  • Akamai {Open}プロジェクトの全体像、各種DevOpsアプローチの紹介、それらのガイド提供
  • Akamai製品に関するAPI提供情報、API利用ガイド提供
  • 実技を加えたBlog記事やCase Studyなど、DevOpsにおけるAkamaiの活動内容全般の情報発信

なお、DEVサイト各ページの一番下にはサイトの表示言語を変更できる機能があります。例えばJapaneseを選択することでDEVサイトのコンテンツが日本語で表示されます。

翻訳機能利用中には各ページの一番上に元の言語に戻るためのオプションが現れます。なお、翻訳されたテキストにマウスカーソルを移動すると翻訳前の原文を確認できます。

翻訳機能を利用するとDEVサイト全体のテキストが選択した言語で表示され、英語が苦手な方でもDEVサイトに馴染みやすい仕組みとなっています。ただ、本機能は機械翻訳に依存するため原文の意図と異なる誤訳になってしまう可能性があります。加えて、表示テキストの変化により検索機能に影響することがあります。このような影響を防ぐため本記事は翻訳機能を使いません。必要に応じて翻訳機能をご利用いただければと思います。

https://github.com/akamai ※以後、本記事ではGITサイトと表現します。

AkamaiのGITサイトでは、GitHubを利用して実際DevOpsに活用できる各種コードとスクリプトのサンプルを提供しています。これらはAkamai社員が作成・管理していますが、Public GitHubなため誰でも意見を交わし、Feedbackすることができます。より積極的なDevOpsを目指す方にぜひご活用頂きたいサイトです。

ここまでDEVとGITの二つのサイトを紹介しました。両サイトの使い分けとしては、まず実現したいツールやAPIなどの情報をDEVサイトで探し、具体的なCode例やライブラリー、スクリプトが必要な場合はGITサイトを訪問してみるといった流れです。本記事では両サイトから情報を取得する形で説明します。 

【Akamai API利用の第一歩】

本記事ではウェブセキュリティ製品でよく利用するNetwork listをAPIで操作してみます。DEVサイトのトップメニューでGET STARTEDをクリックしてみましょう。左下にサブメニューが表示されます。私の目的はAPIなのでAPI Authenticationサブメニューに関連性高い情報があると想定できます。API Authenticationをクリックします。

少し話が逸れますが、API利用においてもセキュリティは非常に大事で、当然守られていますので普通はAPIのアクセス権限が必要となります。API接近権限を持つというのは、コンフィグレーション変更と同等の操作権限を持つ意味であり、必要な人物のみAPIを利用できるよう認証処理を行うのが一般的です。DEVサイトの話に戻りますが、今見えているページではAPI認証手順を紹介しています。どうやらAkamai APIを使うためAPI ClientをAkamai Control Centerで作成し、EdgeGridを準備する必要があるようです。まずは単語だけ覚えておきましょう。 

そして、同ページには関連性のある追加情報としてEdgeGrid Code ExamplesとBrowse Akamai APIsがありました。まずBROWSE APISボタンをクリックしてみます。

移動したページではAkamaiが提供するAPI機能を種別単位で確認できます。

本ページはトップメニューからでも移動できます。DOCS - API Docs順でクリックすると同じページに移動します。

検索バーにキーワードを入れることで関連性あるAPIのみ表示できます。私はNetwork ListsをAPIで操作したいのでnetworkと入力します。結果、入力したキーワードがAPI名又は説明に一致するものが表示されます。説明を読むと"Manage common sets of lists used by various Akamai security products and features"となっているNetwork Lists API v2が探しているAPIであることが分かります。API名のリンクをクリックします。

該当APIの詳細情報を提供するページに移動しました。Overviewを読むと私が求めるAPIで間違いないと判断できます。では、具体的にどのような操作ができるかを確認します。

同ページのAPI Summaryでは、本APIカテゴリで操作可能な機能一覧を確認できます。Network Listの確認、更新、追加、削除、適用まで運用に必要な機能が一通り揃っています。

ここまでの内容を整理します。

① APIを利用の認証情報としてAPI Clientが必要

② API認証情報を利用するときはEdgeGridを使う

③ 'Network Lists'をAPIで操作するためには'Network Lists API v2'を利用

AkamaiのAPIを使うために必要な準備物の確認と、使いたい機能のAPIを検索する方法を確認しました。これよりAPI ClientとEdgeGridについて確認します。

【API Client作成】

誰でもAPIアクセス・操作ができてしまうとセキュリティを守れないことはもちろん、設定変更によるサービスへの悪影響が発生する可能性もあります。よって各ユーザが使うAPI権限を制御する必要があります。Akamai APIではAPI ClientでAPIアクセス権限を制御します。これよりAPI Clientの作成方法を説明します。API Client作成はACC(=Akamai Control Center)で行います。

(※ACCのアカウントがない場合はAkamai担当者にお問合せください。)

ACCメニューバーでIdentity & Accessを選択頂くか、検索バーに"identity"と入力後に現れる検索結果の中でIdentity & Accessを選択します。

 

Identity and Access Managementメニューが表示されます。こちらはACCのユーザIDやAPI Clientを制御するメニューです。自分用のAPI Clientを作成するため、New API client for meをクリックします。

Customize API client画面に移動され、どのようにAPI Clientを作成するかを選択します。Quickは自分が所属しているグループ内の全APIに対する権限を一気に付与する方法です。Advancedは必要なAPIだけを選んで権限付与する方法です。私はAPI権限を制御したいのでAdvancedを選択します。

グループとは?

Akamaiは各種オブジェクト(配信設定等)を階層構造で管理しており、各階層のディレクトはグループと呼ばれます。ユーザIDが上位階層に所属していると該当階層を含め配下全グループの制御権限を持ちます。下記イメージで説明すると上位階層に所属しているユーザAはトップレベルとその配下のグループ全体に対する権限を持ちます。ユーザBとユーザCは所属しているグループ又はその配下グループに対する権限を持ちます。

ACCのSelect API optionでAdvancedを選択するとAdvanced設定画面に移動します。

新規API Clientに対する情報登録や権限制御を行う画面となり、下記情報を登録していきます。

  • Name:API Client名を記載します。
  • Description:API Clientを表す補足情報(テキスト)を残します。
  • Notification list:API ClientのCredential情報は2年間有効で、満了すると使えなくなるため更新が必要です。Notification listとしてemailアドレスを登録しておくとCredential満了が近づいたときにメールで通知します。
  • APIs:Select APIsを選択することで制御必要なAPI機能に限定してAPIアクセス権限を付与可能です。デフォルト(ALL APIs)では全APIアクセス権が付与されます。
  • Groups:Restrict groupsを選択することで制御必要なGroup(もしくはSub Group)のみAPIアクセス権限を付与可能です。デフォルト(Same groups as {user id name})では所属しているGroupを含め、配下の全Groupへのアクセス権が付与されます。
  • Purge selections:APIを利用したPurge操作の権限を制御できます。Purge APIを有効にするためにはAPIsでALL APIsを選択するか、Select APIsでCCU(Content Control Utility)権限を付与する必要があります。

Name、Description、Notification listを記入した後Select APIsを選択してAPI権限を制御します。Select APIsを選択すると下記のポップアップが表示され、最初は全APIアクセス権限が有効になっています。まずはClear API selectionをクリックし権限を初期化します。

API権限初期化後、権限を付与したいAPIを選びます。検索バーで使う機能のキーワードを入力するとAPI名やDescriptionが一致するAPIが表示されます。ここではNetwork ListsのAPIにREAD-WRITE権限を付与します。設定完了後Submitをクリックし変更内容を適用します。補足情報として、API名前をクリックすると該当APIドキュメントページ(DEVサイト)に移動できます。APIの情報を確認できるので、API権限付与のミスを防止できます。

Advanced設定画面に戻り、今度はGroups権限設定を確認します。Restrict groupsを選択すると下記ポップアップが表示されます。

最初はユーザIDが所属するGroupを含め、配下の全Groupの権限が付与されています。必要に応じて制御したいGroupを選択しましょう。Group権限を制御する方法はAPI制御と同じで、まずBlock all groupsをクリックし権限を初期化した後、権限を付与したいGroup名を検索バーで入力し該当Groupにチェックを入れます。本記事ではGroup権限制御に変更はせずデフォルト設定を使います。

Group制御設定完了後、Submitクリックで設定を適用しAdvanced設定画面に戻ります。設定内容を確認し問題なければCreate API clientをクリックします。

これでAPI Clientを作成できました。同時に本API  Clientを利用したAPI操作に必要なCredential情報も生成されました。Credential情報はAPI操作時に必ず必要なものです。特に、client_secret情報はCredentialが生成された一瞬でしか表示されないので、紛失しないようにDownloadやCopy credentialをクリックしてCredential情報のBackupを取っておくことを推奨します。client_secret情報を忘れてしまうと探す方法はなく、同ページのCreate credentialをクリックし新しいCredentialを作成する必要があります。

本ページでの作業は完了しましたので、一旦ACCのページから離れます。 

【EdgeGridの準備】

API Clientを作成し、APIアクセスに必要なCredential情報を取得しました。このCredential情報はどのように使えばいいのでしょう。本来はAkamai APIで定義されているスキームに沿ってCredential情報を利用したやり取りをもって認証処理行い、問題がなければAPIを利用できます。しかしこれらの過程はAPI利用者にとっては不便なもので、API利用のハードルを上げてしまいます。

この不便さを改善するため、AkamaiはAPI ClientのCredential情報を利用した認証スキームを処理するライブラリーを用意し、各種プログラミング言語やツールで利用できるよう配布しています。それがEdgeGridです。GITサイト(https://github.com/akamai)でedgegridと検索することで様々な環境に対応した情報が現れます。本記事で利用するPythonにおきましてはEdgeGridをPyPIにサードパーティライブラリーとして登録しているのでPIPを利用した簡単な設置も可能です。

本記事では非開発者にも広く普及しているPythonを利用してEdgeGridを使う準備を行います。Linuxはどれを選択頂いてもいいですが、Pythonは2.7ではなく3.7以上を使ってください。Python 2.7は正式なサポートが終了していて、Akamaiが提供するDevOps関連ツールやAPIでも一部利用できないものがあります。私はCentos7とPython 3.7.9を使いました。

まずEdgeGridライブラリーを設置します。二つの設置方法があり、PIPを利用する方法とSource Codeを利用する方法があります。これらの情報はGITサイト(https://github.com/akamai/AkamaiOPEN-edgegrid-python)でも確認可能です。

本記事ではPIPコマンドを利用します。下記はコマンド実行結果です。

(※赤字:入力&更新、青字:実行結果のポイント)

[elfin@localhost ~]# pip install edgegrid-python
Collecting edgegrid-python
Using cached edgegrid-python-1.1.1.tar.gz (11 kB)
Requirement already satisfied: requests>=2.3.0 in /usr/local/lib/python3.7/site-packages (from edgegrid-python) (2.24.0)
Requirement already satisfied: pyOpenSSL>=0.13 in /usr/local/lib/python3.7/site-packages (from edgegrid-python) (19.1.0)
Requirement already satisfied: ndg-httpsclient in /usr/local/lib/python3.7/site-packages (from edgegrid-python) (0.5.1)
Requirement already satisfied: pyasn1 in /usr/local/lib/python3.7/site-packages (from edgegrid-python) (0.4.8)
Requirement already satisfied: urllib3 in /usr/local/lib/python3.7/site-packages (from edgegrid-python) (1.25.10)
Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/site-packages (from requests>=2.3.0->edgegrid-python) (3.0.4)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/site-packages (from requests>=2.3.0->edgegrid-python) (2020.6.20)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/site-packages (from requests>=2.3.0->edgegrid-python) (2.10)
Requirement already satisfied: cryptography>=2.8 in /usr/local/lib/python3.7/site-packages (from pyOpenSSL>=0.13->edgegrid-python) (3.1)
Requirement already satisfied: six>=1.5.2 in /usr/local/lib/python3.7/site-packages (from pyOpenSSL>=0.13->edgegrid-python) (1.15.0)
Requirement already satisfied: cffi!=1.11.3,>=1.8 in /usr/local/lib/python3.7/site-packages (from cryptography>=2.8->pyOpenSSL>=0.13->edgegrid-python) (1.14.2)
Requirement already satisfied: pycparser in /usr/local/lib/python3.7/site-packages (from cffi!=1.11.3,>=1.8->cryptography>=2.8->pyOpenSSL>=0.13->edgegrid-python) (2.20)
Using legacy 'setup.py install' for edgegrid-python, since package 'wheel' is not installed.
Installing collected packages: edgegrid-python
Running setup.py install for edgegrid-python ... done
Successfully installed edgegrid-python-1.1.1

これでEdgeGrid設置が完了しました。後はAPI Clientの認証情報(Credential)をEdgeGridライブラリーで使えるようにする必要があります。二つの方法があります。

・Python Codeファイル(.py)に直接Credential情報を書き込む方法

・Credential情報ファイルを別途用意し、その中身を読み込む方法(LinuxユーザのHome Directoryに{.edgerd}ファイルを作成)

どの方法も動作結果の差はなく、どの方法を利用するかは自分が使う環境や好みに合わせて選択して頂きますが、本記事では{.edgerc}ファイルにCredential情報を登録して使う方法を利用します。補足情報として、{.edgerc}ファイルでCredential情報を登録しておくとPython以外のプログラミング言語やツールでもEdgeGridライブラリーを経由してAPIを使えます。

{.edgerc}ファイルを利用しEdgeGridを実行するためのPython Codeを準備します。一からCodeを作るのは大変なので、GITサイトコード例を引用します。GITサイトコード例に「>>>」の後ろにある文字列がPython命令文ですので、この命令文を抜粋してedgegrid-example.pyというファイルを作ります。ここで一つ注意点として、GITサイトの例にあるurlparseライブラリーはPython 2.7でしか使えず、Python 3.xではurllib.parseに名前が変わりました。下記はこれらの内容を反映したPython Codeファイルの作成例です。

[elfin@localhost ~]# cat> edgegrid-example.py
import requests
from akamai.edgegrid import EdgeGridAuth, EdgeRc
from urllib.parse import urljoin

edgerc = EdgeRc('~/.edgerc')
section = 'default'
baseurl = 'https://%s' % edgerc.get(section, 'host')

s = requests.Session()
s.auth = EdgeGridAuth.from_edgerc(edgerc, section)

result = s.get(urljoin(baseurl, '/diagnostic-tools/v2/ghost-locations/available'))
result.status_code
result.json()['locations'][0]['value']
(Ctrl+Dで入力終了) 

そして、自分のHome Directoryに{.edgerc}ファイルを作成し、BackupしておいたAPI ClientのCredential情報を貼り付きます。Credential情報を貼り付けるときに、そのCredentialの識別子(Section Name)を決めてかっこ([ ])で囲みます。ここでは[jp-blog]と命名しました。

[elfin@localhost ~]# cd ~
[elfin@localhost ~]# pwd
/home/elfin

[elfin@localhost ~]# cat> .edgerc
[jp-blog]
client_secret = 85OUDZLhmN3qRF9Xpg2ANTogVXbgKEBSRnj4S/7SwVE=
host = akab-h4sy2jdnd3ewvknx-6dqkikuck3x35dzx.luna.akamaiapis.net
access_token = akab-q4zrncp3ymvb6jbb-du5to3mwasvwp6yp
client_token = akab-5hvnngfcvucz2pcz-upn4xcuepvhpulcc
(Ctrl+Dで入力終了)

上記Credential情報は皆様のスムーズな理解のため元のCredential情報をそのまま記入していますが、本記事の公開時点では破棄しているので、使えません。皆様は各自が生成、取得できたCredential情報を使って{.edgerc}ファイルを作成ください。

これでEdgeGridライブラリーを使うための準備が完了しました。では次の記事で実際APIを使ってみます。(Part 2)



Written by

Shane Kim

January 08, 2021