Function Compute でOSSのバケットサイズを計測
ども、最近、OSSと戯れる機会が多い、うし@tangniuwanです。
定期的にOSSのバケットサイズ(ストレージの容量)が知りたいケースがあったのですが、 サンプルやら、ネットの海やらを探しても、これといった情報が見つからず…
しゃーないので、GitHubでSDK(aliyun-oss-php-sdk)を漁り、
サイズ取得メソッドが実装されていたのを発見し、あれやこれやで無事、バケットサイズが計測できましたので
発見までの経緯と、そのソースコードを共有させて頂きます。
経緯
通知の方法として、
「Email + DingTalk (Info)」が使用できるため
当初は、Cloud Monitorのアラームサービスのルール作成から設定できないかな?と思いましが、
Cloud Monitorで設定できる項目をよくよく確認すると、バケットサイズに関連するものが無く、
ファイル数やレイテンシーなどに関するものが多数ありました。
という事で、Cloud Monitorを諦め、自前で作ることにしました。 ちなみに、会社の昼休みと退勤後のオンライン飲み会の時間を使って、以下のコードを書き上げました。
やったこと
最初にやったこと
以下、 URLのドキュメントセンターで、オブジェクト(ファイル)一覧を取得する方法を確認しました。
以下は、オブジェクト(ファイル)一覧を取得するサンプルコードの引用です。
諸々設定して素直に実行すると、指定したバケット内のファイル一覧が表示できます。
<? 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()」なるメソッドを保持しています。
以下は、該当クラスのページ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 のタイマートリガーを設定すれば、定期的にバケットサイズ情報が通知されます。
最後まで見て頂いてありがとうございます。
でわ