Akamai Diversity

Akamai Japan ブログ

Akamai API入門 Part 2 - APIの活用

前回の記事ではAkamai APIの紹介と、APIを利用するまでの基本的な準備を行いました。今回は実際にAPIを実行し、結果確認、及び応用まで実践します。

 

※Part 2 アジェンダ

 - API情報探し

 - API利用の基礎

 - API動作結果確認

 - API活用

 - サマリ

 

 

【API情報探し】

前の記事で押さえた内容を踏まえてAPIを利用してみます。Network Lists API v2ドキュメントを確認するところから始めます。

shki_api_b-01.png

APIドキュメントにもGet startedと書いた内容がありますね。読むとAPIを初めて使うときの必要事項を説明していることが分かります。

client tokenを取得すること。client tokenは [https://akzz-XXXXXXXXXXXXXXXX-XXXXXXXXXXXXXXXX.luna.akamaiapis.net.] といったフォーマットである。

・Network ListsというAPIのアクセスレベルがREAD-WRITEであること。

 

前の記事でAPI Clientを作成した際にCredential情報の一つとしてclient tokenを得ており、Network Lists APIをREAD-WRITE権限にしましたのでAPI利用条件を満たしています。今度はAPIの種類を確認します。同ページのAPI summary情報に利用可能なAPIの一覧があり、API利用に使うHTTPリクエストMethodAPI Endpoint URLが記載されています。

shki_api_b-02.png

 

まず一番上にあるList network lists APIを利用してみます。MethodがGETなのでシステムに変更を加えることなく試験用として使うには最適です。List network listsリンクをクリックすると該当APIの詳細情報に移動します。説明ではNetwork Listの情報を確認するAPIとなっています。なお、Request / Parameters / Response / Stepsという4つの情報を提供しています。Request情報ではリクエストに必要なParametersを加味したAPI endpointの作成例が用意されています。

shki_api_b-03.png

 

Parametersをクリックすると各パラメーターの情報が表示されます。本APIのパラメーターはOptional query parametersなので必須ではないですが、一応見てみましょう。

shki_api_b-04.png

・extended - Network listの作成者や更新者、Staging及びProduction環境におけるActivation情報をレスポンスに含めることができます。

・includeElements - list情報をレスポンスに含めることができます。listには実際制御対象IPやGEO情報が入っています。

・listType - Network listにはIPとGEOタイプがあり、レスポンスに片方のみ含めることができます。

・search - Network list nameやlist情報の中に特定キーワードが入っているNetwork listのみをレスポンスに含めることができます。

 

Response情報を見てみます。ここではAPIリクエストが成功した際の期待されるレスポンス情報を参考情報として提供しています。

shki_api_b-05.png

 

最後にStepsをクリックすると本APIを使うための手順が表示されます。

shki_api_b-06.png

 

このようにRequest / Parameters / Response / Stepsという4つの情報を利用して各APIの使い方について理解できます。他API利用時にもこれらの情報を活用します。

shki_api_b-07.png

  

【API利用の基礎】

APIを実行する前に情報を取得したいNetwork listを確認します。私はアクセス権限があるNetwork list中、shki-ipとshki-locationという2つのNetwork listを使っています。shki-ip-blogは生成してはいますが、まだ使ってないものです。この3つの中でもshki-ipを見てみたいと思います。このNetwork listはIPタイプで、7つのIPが入っており、Staging及びProduction展開が完了しています。

shki_api_b-08(new).png

 

では、前の記事で準備したEdgeGridライブラリーを使うためのPython Codeファイルを作成します。前の記事で作ったサンプルファイルを修正して使います。まず、元のコードを読みやすいようにコメントを付けました。Import Library、Credential & Requests、Perform & Resultの3つに分けました。更に今後POSTやPUTリクエストで使うHeader & Bodyデータ部も枠として入れておきます。

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

### Import Library ###
import requests
from akamai.edgegrid import EdgeGridAuth, EdgeRc
from urllib.parse import urljoin

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

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

### Header & Body ###

### Perform & Result ###
result = s.get(urljoin(baseurl,'/diagnostic-tools/v2/ghost-locations/available'))
result.status_code
result.json()['locations'][0]['value']

 

一つずつ見てみます。まずImport Libraryではrequests、edgegrid、url.parseモジュールを呼び込んでいます。このままでもAPIは使えますが、RequestとResponseでJSONデータ形式をよく使うのでJSONモジュールも追加しておきます。

### Import Library ###
import requests
import json
from akamai.edgegrid import EdgeGridAuth, EdgeRc
from urllib.parse import urljoin

 

次はCredential & Requestsです。{.edgerc}ファイル内の識別子(Section)を[jp-blog]としましたが、デフォルトは[default]なため文字列を変更します。なお、{.edgerc}ファイルが存在するディレクトリを絶対経路で登録します。私のユーザ名は'elfin'なため、'/home/elfin/'配下に{.edgerc}ファイルが置かれることになります。

### Credential & Requests ###
edgerc = EdgeRc('/home/elfin/.edgerc')
section = 'jp-blog'
baseurl = 'https://%s' % edgerc.get(section, 'host')

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

 

Header & BodyではPUTやPOST Methodを利用しAPIリクエストする際に必要なHeaderやBody情報を定義します。List network lists APIはGET MethodなためHeaderやBodyを付与する必要はありませんが、後ほどPUTやPOST Methodを使うので事前にHeaderのContent-typeを入れておきます。Bodyは使いませんので任意の値('null')を宣言しておきました。

### Header & Body ###
headers = {'Content-Type':'application/json'}
body = 'null'

 

最後、Perform & Resultです。使うAPIのRequest例にあった情報を反映します。

shki_api_b-09.png

### Perform & Result ###
result = s.get(urljoin(baseurl,'/network-list/v2/network-lists?includeElements,search,extended,listType}'))
result.status_code
result.json()['locations'][0]['value']

 

次は、パラメーターの宣言が必要です。ここでは「興味を持つNetwork listに対する最大限の情報を見たい」という想定で、下記3つのパラメーターを反映します。listTypeは指定しません。

・includeElements=true

・extended=true

・search=shki

### Perform & Result ###
result = s.get(urljoin(baseurl,'/network-list/v2/network-lists?includeElements=true&extended=true&search=shki'))
result.status_code
result.json()['locations'][0]['value']

 

また、実行結果全体を見やすく表示するため下記のように変更します。ここで先ほど追加したJSONモジュールを使います。

### Perform & Result ###
result = s.get(urljoin(baseurl,'/network-list/v2/network-lists?includeElements=true&extended=true&search=shki'))
print('Response Code is',result.status_code)
print(json.dumps(result.json(),indent=2))

 

これでCode更新完了しました。下記が完成したCodeとなります。このPython Codeを適当な別の名前で保存します。

[elfin@localhost ~]# cat> list-network-lists-API.py
### Import Library ###
import requests
import json
from akamai.edgegrid import EdgeGridAuth, EdgeRc
from urllib.parse import urljoin

### Credential & Requests ###
edgerc = EdgeRc('/home/elfin/.edgerc')
section = 'jp-blog'
baseurl = 'https://%s' % edgerc.get(section, 'host')

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

### Header & Body ###
headers = {'Content-Type':'application/json'}
body = 'null'

### Perform & Result ###
result = s.get(urljoin(baseurl,'/network-list/v2/network-lists?includeElements=true&extended=true&search=shki'))
print('Response Code is',result.status_code)
print(json.dumps(result.json(),indent=2))
(Ctrl + Dで入力終了)

 

では、APIを実行してみます。

[elfin@localhost ~]# python3 list-network-lists-API.py
Response Code is 200
{
  "links": {
    "create": {
      "href": "/network-list/v2/network-lists",
      "method": "POST"
    }
  },
  "networkLists": [
    {
      "accessControlGroup": "Akamai Japan - 1-GNLXD - 1-GNLXD.G20628",
      "createDate": "2020-05-25T04:43:35.128+00:00",
      "createdBy": "shki",
      "description": "Updated notes about this network list",
      "elementCount": 3,
      "expeditedProductionActivationStatus": "INACTIVE",
      "expeditedStagingActivationStatus": "INACTIVE",
      "links": {
        "activateInProduction": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/environments/PRODUCTION/activate",
          "method": "POST"
        },
        "activateInStaging": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/environments/STAGING/activate",
          "method": "POST"
        },
        "appendItems": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/append",
          "method": "POST"
        },
        "retrieve": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS"
        },
        "statusInProduction": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/environments/PRODUCTION/status"
        },
        "statusInStaging": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/environments/STAGING/status"
        },
        "update": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS",
          "method": "PUT"
        }
      },
      "list": [
        "192.0.2.3/32",
        "192.0.2.1/32",
        "192.0.2.2/32"
      ],
      "name": "shki-ip",
      "networkListType": "extendedNetworkListResponse",
      "productionActivationStatus": "ACTIVE",
      "readOnly": false,
      "shared": false,
      "stagingActivationStatus": "ACTIVE",
      "syncPoint": 4,
      "type": "IP",
      "uniqueId": "79103_REPUTATIONWHITELISTKSDS",
      "updateDate": "2020-12-22T07:48:53.404+00:00",
      "updatedBy": "shki"
    },

