OSS データインデックスを使用すると、膨大な数のオブジェクトについて、オブジェクト数やサイズなどの統計情報を効率的に集計できます。従来の ListObjects 操作を使用する方法と比較して、データインデックスは効率を大幅に向上させ、プロセスを簡素化するため、大規模なデータ集計シナリオに最適です。
メリット
ある企業は、中国 (広州) リージョンの mybucket という名前のバケットに、ビジネスプレフィックスごとに 180 万のディレクトリに編成された 2 億個のオブジェクトを保存しています。OSS データインデックスを使用することで、オブジェクト集計に必要な時間が 83% 短縮されました。
|
従来の方法 |
OSS データインデックス |
|
|
所要時間 |
毎日の集計に 2 時間かかります |
毎日の集計に 20 分かかります |
|
複雑さ |
1,000 個を超えるオブジェクトを含むディレクトリの場合、 |
|
概要
このプロセスには、次の手順が含まれます。
-
データインデックスの有効化:OSS は、オブジェクトメタデータ、カスタムメタデータ、オブジェクトタグを含むインデックステーブルを自動的に作成します。
-
クエリと集計の開始:クエリ条件を設定してから、DoMetaQuery API を呼び出します。OSS は高速クエリを実行します。
最後に、OSS は一致するオブジェクトの統計情報 (合計数、合計サイズ、平均サイズなど) を返します。
クイックスタート
ステップ 1:データインデックスの有効化
OSS コンソール
-
OSS コンソールにログインします。
-
左側のナビゲーションペインで、バケット をクリックします。「バケット」ページで、宛先バケットの名前をクリックします。
-
左側のナビゲーションペインで、を選択します。
-
データのインデックス作成 ページで、この機能を初めて使用する場合は、画面の指示に従って
AliyunMetaQueryDefaultRoleロールに権限を付与します。これにより、OSS サービスはバケット内のデータを管理できるようになります。権限を付与した後、データインデックスを有効化 をクリックします。 -
スカラー検索 を選択し、有効化 をクリックします。
OSS SDK
Java、Python、Go 用の OSS SDK のみが、指定された条件を満たすオブジェクトをクエリする MetaSearch 機能をサポートしています。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
public class Demo {
// 実際のエンドポイントを使用してください。この例では、中国 (広州) リージョンのエンドポイントを使用しています。
private static String endpoint = "https://oss-cn-guangzhou.aliyuncs.com";
// バケット名を指定します。例:examplebucket。
private static String bucketName = "examplebucket";
public static void main(String[] args) throws com.aliyuncs.exceptions.ClientException {
// 環境変数からアクセス認証情報を取得します。コードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットが存在するリージョンを指定します。たとえば、バケットが中国 (広州) リージョンにある場合、リージョンを cn-guangzhou に設定します。
String region = "cn-guangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// データインデックス機能を有効にします。
ossClient.openMetaQuery(bucketName);
} catch (OSSException oe) {
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Error Message: " + ce.getMessage());
} finally {
// OSSClient インスタンスをシャットダウンします。
ossClient.shutdown();
}
}
}
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。コードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが存在するリージョンのエンドポイントを指定します。たとえば、バケットが中国 (広州) リージョンにある場合、エンドポイントを https://oss-cn-guangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-guangzhou.aliyuncs.com"
# エンドポイントに対応するリージョンを指定します。例:cn-guangzhou。このパラメータは、署名バージョン 4 を使用する場合に必要です。
region = "cn-guangzhou"
# バケット名を指定します。例:examplebucket。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# データインデックス機能を有効にします。
bucket.open_bucket_meta_query()package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
var (
region string // コマンドラインフラグからリージョンを格納します。
bucketName string // コマンドラインフラグからバケット名を格納します。
)
// init 関数は main の前に実行され、プログラムを初期化します。
func init() {
// リージョンのコマンドラインフラグを追加します。
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
// バケット名のコマンドラインフラグを追加します。
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
flag.Parse() // コマンドラインフラグを解析します。
// バケット名が指定されているかどうかを確認します。指定されていない場合は、フラグを出力して終了します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが指定されているかどうかを確認します。指定されていない場合は、フラグを出力して終了します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 環境変数認証情報プロバイダーを使用するクライアント構成を作成します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg) // 構成から OSS クライアントを作成します。
// バケットのデータインデックスを有効にするリクエストを構築します。
request := &oss.OpenMetaQueryRequest{
Bucket: oss.Ptr(bucketName), // ターゲットバケットを指定します。
}
result, err := client.OpenMetaQuery(context.TODO(), request) // データインデックスを有効にするリクエストを実行します。
if err != nil {
log.Fatalf("failed to open meta query %v", err)
}
log.Printf("open meta query result:%#v\n", result) // 結果を出力します。
}ステップ 2:クエリと集計の開始
OSS コンソール
クエリ条件の設定
-
左側のナビゲーションペインで、オブジェクト管理 > データのインデックス作成 を選択します。
-
[ストレージクラス] で [Standard] を選択します。[ACL] で [非公開] を選択します。
-
オブジェクトプレフィックスにはあいまい一致を使用し、
a/bを入力します。
出力結果の構成
-
最終更新日時で結果を降順に並べ替えます。
-
フィルターされたオブジェクトサイズの合計と平均を計算します。
グループカウント を ストレージクラス 別に使用して、オブジェクト数をカウントします。
-
今すぐ検索 をクリックします。
OSS SDK
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.util.ArrayList;
import java.util.List;
public class Demo {
// 中国 (広州) リージョンのエンドポイントが例として使用されています。実際のエンドポイントに置き換えてください。
private static String endpoint = "https://oss-cn-guangzhou.aliyuncs.com";
// バケット名を指定します。例:examplebucket。
private static String bucketName = "examplebucket";
public static void main(String[] args) throws Exception {
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// バケットが存在するリージョンを指定します。たとえば、バケットが中国 (広州) リージョンにある場合、リージョンを cn-guangzhou に設定します。
String region = "cn-guangzhou";
// OSSClient インスタンスを作成します。
// OSSClient インスタンスが不要になったら、shutdown メソッドを呼び出してリソースを解放します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 返されるオブジェクトの最大数を設定します。
int maxResults = 20;
// クエリ条件を設定します:ファイル名が "a/b" と一致し、ストレージクラスが "Standard" で、ACL が "private" です。
// クエリは、"and" 演算子を使用してサブクエリを接続します。
String query = "{\n" +
" \"Operation\": \"and\",\n" +
" \"SubQueries\": [\n" +
" {\n" +
" \"Field\": \"Filename\",\n" +
" \"Value\": \"a/b\",\n" +
" \"Operation\": \"match\"\n" +
" },\n" +
" {\n" +
" \"Field\": \"OSSStorageClass\",\n" +
" \"Value\": \"Standard\",\n" +
" \"Operation\": \"eq\"\n" +
" },\n" +
" {\n" +
" \"Field\": \"ObjectACL\",\n" +
" \"Value\": \"private\",\n" +
" \"Operation\": \"eq\"\n" +
" }\n" +
" ]\n" +
"}";
String sort = "FileModifiedTime";// 最終更新日時で並べ替えます。
// オブジェクトサイズの合計、カウント、平均を計算する集計を作成します。
Aggregation aggregationRequest1 = new Aggregation();
aggregationRequest1.setField("Size");// サイズで集計します。
aggregationRequest1.setOperation("sum");// 合計を計算します。
Aggregation aggregationRequest2 = new Aggregation();
aggregationRequest2.setField("Size");// サイズで集計します。
aggregationRequest2.setOperation("count");// カウントを計算します。
Aggregation aggregationRequest3 = new Aggregation();
aggregationRequest3.setField("Size");// サイズで集計します。
aggregationRequest3.setOperation("average");// 平均を計算します。
// 集計リクエストをリストに追加します。
Aggregations aggregations = new Aggregations();
List<Aggregation> aggregationList = new ArrayList<>();
aggregationList.add(aggregationRequest1);// 合計集計を追加します。
aggregationList.add(aggregationRequest2);// カウント集計を追加します。
aggregationList.add(aggregationRequest3);// 平均集計を追加します。
aggregations.setAggregation(aggregationList);// リクエストの集計を設定します。
// DoMetaQueryRequest を作成します。
DoMetaQueryRequest doMetaQueryRequest = new DoMetaQueryRequest(bucketName, maxResults, query, sort);
// 集計をリクエストに追加します。
doMetaQueryRequest.setAggregations(aggregations);
// 並べ替え順序を降順に設定します。
doMetaQueryRequest.setOrder(SortOrder.DESC);
// メタクエリを実行します。
DoMetaQueryResult doMetaQueryResult = ossClient.doMetaQuery(doMetaQueryRequest);
// クエリ結果を処理します。
if (doMetaQueryResult.getFiles() != null) {
// ファイルが返された場合、反復処理して情報を出力します。
for (ObjectFile file : doMetaQueryResult.getFiles().getFile()) {
System.out.println("Filename: " + file.getFilename()); // ファイル名
System.out.println("ETag: " + file.getETag());// ETag
System.out.println("ObjectACL: " + file.getObjectACL()); // ACL
System.out.println("OssObjectType: " + file.getOssObjectType());// オブジェクトタイプ
System.out.println("OssStorageClass: " + file.getOssStorageClass());// ストレージクラス
System.out.println("TaggingCount: " + file.getOssTaggingCount()); // タグ数
if (file.getOssTagging() != null) {
// オブジェクトタグを出力します。
for (Tagging tag : file.getOssTagging().getTagging()) {
System.out.println("Key: " + tag.getKey());
System.out.println("Value: " + tag.getValue());
}
}
if (file.getOssUserMeta() != null) {
// ユーザーメタデータを出力します。
for (UserMeta meta : file.getOssUserMeta().getUserMeta()) {
System.out.println("Key: " + meta.getKey());
System.out.println("Value: " + meta.getValue());
}
}
}
} else if (doMetaQueryResult.getAggregations() != null) {
// 集計が返された場合、反復処理して結果を出力します。
for (Aggregation aggre : doMetaQueryResult.getAggregations().getAggregation()) {
System.out.println("Field: " + aggre.getField());// 集計フィールド
System.out.println("Operation: " + aggre.getOperation()); // 集計操作
System.out.println("Value: " + aggre.getValue());// 集計結果値
if (aggre.getGroups() != null && aggre.getGroups().getGroup().size() > 0) {
// グループ化された集計の値を取得します。
System.out.println("Groups value: " + aggre.getGroups().getGroup().get(0).getValue());
// グループ化された集計の合計カウントを取得します。
System.out.println("Groups count: " + aggre.getGroups().getGroup().get(0).getCount());
}
}
} else {
System.out.println("NextToken: " + doMetaQueryResult.getNextToken());
}
} catch (OSSException oe) {
// OSS 例外をキャッチします。
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
// クライアント例外をキャッチして出力します。
System.out.println("Error Message: " + ce.getMessage());
} finally {
// OSSClient インスタンスをシャットダウンします。
ossClient.shutdown();
}
}
}# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import MetaQuery, AggregationsRequest
import json
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが存在するリージョンのエンドポイントを指定します。たとえば、バケットが中国 (広州) リージョンにある場合、エンドポイントを https://oss-cn-guangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-guangzhou.aliyuncs.com"
# エンドポイントに対応するリージョンを指定します。例:cn-guangzhou。このパラメータは、署名バージョン 4 を使用する場合に必要です。
region = "cn-guangzhou"
# バケット名を指定します。例:examplebucket。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# クエリ条件:ファイル名が "a/b" と一致し、ストレージクラスが "Standard" で、ACL が "private" です。
query = {
"Operation": "and",
"SubQueries": [
{"Field": "Filename", "Value": "a/b", "Operation": "match"},
{"Field": "OSSStorageClass", "Value": "Standard", "Operation": "eq"},
{"Field": "ObjectACL", "Value": "private", "Operation": "eq"}
]
}
# クエリを JSON 文字列に変換します。
query_json = json.dumps(query)
# オブジェクトサイズの合計、カウント、平均を計算する集計を作成します。
aggregations = [
AggregationsRequest(field="Size", operation="sum"), # オブジェクトサイズの合計を計算します。
AggregationsRequest(field="Size", operation="count"), # オブジェクト数を計算します。
AggregationsRequest(field="Size", operation="average") # オブジェクトサイズの平均を計算します。
]
# クエリ条件、最大結果数、ソートキーと順序、集計を指定して MetaQuery リクエストを作成します。
do_meta_query_request = MetaQuery(
max_results=20, # 最大 20 個のオブジェクトを返します。
query=query_json, # クエリ条件を設定します。
sort="FileModifiedTime", # 最終更新日時で並べ替えます。
order="desc", # 降順で並べ替えます。
aggregations=aggregations # 集計操作を設定します。
)
# メタクエリを実行します。
result = bucket.do_bucket_meta_query(do_meta_query_request)
# 一致するオブジェクトの情報を出力します。
if result.files:
for file in result.files:
print(f"Filename: {file.file_name}") # ファイル名を出力します。
print(f"ETag: {file.etag}") # ETag を出力します。
print(f"ObjectACL: {file.object_acl}") # ACL を出力します。
print(f"OssObjectType: {file.oss_object_type}") # OSS オブジェクトタイプを出力します。
print(f"OssStorageClass: {file.oss_storage_class}") # ストレージクラスを出力します。
print(f"TaggingCount: {file.oss_tagging_count}") # タグ数を出力します。
# オブジェクトのすべてのタグを出力します。
if file.oss_tagging:
for tag in file.oss_tagging:
print(f"Key: {tag.key}") # タグキーを出力します。
print(f"Value: {tag.value}") # タグ値を出力します。
# オブジェクトのユーザーメタデータを出力します。
if file.oss_user_meta:
for meta in file.oss_user_meta:
print(f"Key: {meta.key}") # ユーザーメタデータキーを出力します。
print(f"Value: {meta.value}") # ユーザーメタデータ値を出力します。
# 集計結果を出力します。
if result.aggregations:
for aggre in result.aggregations:
print(f"Field: {aggre.field}") # 集計フィールドを出力します。
print(f"Operation: {aggre.operation}") # 集計操作タイプ (合計、カウント、平均など) を出力します。
print(f"Value: {aggre.value}") # 集計結果値を出力します。package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
var (
region string // コマンドラインフラグからリージョンを格納します。
bucketName string // コマンドラインフラグからバケット名を格納します。
)
// init 関数は main の前に実行され、プログラムを初期化します。
func init() {
// リージョンのコマンドラインフラグを追加します。
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
// バケット名のコマンドラインフラグを追加します。
flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
}
func main() {
flag.Parse() // コマンドラインフラグを解析します。
// バケット名が指定されているかどうかを確認します。指定されていない場合は、フラグを出力して終了します。
if len(bucketName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
// リージョンが指定されているかどうかを確認します。指定されていない場合は、フラグを出力して終了します。
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
// 環境変数認証情報プロバイダーと指定されたリージョンを使用するクライアント構成を作成します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := oss.NewClient(cfg) // 構成から OSS クライアントを作成します。
// クエリ条件を構築します:ファイル名が "a/b" と一致し、ストレージクラスが "Standard" で、ACL が "private" です。
query := map[string]interface{}{
"Operation": "and",
"SubQueries": []map[string]interface{}{
{"Field": "Filename", "Value": "a/b", "Operation": "match"},
{"Field": "OSSStorageClass", "Value": "Standard", "Operation": "eq"},
{"Field": "ObjectACL", "Value": "private", "Operation": "eq"},
},
}
// クエリを JSON 文字列にマーシャリングします。
queryJSON, err := json.Marshal(query)
if err != nil {
log.Fatalf("failed to marshal query %v", err)
}
// オブジェクトサイズの合計、カウント、平均を計算する集計を作成します。
aggregations := []oss.MetaQueryAggregation{
{Field: oss.Ptr("Size"), Operation: oss.Ptr("sum")}, // 合計を計算します。
{Field: oss.Ptr("Size"), Operation: oss.Ptr("count")}, // カウントを計算します。
{Field: oss.Ptr("Size"), Operation: oss.Ptr("average")}, // 平均を計算します。
}
// DoMetaQuery リクエストを構築します。
request := &oss.DoMetaQueryRequest{
Bucket: oss.Ptr(bucketName), // クエリするバケットを指定します。
MetaQuery: &oss.MetaQuery{
MaxResults: oss.Ptr(int64(20)), // 返される最大結果数:20。
Query: oss.Ptr(string(queryJSON)), // クエリ条件を設定します。
Sort: oss.Ptr("FileModifiedTime"), // 最終更新日時で並べ替えます。
Order: oss.Ptr(oss.MetaQueryOrderDesc), // 降順で並べ替えます。
Aggregations: &oss.MetaQueryAggregations{
Aggregations: aggregations}, // 集計操作を設定します。
},
}
result, err := client.DoMetaQuery(context.TODO(), request) // メタクエリリクエストを送信します。
if err != nil {
log.Fatalf("failed to do meta query %v", err)
}
// ページネーション用の NextToken を出力します。
fmt.Printf("NextToken:%s\n", *result.NextToken)
// 結果を反復処理し、ファイルの詳細を出力します。
for _, file := range result.Files {
fmt.Printf("File name: %s\n", *file.Filename)
fmt.Printf("size: %d\n", file.Size)
fmt.Printf("File Modified Time:%s\n", *file.FileModifiedTime)
fmt.Printf("Oss Object Type:%s\n", *file.OSSObjectType)
fmt.Printf("Oss Storage Class:%s\n", *file.OSSStorageClass)
fmt.Printf("Object ACL:%s\n", *file.ObjectACL)
fmt.Printf("ETag:%s\n", *file.ETag)
fmt.Printf("Oss CRC64:%s\n", *file.OSSCRC64)
if file.OSSTaggingCount != nil {
fmt.Printf("Oss Tagging Count:%d\n", *file.OSSTaggingCount)
}
// オブジェクトのタグ情報を出力します。
for _, tagging := range file.OSSTagging {
fmt.Printf("Oss Tagging Key:%s\n", *tagging.Key)
fmt.Printf("Oss Tagging Value:%s\n", *tagging.Value)
}
// ユーザー定義メタデータを出力します。
for _, userMeta := range file.OSSUserMeta {
fmt.Printf("Oss User Meta Key:%s\n", *userMeta.Key)
fmt.Printf("Oss User Meta Key Value:%s\n", *userMeta.Value)
}
}
// 集計結果を出力します。
for _, aggregation := range result.Aggregations {
fmt.Printf("Aggregation Field:%s\n", *aggregation.Field)
fmt.Printf("Aggregation Operation:%s\n", *aggregation.Operation)
fmt.Printf("Aggregation Value:%f\n", *aggregation.Value)
}
}
ステップ 3:結果の確認
OSS コンソール
一致する 100 個の Standard オブジェクトの合計サイズは 19.53 MB で、各オブジェクトの平均サイズは約 200 KB です。
クエリ結果ページには、[オブジェクトデータ集計結果] と [ファイルリスト] の 2 つのセクションがあります。集計結果セクションには、オブジェクトサイズの合計と平均が表示されます。ファイルリストセクションには、各オブジェクトの詳細情報 (名前 (例:a/b/report9.txt)、サイズ、オブジェクトタイプ、ストレージクラス、ACL (非公開)、最終更新日時など) が表示されます。
OSS SDK
一致する 100 個の Standard オブジェクトの合計サイズは 19.53 MB で、各オブジェクトの平均サイズは約 200 KB です。
Field: Size
Operation: sum
Value: 2.048E7
Field: Size
Operation: count
Value: 100.0
Field: Size
Operation: average
Value: 204800.0
関連ドキュメント
-
高度なカスタマイズを行うには、REST API リクエストを直接行うことができます。この場合、リクエスト署名を手動で計算する必要があります。詳細については、「署名バージョン 4」および「DoMetaQuery」をご参照ください。