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)