<<<<< 'shki-IP-blog'情報省略 >>>>>

    {
      "accessControlGroup": "Akamai Japan - 1-GNLXD - 1-GNLXD.G20628",
      "createDate": "2020-05-25T10:29:29.965+00:00",
      "createdBy": "shki",
      "elementCount": 2,
      "expeditedProductionActivationStatus": "INACTIVE",
      "expeditedStagingActivationStatus": "INACTIVE",
      "links": {
        "activateInProduction": {
          "href": "/network-list/v2/network-lists/79125_SHKILOCATION/environments/PRODUCTION/activate",
          "method": "POST"
        },
        "activateInStaging": {
          "href": "/network-list/v2/network-lists/79125_SHKILOCATION/environments/STAGING/activate",
          "method": "POST"
        },
        "appendItems": {
          "href": "/network-list/v2/network-lists/79125_SHKILOCATION/append",
          "method": "POST"
        },
        "retrieve": {
          "href": "/network-list/v2/network-lists/79125_SHKILOCATION"
        },
        "statusInProduction": {
          "href": "/network-list/v2/network-lists/79125_SHKILOCATION/environments/PRODUCTION/status"
        },
        "statusInStaging": {
          "href": "/network-list/v2/network-lists/79125_SHKILOCATION/environments/STAGING/status"
        },
        "update": {
          "href": "/network-list/v2/network-lists/79125_SHKILOCATION",
          "method": "PUT"
        }
      },
      "list": [
         "pl",
         "kp"
      ],
      "name": "shki-location",
      "networkListType": "extendedNetworkListResponse",
      "productionActivationStatus": "ACTIVE",
      "readOnly": false,
      "shared": false,
      "stagingActivationStatus": "ACTIVE",
      "syncPoint": 2,
      "type": "GEO",
      "uniqueId": "79125_SHKILOCATION",
      "updateDate": "2020-11-16T08:11:27.433+00:00",
      "updatedBy": "shki"
    }
  ]
}

