クラウドコンピューティングが必要ですか? 今すぐ始める

Dark background with blue code overlay
Blog

Akamai API入門 Part 2 — APIの活用

執筆者

Shane Kim

January 13, 2021

執筆者

Shane Kim

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

 

【Part 2 アジェンダ】

 - API情報探し

 - API利用の基礎

 - API動作結果確認

 - API活用

 - サマリ

 

【API情報探し】

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

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 リクエスト Method と API Endpoint URL が記載されています。

API Endpoint とは、該当 API 機能を実行できる URL を意味します。

まず一番上にある List network lists API を利用してみます。Method が GET なのでシステムに変更を加えることなく試験用として使うには最適です。List network lists リンクをクリックすると該当 API の詳細情報に移動します。

説明では Network List の情報を確認する API となっています。なお、Request / Parameters / Response / Steps という4つの情報を提供しています。Request 情報ではリクエストに必要な Parameters を加味した API endpoint の作成例が用意されています。

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

  • 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 リクエストが成功した際の期待されるレスポンス情報を参考情報として提供しています。

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

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

【API利用の基礎】

API を実行する前に情報を取得したい Network list を確認します。私はアクセス権限がある Network list 中、shki-ip と shki-location という 2 つの Network list を使っています。shki-ip-blog は生成してはいますが、まだ使ってないものです。

この 3 つの中でも shki-ip を見てみたいと思います。この Network list は IP タイプで、3 つの IP List が入っており、Staging 及び Production 展開が完了しています。

では、前の記事で準備した EdgeGrid ライブラリーを使うための Python コードファイルを作成します。前の記事で作ったサンプルファイルを修正して使います。まず、元のコードを読みやすいようにコメントを付けました。

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} ファイルが存在するディレクトリを絶対経路で登録します。

私の Linux ユーザ名は '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 例にあった情報を反映します。

  ### 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 表示の indent を変更します。ここで先ほど追加した 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))

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

  [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 動作結果確認】

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

  [elfin@localhost ~]# python3 list-network-lists-API.py
Response Code is 200

最初の出力結果データにより、HTTP レスポンスコードを確認できます。この結果では 200 ですが、本 API 実行結果にとって 200 はどういった意味でしょうか?

その答えは API ドキュメントページの一番下にある HTTP status codes で確認できます。

確認結果、Network list API v2 では 200 が戻ってきたら API オペレーションは成功であることが分かります。他レスポンスコードに対する情報もあり、間違った結果が戻ってきた際のトラブルシューティングで活用できる情報です。

次は "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 の一覧です。

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

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

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

続いて、同じ API endpoint で Optional Parameters を変更して表示される情報の量を制限してみます。下記コードのみ変更しました。

  ### 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 レスポンス時間が短縮する効果もあります。このように、API を利用する際は、その 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 が作れそうです。

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

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

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

  [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"
} 

201 レスポンスが返されました。その内容は "Resource successfully created." となり、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 を利用します。

Python コードとしては下記となります。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)) 

では、作成したコードを実行してみます。

  [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 管理画面でも同じ結果を確認できます。

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

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

以下、Staging 展開用 Python コードです。

  [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 するだけです。

以下、Activation 状態確認用 Python コードです。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 の設定は終わりです!

【サマリ】

さて、ここまで Akamai の API を使うための道のりはいかがでしたでしょうか?API を初めて使う方や、Python が初めてな方は少し難しい場面もあったのではないかと思います。

特に EdgeGrid や API endpoint など初めての用語が多数用いられたことで混乱してしまったかも知れません。しかしながら、Akamai が提供する API の使い方としては本記事で説明した内容が基本形であり、ほとんどが似た形となっています。

なお、どの API でも DEV サイトや GIT サイトで適切なドキュメントとガイドを提供していますので、一度 API 操作環境を揃えておけば後は再利用することができます。

 

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

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



執筆者

Shane Kim

January 13, 2021

執筆者

Shane Kim