Technical Blog テクニカルブログ
  1. HOME
  2. テクニカルブログ
  3. Aspera APIを使った独自レポート生成方法のご紹介

Aspera APIを使った独自レポート生成方法のご紹介

投稿者:平間 博

こんにちは。

私たちIntegrationチームはシステム/アプリケーションを統合するソリューションエンジニアであり、API、メッセージ・データ、ファイルを使った様々なデータソースやアプリケーションの統合において、製品の選定から設計・構築、そして導入後のサポートを行っております。

このBlogでは、IBM Aspera on Cloudと共に提供されている各種APIについて紹介致します。

Aspera APIを理解し、活用いただくことで自動化、効率化、ランニングコスト可視化をユーザー自らコントロールしていくことも実現することができます。

– Aspera on Cloud API

Aspera APIはSaaS、ソフトウェア製品にまたがり、広く利用できるように設計・構成されています。

SaaSとソフトウェア製品では利用できるAPIは、必ずしも同等ではないため、APIを通して実現したい仕組みに合わせてAPIリファレンス(参照リンクをつけておきます)を確認することが重要となります。

上記は、SaaS版で使えるものですが、後半3つのAPIはソフトウェア版でも使うことができます。

– Aspera on CloudをAPIで操作する

それでは、Aspera on Cloudの標準ストレージに格納されたデータ群の総容量をグラフ化することをテーマにAspera Node APIの使ったサンプルを紹介します。

サンプルの実装は次の通りです。

Aspera on CloudでJWT方式によるAPIトークンの取得については、公式サイトで解説しているため、詳細は省きますが「Node.js」で記述されたい方向けにサンプルコードも掲載しておきます。

◆JWT生成に必要な情報と確認方法
◆サンプルコード(JWT)
JavaScript
const jwt = require('jsonwebtoken')
const crypto = require('crypto')
const https = require('https')
const querystring = require('querystring')
const fs = require('fs')

const client_id = 'Aspera on Cloud Admin Appより確認'
const email = "Aspera on Cloud Admin Appより確認"
const token_url = 'https://api.ibmaspera.com/api/v1/oauth2/token'
const scope = "node.`Aspera on Cloud Admin Appより確認`:user:all"
const access_key = 'Aspera on Cloud Admin Appより確認'
const jwt_options = { algorithm: "RS256", expiresIn: '10m' }
const jwt_payload = { iss: client_id, sub: email, aud: token_url }
const privatekey = fs.readFileSync('./keys/aspera_private.pem')
const req_options = {
   hostname: 'api.ibmaspera.com',
   path: '/api/v1/oauth2/236496jfwavm/token',
   method: 'POST',
   headers: {
       'Content-Type': 'application/x-www-form-urlencoded',
       Authorization: 'Basic ' + Buffer.from(client_id + ':' + client_secret).toString('base64')
   }
}
const req_data = querystring.stringify({
   assertion: jwt.sign(jwt_payload, privatekey, jwt_options),
   grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
   scope: scope
})

async function generateToken(options, data) {

   return new Promise( ( (resolve, reject) => {
      let req = https.request(options, (res) => {

         if ( !res.statusCode.toString('10').match(/2\d\d/) ) {
            console.error("failed to get data. status code %d", res.statusCode)
            return
         }

         let body = ''
         res.on('data', (chunk) => {
            body += chunk
         })
         res.on('end', () => {
            resolve(body)
         })
      }).on('error', (e) => {
         reject(e.message)
      })

      req.write(data)
      req.end()
   }))
}

async function main() {
   let token = JSON.parse(await generateToken(req_options, req_data)).access_token
}

main()
◆サンプルコード(Node API Call + グラフ化)
JavaScript
const https = require('https')
const plotlib = require('nodeplotlib')

async function getFileMetaData(token, id) {

   return new Promise( ( (resolve, reject) => {
      const options = {
         hostname: 'ats-sl-syd.aspera.io',
         path: '/files/' + id,
         method: 'GET',
         headers: {
            Accept: 'application/json',
            Authorization: 'Bearer ' + token,
            'X-Aspera-AccessKey': access_key
         }
      }
      let req = https.request(options, (res) => {

         let body = ''
         res.on('data', (chunk) => {
            body += chunk
         })
         res.on('end', () => {
            resolve(body)
         })
      }).on('error', (e) => {
         reject(e.message)
      })
      req.end()
   }))
}

async function main() {

   let token = `サンプルコード(JWT)参照`
   let num = 30
   let meta = ''
   let metadata = []
   let usage = 0
   const constract_usage = 1099511627776
   do {
      let meta = await getFileMetaData(token, num)
      if ( !('error' in JSON.parse(meta)) ) {
         metadata.push(JSON.parse(meta))
      }
      num = num + 1
   } while (num < 90)
   metadata.forEach( (value) => {
      if ( value.type === 'file' ) {
         usage += value.size
      }
   })
   const free = constract_usage - usage
   let data = [ { values: [ usage, free ], labels: [ 'Used Space', 'Free Space' ], type: 'pie' }]
   console.log(data)
   let layout = { height: 400, width: 500 }
   plotlib.plot(data, layout)
}

main()

今回、Node APIを受け付けたのがマネージドATS(Aspera Transfer Service)であるため、使えるAPIに制限はあります。
しかし、ATSへアップロードしたファイルのメタデータを取得して集計することで自分自身がストレージに配置したデータサイズが可視化する部分の実装は可能です。


Aspera on Cloud上で提供する可視化ツール(Activity App, Subscription, Node)で不足を感じたら、自作する手段が提供されているところがGood Pointと考えます。それにしても、「nodeplotlib」は便利ですね。簡単にグラフを生成できるため、クイックに可視化ができます。

以上、Aspera APIを使った独自レポート生成操作のご紹介となります。次回は、これまで私が触れてきたIntegration Toolsの操作感について所見をご紹介します。

<参照リンク>
※1 Aspera on Cloud API(https://developer.ibm.com/apis/catalog/aspera–aspera-on-cloud-api)
※2 AoC Automation API(https://developer.ibm.com/apis/catalog/aspera–aspera-automation-api)
※3 AoC Activity API(https://developer.ibm.com/apis/catalog/aspera–aspera-activity-api)
※4 Aspera ATS API(https://developer.ibm.com/apis/catalog/aspera–aspera-ats-api)
※5 Aspera Node API(https://developer.ibm.com/apis/catalog/aspera–aspera-node-api/api/API–aspera–node-api)
※6 Aspera HTTP Gateway Javascript SDK(https://developer.ibm.com/apis/catalog/aspera–aspera-http-gateway-javascript-sdk)
※7 Aspera Connect SDK(https://developer.ibm.com/apis/catalog/aspera–aspera-connect-sdk)
※8 nodeplotlib(https://www.npmjs.com/package/nodeplotlib)
※9 jsonwebtoken(https://www.npmjs.com/package/jsonwebtoken)

ページのトップへ