レスポンスデータがJSON形式で出力されました。Akamai API動作結果確認は初めてなので、一つずつ読んでみます。

 

 

【API動作結果確認】

出力結果データを区分けし説明します。

Response Code is 200

最初の出力結果データにより、HTTPレスポンスコードを確認できます。この結果では200ですが、本API実行結果にとって200はどういった意味でしょうか?その答えはAPIドキュメントページの一番下にあるHTTP status codesで確認できます。Network list API v2では200が戻ってきたらAPIオペレーションは成功です。他レスポンスコードに対する情報もあり、間違った結果が戻ってきた際のトラブルシューティングで活用できる情報です。

shki_api_b-10.png次は"links"というものがあります。

  "links": {
    "create": {
      "href": "/network-list/v2/network-lists",
      "method": "POST"
    }
  },

"links"は各API endpointに対し更に利用可能なAPI endpointを知らせるものです。APIドキュメントページではHypermediaという表現で説明しています。

"networkLists"オブジェクト配下に各Network listの情報が入っています。

  "networkLists": [
    {
      "accessControlGroup": "Akamai Japan - 1-GNLXD - 1-GNLXD.G20628",
      "createDate": "2020-05-25T04:43:35.128+00:00",
      "createdBy": "shki",
      "description": "Updated notes about this network list",
      "elementCount": 3,
      "expeditedProductionActivationStatus": "INACTIVE",
      "expeditedStagingActivationStatus": "INACTIVE",
      "links": {
        "activateInProduction": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/environments/PRODUCTION/activate",
          "method": "POST"
        },
       [other links]
          ...
        },
     },

