麦星 - arcturus technologies- 

テクノロジー関連情報と日常的な何かを発信しています

Function Compute でOSSのバケットサイズを計測

ども、最近、OSSと戯れる機会が多い、うし@tangniuwanです。

定期的にOSSバケットサイズ(ストレージの容量)が知りたいケースがあったのですが、 サンプルやら、ネットの海やらを探しても、これといった情報が見つからず…

しゃーないので、GitHubSDK(aliyun-oss-php-sdk)を漁り、
サイズ取得メソッドが実装されていたのを発見し、あれやこれやで無事、バケットサイズが計測できましたので
発見までの経緯と、そのソースコードを共有させて頂きます。

経緯

通知の方法として、
「Email + DingTalk (Info)」が使用できるため
当初は、Cloud Monitorのアラームサービスのルール作成から設定できないかな?と思いましが、
Cloud Monitorで設定できる項目をよくよく確認すると、バケットサイズに関連するものが無く、
ファイル数やレイテンシーなどに関するものが多数ありました。

という事で、Cloud Monitorを諦め、自前で作ることにしました。 ちなみに、会社の昼休みと退勤後のオンライン飲み会の時間を使って、以下のコードを書き上げました。

やったこと

最初にやったこと

以下、 URLのドキュメントセンターで、オブジェクト(ファイル)一覧を取得する方法を確認しました。

jp.alibabacloud.com

以下は、オブジェクト(ファイル)一覧を取得するサンプルコードの引用です。
諸々設定して素直に実行すると、指定したバケット内のファイル一覧が表示できます。

<? php
if (is_file( _DIR . '/../ autoload.php')) {
require_once _DIR . '/../ autoload.php';
}
if (is_file( _
DIR__ . '/../ vendor/autoload.php')) {
require_once _
DIR__ . '/../ vendor/autoload.php';
}

use OSS\OssClient;
use OSS\Core\OssException;

// It is highly risky to log on with AccessKey of an Alibaba Cloud account because the account has permissions on all the APIs in OSS. We recommend that you log on as a RAM user to access APIs or perform routine operations and maintenance. To create a RAM account, log on to https://ram.console.aliyun.com.
$accessKeyId = "";
$accessKeySecret = "";
// This example uses endpoint China East 1 (Hangzhou). Specify the actual endpoint based on your requirements.
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
$bucket= "";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

while (true) {
 try {
  $listObjectInfo = $ossClient->listObjects($bucket, $options);
 } catch (OssException $e) {
  printf( __FUNCTION__ . ": FAILED\n");
  printf($e->getMessage() . "\n");
  return;
 }
// Obtain the nextMarker. Obtain the object list from the object next to the last object read by listObjects.
 $nextMarker = $listObjectInfo->getNextMarker();
 $listObject = $listObjectInfo->getObjectList();
 $listPrefix = $listObjectInfo->getPrefixList();
 if (! empty($listObject)) {
  print("objectList:\n");
  foreach ($listObject as $objectInfo) {
   print($objectInfo->getKey() . "\n");   }
 }
 if (! empty($listPrefix)) {
  print("prefixList: \n");
  foreach ($listPrefix as $prefixInfo) {
  print($prefixInfo->getPrefix() . "\n");
  }
 }
 if ($nextMarker === '') {
  break;
 }
}

次にやったこと

上のソースコード上で、

    $listObject = $listObjectInfo->getObjectList();    

という構文があり、ファイルリストを取得し、変数「 $listObject」へ格納しています。
その後、「$listObject 」をforeach でぐるぐるループしているのが分かります。

    foreach ($listObject as $objectInfo) {  
        print($objectInfo->getKey() . "\n");  
    }  

ここで、変数「$objectInfo」は、ファイルを扱っているモジュールなので、
実はファイルのサイズ情報とか持ってるんじゃね?という疑惑がありSDKを調べるに至りました。

結果、案の定、GitHub上の「objectInfo」モデルのソースコードがあり、確認するとサイズ情報を保持していました。  

※確認すると「getSize()」なるメソッドを保持しています。
f:id:tangniu:20210130022551p:plain

以下は、該当クラスのページURL
github.com

という事で、サンプルソースを以下の様に書き換えます。 (太字の部分が上部のソースからの変更点。あとは、不要なコードを削除しています。)

<? php

use OSS\OssClient;
use OSS\Core\OssException;

$accessKeyId = "";
$accessKeySecret = "";
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
$bucket= "";

$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

$buketSize =0;
while (true) {
 try {
  $listObjectInfo = $ossClient->listObjects($bucket, $options);
 } catch (OssException $e) {
  printf( __FUNCTION__ . ": FAILED\n");
  printf($e->getMessage() . "\n");
  return;
 }
 $nextMarker = $listObjectInfo->getNextMarker();
 $listObject = $listObjectInfo->getObjectList();
 if (! empty($listObject)) {
  print("objectList:\n");
  foreach ($listObject as $objectInfo) {
   print($objectInfo->getSize() . "\n");
   $buketSize += (float)$objectInfo->getSize() / 1024 / 1024;
  }
 }
 if ($nextMarker === '') {
  break;
 }
}

あとは、変数「$buketSize」にファイルサイズを加算すると、バケットのトータルのサイズが取得できます。
という事で、ファイルサイズが取得出来たら、あとは、メールで送付するなり、Slackに通知するなりして、 CRONや、Function Compute のタイマートリガーを設定すれば、定期的にバケットサイズ情報が通知されます。

最後まで見て頂いてありがとうございます。

でわ