AccountやGroup名、作成日、作成者、Descriptionなどの情報を確認できます。ここにも"links"が存在し、個々のNetwork list単位で使えるAPI endpoint情報を示しています。

継続して"networkLists"配下の"list"ですが、該当Network listに登録されたIPやGEO情報を表します。

      "list": [
        "192.0.2.3/32",
        "192.0.2.1/32",
        "192.0.2.2/32"
      ],
      "name": "shki-ip",
      "networkListType": "extendedNetworkListResponse",
      "productionActivationStatus": "ACTIVE",
      "readOnly": false,
      "shared": false,
      "stagingActivationStatus": "ACTIVE",
      "syncPoint": 4,
      "type": "IP",
      "uniqueId": "79103_REPUTATIONWHITELISTKSDS",
      "updateDate": "2020-12-22T07:48:53.404+00:00",
      "updatedBy": "shki"
    },

その他Network list名Activation状態Type(IP or GEO)Network listのID(uniqueId)などの情報を確認できます。

ID情報はAPIを利用してNetwork listを操作するときに必要な情報なため、別途管理することをお勧めします。下記は操作時にIDが必要なAPIの一覧です。

shki_api_b-11.png

 

各Network listを操作するAPI利用時には{networkListId}が必要で、この情報がAPI実行結果ではuniqueIdと表示されます。以下は「Get a network list」APIの例です。

shki_api_b-12.png

 

一つ目のNetwork listの情報出力が終わった後、続けて他Network list(shki-IP-blog, shki-location)の情報が表示されています。

出力される情報は一緒なため、解析は割愛します。

 

今度は、同じAPI endpointでOptional Parametersを変更して表示される情報の量を制限してみます。下記Codeのみ変更しました。

### Perform & Result ###
result = s.get(urljoin(baseurl,'/network-list/v2/network-lists?includeElements=false&extended=false&search=shki&listType=IP'))

 

以下、API実行結果です。

[elfin@localhost ~]# python3 list-network-lists-API.py
Response Code is 200
{
  "links": {
    "create": {
      "href": "/network-list/v2/network-lists",
      "method": "POST"
    }
  },
  "networkLists": [
    {
      "accessControlGroup": "Akamai Japan - 1-GNLXD - 1-GNLXD.G20628",
      "description": "Updated notes about this network list",
      "elementCount": 3,
      "links": {
        "activateInProduction": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/environments/PRODUCTION/activate",
          "method": "POST"
        },
        "activateInStaging": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/environments/STAGING/activate",
          "method": "POST"
        },
        "appendItems": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/append",
          "method": "POST"
        },
        "retrieve": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS"
        },
        "statusInProduction": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/environments/PRODUCTION/status"
        },
        "statusInStaging": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS/environments/STAGING/status"
        },
        "update": {
          "href": "/network-list/v2/network-lists/79103_REPUTATIONWHITELISTKSDS",
          "method": "PUT"
        }
      },
      "name": "shki-ip",
      "networkListType": "networkListResponse",
      "readOnly": false,
      "shared": false,
      "syncPoint": 4,
      "type": "IP",
      "uniqueId": "79103_REPUTATIONWHITELISTKSDS",
    }

<<<<< 'shki-IP-blog'情報省略 >>>>>

  ]
}

パラメーターを変更して情報表示量を制御することができ、情報量を絞ることができました。呼び込むAPIデータが減るので、APIレスポンス時間が短縮する効果もあります。

 

本章ではNetwork list API v2の基本的なAPIを操作してみました。その結果様々な情報を取得でき、uniqueIdという個別Network listのAPI操作時に必要な情報を得ることができました。次はuniqueIdを用いて本格的にNetwork list APIを利用してみます。

 

 

【API活用】

これまでAPIの使い方及び結果確認方法を学習しました。ここからは今まで取得したAPI操作方法を活用し、Network listの作成、更新、適用(Activation)まで実践します。まずは新しいNetwork listを作ります。API summaryでAPI一覧を確認すると「Create a new network list」APIがありました。このAPIで新しいNetwork listが作れそうです。

shki_api_b-13.png

Request情報を見るとNetwork list作成に必要なFieldを埋めるためPOST Methodを使うことが分かります。Request Bodyには必要な情報を埋め込みます。

 

Steps情報には最低でもnameとtype情報が必要とされています。

shki_api_b-14.png

これらの情報に従ってPython Codeを作成します。Body情報はDEVサイトの例文をCopy and Pasteしてきて、必要な部分のみ修正しました。

[elfin@localhost blog_network_lists_v2]# cat create-new-list_test.py
### Import Library ###
import requests
import json
from akamai.edgegrid import EdgeGridAuth, EdgeRc
from urllib.parse import urljoin

### Credential & Requests ###
edgerc = EdgeRc('/home/elfin/.edgerc')
section = 'jp-blog'
baseurl = 'https://%s' % edgerc.get(section, 'host')

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

### Header & Body ###
headers = {'Content-Type':'application/json'}
body = {
    "name": "shki-IP-blog-2",
    "type": "IP",
    "description": "Welcome to APIs' ocean!",
    "list": ["198.51.100.1/32","198.51.100.2/32"]
}

### Perform & Result ###
result = s.post(urljoin(baseurl,'/network-list/v2/network-lists'),headers=headers,data=json.dumps(body))
print('Response Code is',result.status_code)
print(json.dumps(result.json(),indent=2))

POSTリクエストでHeaderとBody情報を入れることを忘れないでください。

 

JSON形式でBodyデータを追加し、POST MethodでHeaderとBody情報を送ります。下記はAPIの実行結果です。

[elfin@localhost blog_network_lists_v2]# python3 create-new-list_test.py
Response Code is 201
{
  "description": "Welcome to APIs' ocean!",
  "links": {
    "activateInProduction": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/PRODUCTION/activate",
      "method": "POST"
    },
    "activateInStaging": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/STAGING/activate",
      "method": "POST"
    },
    "appendItems": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/append",
      "method": "POST"
    },
    "retrieve": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2"
    },
    "statusInProduction": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/PRODUCTION/status"
    },
    "statusInStaging": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/STAGING/status"
    },
    "update": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2",
      "method": "PUT"
    }
  },
  "list": [
    "198.51.100.1/32",
    "198.51.100.2/32"
  ],
  "name": "shki-IP-blog-2",
  "networkListType": "networkListResponse",
  "readOnly": false,
  "shared": false,
  "syncPoint": 0,
  "type": "IP",
  "uniqueId": "97176_SHKIIPBLOG2"
}

 

IP Listを二つ持つNetwork listが生成されました。POSTで情報入力したBodyも反映できました。IDは94780_SHKIIPBLOGです。次はこのIDを利用してNetwork listのIPに変更を加えます。既存Network listのIP/GEO Listを変更する方法として4つのAPIを用意されています。

・Update a network list - list全体を書き換える(上書き)

・Append elements to a network list - 新しいlistを追加する(複数可能)

・Add an element - 新規IPやGEO listを一つ追加する

・Remove an element - 既存IPやGEO listを一つ削除する

 

ここでは、複数のIPを同時に追加できる「Append elements to a network list」APIを利用します。

shki_api_b-15.png

 

Python Codeとしては下記となります。API endpointにIDを入れるところを忘れないでください。

[elfin@localhost blog_network_lists_v2]# cat append-IP-list_test.py
### Import Library ###
import requests
import json
from akamai.edgegrid import EdgeGridAuth, EdgeRc
from urllib.parse import urljoin

### Credential & Requests ###
edgerc = EdgeRc('/home/elfin/.edgerc')
section = 'jp-blog'
baseurl = 'https://%s' % edgerc.get(section, 'host')

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

### Header & Body ###
headers = {'Content-Type':'application/json'}
body = {
    "list": ["203.0.113.1/32","203.0.113.2/32"]
}

### Perform & Result ###
result = s.post(urljoin(baseurl,'/network-list/v2/network-lists/97176_SHKIIPBLOG2/append'),headers=headers,data=json.dumps(body))
print('Response Code is',result.status_code)
print(json.dumps(result.json(),indent=2))

 

では、Codeを実行してみます。

[elfin@localhost blog_network_lists_v2]# python3 append-IP-list_test.py
Response Code is 202
{
  "accessControlGroup": "Akamai Japan-C-F0IVM7 - C-F0IVM7.G34116",
  "description": "Welcome to APIs' ocean!",
  "elementCount": 2,
  "links": {
    "activateInProduction": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/PRODUCTION/activate",
      "method": "POST"
    },
    "activateInStaging": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/STAGING/activate",
      "method": "POST"
    },
    "appendItems": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/append",
      "method": "POST"
    },
    "retrieve": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2"
    },
    "statusInProduction": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/PRODUCTION/status"
    },
    "statusInStaging": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/STAGING/status"
    },
    "update": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2",
      "method": "PUT"
    }
  },
  "list": [
    "198.51.100.2/32",
    "198.51.100.1/32",
    "203.0.113.1/32",
    "203.0.113.2/32"
  ],
  "name": "shki-IP-blog-2",
  "networkListType": "networkListResponse",
  "readOnly": false,
  "shared": false,
  "syncPoint": 1,
  "type": "IP",
  "uniqueId": "97176_SHKIIPBLOG2"
}

 

APIによる操作が反映され、IP listが2つから4つに増えました。ACC (Akamai Control Center) 管理画面でも同じ結果を確認できます。

shki_api_b-16(new).png

 

新しいNetwork listを作成し設定変更を加えましたが、まだStaging及びProduction環境への展開はできてないので、Activationを行います。「Activate a network list」APIを利用します。

shki_api_b-17.png

POST Methodで送るBody情報と共に、必須パラメーターとしてIDと展開環境STAGING or PRODUCTION)の宣言が必要です。

shki_api_b-18.png

 

以下、Staging展開用Python Codeです。

[elfin@localhost blog_network_lists_v2]# cat activation_test.py
### Import Library ###
import requests
import json
from akamai.edgegrid import EdgeGridAuth, EdgeRc
from urllib.parse import urljoin

### Credential & Requests ###
edgerc = EdgeRc('/home/elfin/.edgerc')
section = 'jp-blog'
baseurl = 'https://%s' % edgerc.get(section, 'host')

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

### Header & Body ###
headers = {'Content-Type':'application/json'}
body = {
    "comments": "First time to join APIs' real world.",
    "notificationRecipients": [
        "shki-api-test@akamai.com"
    ]
}

### Perform & Result ###
result = s.post(urljoin(baseurl,'/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/STAGING/activate'),headers=headers,data=json.dumps(body))
print('Response Code is',result.status_code)
print(json.dumps(result.json(),indent=2))

 

実行結果のレスポンスを見るとactivationStatusがPENDING_ACTIVATIONとなりました。なおactivationIdという情報を取得できました。このID情報はNetwork listのActivation状態を確認するときに利用します。

[elfin@localhost blog_network_lists_v2]# python3 activation_test.py
Response Code is 200
{
  "activationComments": "First time to join APIs' real world.",
  "activationId": 5614116,
  "activationStatus": "PENDING_ACTIVATION",
  "links": {
    "activationDetails": {
      "href": "/network-list/v2/activations/5614116"
    },
    "appendItems": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/append",
      "method": "POST"
    },
    "retrieve": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2"
    },
    "statusInProduction": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/PRODUCTION/status"
    },
    "statusInStaging": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/STAGING/status"
    },
    "syncPointHistory": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/sync-points/1/history"
    },
    "update": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2",
      "method": "PUT"
    }
  },
  "syncPoint": 1,
  "uniqueId": "97176_SHKIIPBLOG2"
} 

 

続けて、パラメーターを少し変更しProduction展開もしてみます。こちらでも個別のactivationId情報を取得できました。

[elfin@localhost blog_network_lists_v2]# python3 activation_test.py
Response Code is 200
{
  "activationComments": "First time to join APIs' real world.",
  "activationId": 5614120,
  "activationStatus": "PENDING_ACTIVATION",
  "links": {
    "activationDetails": {
      "href": "/network-list/v2/activations/5614120"
    },
    "appendItems": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/append",
      "method": "POST"
    },
    "retrieve": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2"
    },
    "statusInProduction": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/PRODUCTION/status"
    },
    "statusInStaging": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/STAGING/status"
    },
    "syncPointHistory": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/sync-points/1/history"
    },
    "update": {
      "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2",
      "method": "PUT"
    }
  },
  "syncPoint": 1,
  "uniqueId": "97176_SHKIIPBLOG2"
}

 

では、展開状況を確認してみます。「Get activation details」APIを利用します。使い方は単純で、activationIdでGETするだけです。

shki_api_b-19.png

 

以下、Activation状態確認用Python Codeです。GET Method変更を忘れないでください。

[elfin@localhost blog_network_lists_v2]# cat check-activation-status.py
### Import Library ###
import requests
import json
from akamai.edgegrid import EdgeGridAuth, EdgeRc
from urllib.parse import urljoin

### Credential & Requests ###
edgerc = EdgeRc('/home/elfin/.edgerc')
section = 'jp-blog'
baseurl = 'https://%s' % edgerc.get(section, 'host')

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

### Header & Body ###
headers = {'Content-Type':'application/json'}
body = 'none'

### Perform & Result ###
result = s.get(urljoin(baseurl,'/network-list/v2/activations/5614116'))
print('Response Code is',result.status_code)
print(json.dumps(result.json(),indent=2))

 

実行結果、STAGING環境(environment)での状態(activationStatus)がACTIVEであることが分かります。PRODUCTION環境についても、同じ方法で確認可能です。

[elfin@localhost blog_network_lists_v2]# python3 check-activation-status.py
Response Code is 200
{
  "activationId": 5614116,
  "createDate": "2020-12-22T12:33:23.729Z",
  "createdBy": "ey6dd74qpkwgrssc",
  "dispatchCount": 1,
  "environment": "STAGING",
  "estimate": "PT0S",
  "fast": true,
  "initialActivation": false,
  "networkList": {
    "activationComments": "First time to join APIs' real world.",
    "activationStatus": "ACTIVE",
    "links": {
      "appendItems": {
        "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/append",
        "method": "POST"
      },
      "retrieve": {
        "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2"
      },
      "statusInProduction": {
        "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/PRODUCTION/status"
      },
      "statusInStaging": {
        "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/environments/STAGING/status"
      },
      "syncPointHistory": {
        "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2/sync-points/1/history"
      },
      "update": {
        "href": "/network-list/v2/network-lists/97176_SHKIIPBLOG2",
        "method": "PUT"
      }
    },
    "syncPoint": 1,
    "uniqueId": "97176_SHKIIPBLOG2"
  },
  "status": "ACTIVATED"
}

 

最後に、ACC管理画面でも確認します。期待通り反映できています。Production環境の展開が完了することで、APIを利用したNetwork listの設定は終わりです!

shki_api_b-20(new).png

 

 

【サマリ】

さて、ここまでAkamaiのAPIを使うための道のりはいかがでしたでしょうか?APIを初めて使う方や、Pythonが初めてな方は少し難しい場面もあったのではないかと思います。特にEdgeGridやAPI endpointなど初めての用語が多数用いられたことで混乱してしまったかも知れません。しかしながら、Akamaiが提供するAPIの使い方としては本記事で説明した内容が基本形であり、ほとんどが似た形となっています。なお、どのAPIでもDEVサイトやGITサイトで適切なドキュメントとガイドを提供していますので、一度API操作環境を揃えておけば後は再利用することができます。

 

まずはこのように簡単なAPIを試して頂き(Purge APIも好例です)、少しずつDevOpsに近づいてみては如何でしょうか。(Part 1の記事はこちら)

 

API実行関連の疑問点やAkamaiが持つDevOpsの取り組み、活用方法などご相談事項はお気軽に弊社担当者にご連絡ください。

Leave a comment