このトピックでは、Alibaba Cloud Security Token Service (STS) の一時的なアクセス認証情報または署名付き URL を使用して、Object Storage Service (OSS) リソースに一時的にアクセスする方法について説明します。
重要 STS の一時的なアクセス認証情報と署名付き URL には有効期間を指定する必要があります。一時的なアクセス認証情報を使用して、ファイルのアップロードやダウンロードなどの操作用の署名付き URL を生成する場合、より短い有効期間が適用されます。たとえば、STS の一時的なアクセス認証情報の有効期間が 1200 秒で、署名付き URL の有効期間が 3600 秒の場合、1200 秒が経過すると STS の一時的なアクセス認証情報が期限切れになるため、署名付き URL を使用してファイルをアップロードすることはできません。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化 (C SDK)」をご参照ください。
STS を使用した一時的なアクセス権限の付与
OSS は、Alibaba Cloud Security Token Service (STS) による一時的なアクセス権限の付与をサポートしています。STS は、クラウドコンピューティングユーザーに一時的なアクセストークンを提供する Web サービスです。STS を使用すると、カスタムの有効期間と権限を持つアクセス認証情報をサードパーティのアプリケーションまたはサブユーザー (ID を管理するユーザー) に発行できます。STS の詳細については、「STS とは」をご参照ください。
STS には次の利点があります。
STS からの一時的なアクセス認証情報を使用して OSS にアクセスするには、次の手順を実行します。
一時的なアクセス認証情報の取得
一時的なアクセス認証情報には、一時的な AccessKey ペア (AccessKey ID と AccessKey Secret) とセキュリティトークン (SecurityToken) が含まれます。一時的なアクセス認証情報の有効期間は秒単位で指定します。最小値は 900 です。最大値は、現在の RAM ロールに指定された最大セッション期間です。詳細については、「RAM ロールの最大セッション期間の設定」をご参照ください。
一時的なアクセス認証情報は、次のいずれかの方法で取得できます。
STS 認証情報を使用した署名付きリクエストの作成
ファイルのアップロード
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
const char *endpoint = "yourEndpoint";
/* このサンプルコードを実行する前に、STS から取得した一時的な AccessKey ペアに基づいて、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数を設定していることを確認してください。*/
const char *access_key_id = getenv("OSS_ACCESS_KEY_ID");
const char *access_key_secret = getenv("OSS_ACCESS_KEY_SECRET");
/* STS から取得したセキュリティトークン (SecurityToken)。*/
const char *sts_token = "yourStsToken";
/* バケット名を指定します。例:examplebucket */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt */
const char *object_name = "exampledir/exampleobject.txt";
const char *object_content = "More than just cloud.";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* aos_string_t 型を char* 文字列で初期化します。*/
aos_str_set(&options->config->endpoint, endpoint);
aos_str_set(&options->config->access_key_id, access_key_id);
aos_str_set(&options->config->access_key_secret, access_key_secret);
aos_str_set(&options->config->sts_token, sts_token);
/* CNAME ドメイン名を使用して OSS にアクセスするかどうかを指定します。値 0 は、CNAME ドメイン名が使用されないことを示します。*/
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定します。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* プログラムのエントリで aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリなどのグローバルリソースを初期化します。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリ管理用のメモリプール (pool)。apr_pool_t に相当します。その実装コードは APR ライブラリにあります。*/
aos_pool_t *pool;
/* 新しいメモリプールを作成します。2 番目のパラメーターは NULL で、プールが他のメモリプールから継承しないことを示します。*/
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。このパラメーターには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバル構成情報が含まれます。*/
oss_request_options_t *oss_client_options;
/* メモリプール内のオプションにメモリを割り当てます。*/
oss_client_options = oss_request_options_create(pool);
/* クライアントオプション oss_client_options を初期化します。*/
init_options(oss_client_options);
/* パラメーターを初期化します。*/
aos_string_t bucket;
aos_string_t object;
aos_list_t buffer;
aos_buf_t *content = NULL;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
/* char* 型のデータをバケットに割り当てます。*/
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_list_init(&buffer);
content = aos_buf_pack(oss_client_options->pool, object_content, strlen(object_content));
aos_list_add_tail(&content->node, &buffer);
/* ファイルをアップロードします。*/
resp_status = oss_put_object_from_buffer(oss_client_options, &bucket, &object, &buffer, headers, &resp_headers);
/* ファイルがアップロードされたかどうかを確認します。*/
if (aos_status_is_ok(resp_status)) {
printf("put object from buffer succeeded\n");
} else {
printf("put object from buffer failed\n");
}
/* メモリプールを解放します。これは、リクエスト中にさまざまなリソースに割り当てられたメモリを解放することに相当します。*/
aos_pool_destroy(pool);
/* 以前に割り当てられたグローバルリソースを解放します。*/
aos_http_io_deinitialize();
return 0;
}
ファイルのダウンロード
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
const char *endpoint = "yourEndpoint";
/* 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
const char *access_key_id = getenv("OSS_ACCESS_KEY_ID");
const char *access_key_secret = getenv("OSS_ACCESS_KEY_SECRET");
/* STS から取得したセキュリティトークン (SecurityToken)。*/
const char *sts_token = "yourStsToken";
/* バケット名を指定します。例:examplebucket */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt */
const char *object_name = "exampledir/exampleobject.txt";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* aos_string_t 型を char* 文字列で初期化します。*/
aos_str_set(&options->config->endpoint, endpoint);
aos_str_set(&options->config->access_key_id, access_key_id);
aos_str_set(&options->config->access_key_secret, access_key_secret);
aos_str_set(&options->config->sts_token, sts_token);
/* CNAME ドメイン名を使用するかどうかを指定します。値 0 は、CNAME ドメイン名が使用されないことを示します。*/
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定するために使用されます。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* プログラムのエントリで aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリなどのグローバルリソースを初期化します。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリ管理用のメモリプール (pool)。apr_pool_t に相当します。その実装コードは APR ライブラリにあります。*/
aos_pool_t *pool;
/* 新しいメモリプールを作成します。2 番目のパラメーターは NULL で、プールが他のメモリプールから継承しないことを示します。*/
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。このパラメーターには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバル構成情報が含まれます。*/
oss_request_options_t *oss_client_options;
/* メモリプール内のオプションにメモリを割り当てます。*/
oss_client_options = oss_request_options_create(pool);
/* クライアントオプション oss_client_options を初期化します。*/
init_options(oss_client_options);
/* パラメーターを初期化します。*/
aos_string_t bucket;
aos_string_t object;
aos_list_t buffer;
aos_buf_t *content = NULL;
aos_table_t *params = NULL;
aos_table_t *headers = NULL;
aos_table_t *resp_headers = NULL;
aos_status_t *resp_status = NULL;
char *buf = NULL;
int64_t len = 0;
int64_t size = 0;
int64_t pos = 0;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_list_init(&buffer);
/* ファイルをローカルメモリにダウンロードします。*/
resp_status = oss_get_object_to_buffer(oss_client_options, &bucket, &object,
headers, params, &buffer, &resp_headers);
if (aos_status_is_ok(resp_status)) {
printf("get object to buffer succeeded\n");
/* ダウンロードしたコンテンツをバッファーにコピーします。*/
len = aos_buf_list_len(&buffer);
buf = aos_pcalloc(pool, len + 1);
buf[len] = '\0';
aos_list_for_each_entry(aos_buf_t, content, &buffer, node) {
size = aos_buf_size(content);
memcpy(buf + pos, content->pos, size);
pos += size;
}
}
else {
printf("get object to buffer failed\n");
}
/* メモリプールを解放します。これは、リクエスト中にさまざまなリソースに割り当てられたメモリを解放することに相当します。*/
aos_pool_destroy(pool);
/* 以前に割り当てられたグローバルリソースを解放します。*/
aos_http_io_deinitialize();
return 0;
}
署名付き URL を使用した一時的なアクセス権限の付与
注意事項
OSS SDK を使用して署名付き URL を生成すると、OSS SDK はローカルコンピューターに保存されているキー情報に基づいて特定のアルゴリズムを使用して署名を計算し、その署名を URL に追加して URL の有効性とセキュリティを確保します。URL の計算と構築を行う操作はクライアントで完了します。ネットワーク経由でサーバーにリクエストを送信する必要はありません。これにより、署名付き URL を生成する際に、呼び出し元に特定の権限を付与する必要がなくなります。ただし、サードパーティのユーザーが署名付き URL によって承認されたリソースに対して関連操作を実行できるようにするには、署名付き URL を生成するための API 操作を呼び出すプリンシパルが、対応する権限を持っていることを確認する必要があります。
たとえば、プリンシパルが署名付き URL を使用してオブジェクトをアップロードする場合、そのプリンシパルに oss:PutObject 権限を付与する必要があります。プリンシパルが署名付き URL を使用してオブジェクトをダウンロードまたはプレビューする場合、そのプリンシパルに oss:GetObject 権限を付与する必要があります。
署名付き URL を生成し、その URL をビジターに提供して一時的なアクセスを許可できます。署名付き URL を生成する際に、URL の有効期間を指定して、ビジターが特定のデータにアクセスできる期間を制限できます。
HTTPS 経由でリソースにアクセスするために使用される署名付き URL を生成するには、エンドポイントのプロトコルを HTTPS に設定します。
次のサンプルコードを使用して生成された署名付き URL には、プラス記号 (+) が含まれている場合があります。この場合、URL 内のプラス記号 (+) を %2B に置き換えてください。そうしないと、署名付き URL を使用してオブジェクトに期待どおりにアクセスできない場合があります。
署名付き URL の生成とそれを使用したファイルのアップロード
アップロード用の署名付き URL の生成
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
const char *endpoint = "yourEndpoint";
/* バケット名を指定します。例:examplebucket */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt */
const char *object_name = "exampledir/exampleobject.txt";
/* ローカルファイルの完全なパスを指定します。*/
const char *local_filename = "yourLocalFilename";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* aos_string_t 型を char* 文字列で初期化します。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
/* CNAME ドメイン名を使用して OSS にアクセスするかどうかを指定します。値 0 は、CNAME ドメイン名が使用されないことを示します。*/
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定します。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* プログラムのエントリで aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリなどのグローバルリソースを初期化します。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリ管理用のメモリプール (pool)。apr_pool_t に相当します。その実装コードは APR ライブラリにあります。*/
aos_pool_t *pool;
/* 新しいメモリプールを作成します。2 番目のパラメーターは NULL で、プールが他のメモリプールから継承しないことを示します。*/
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。このパラメーターには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバル構成情報が含まれます。*/
oss_request_options_t *oss_client_options;
/* メモリプール内のオプションにメモリを割り当てます。*/
oss_client_options = oss_request_options_create(pool);
/* クライアントオプション oss_client_options を初期化します。*/
init_options(oss_client_options);
/* パラメーターを初期化します。*/
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_http_request_t *req;
apr_time_t now;
char *url_str;
aos_string_t url;
int64_t expire_time;
int one_hour = 3600;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
expire_time = now / 1000000 + one_hour;
req = aos_http_request_create(pool);
req->method = HTTP_PUT;
now = apr_time_now();
/* 単位:マイクロ秒 */
expire_time = now / 1000000 + one_hour;
/* 署名付き URL を生成します。*/
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
aos_str_set(&url, url_str);
printf("Temporary upload URL: %s\n", url_str);
/* メモリプールを解放します。これは、リクエスト中にさまざまなリソースに割り当てられたメモリを解放することに相当します。*/
aos_pool_destroy(pool);
/* 以前に割り当てられたグローバルリソースを解放します。*/
aos_http_io_deinitialize();
return 0;
}
署名付き URL を使用したファイルのアップロード
署名付き URL を使用したファイルのアップロードについては、Android SDK のサンプルコードをご参照ください。詳細については、「アクセス権限の付与 (Android SDK)」をご参照ください。
署名付き URL の生成とそれを使用したファイルのダウンロード
ダウンロード用の署名付き URL の生成
#include "oss_api.h"
#include "aos_http_io.h"
/* yourEndpoint を、バケットが配置されているリージョンのエンドポイントに設定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。*/
const char *endpoint = "yourEndpoint";
/* バケット名を指定します。例:examplebucket */
const char *bucket_name = "examplebucket";
/* オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例:exampledir/exampleobject.txt */
const char *object_name = "exampledir/exampleobject.txt";
/* ローカルファイルの完全なパスを指定します。*/
const char *local_filename = "yourLocalFilename";
void init_options(oss_request_options_t *options)
{
options->config = oss_config_create(options->pool);
/* aos_string_t 型を char* 文字列で初期化します。*/
aos_str_set(&options->config->endpoint, endpoint);
/* 環境変数からアクセス認証情報を取得します。このサンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。*/
aos_str_set(&options->config->access_key_id, getenv("OSS_ACCESS_KEY_ID"));
aos_str_set(&options->config->access_key_secret, getenv("OSS_ACCESS_KEY_SECRET"));
/* CNAME ドメイン名を使用して OSS にアクセスするかどうかを指定します。値 0 は、CNAME ドメイン名が使用されないことを示します。*/
options->config->is_cname = 0;
/* タイムアウト期間などのネットワークパラメーターを設定します。*/
options->ctl = aos_http_controller_create(options->pool, 0);
}
int main(int argc, char *argv[])
{
/* プログラムのエントリで aos_http_io_initialize メソッドを呼び出して、ネットワークやメモリなどのグローバルリソースを初期化します。*/
if (aos_http_io_initialize(NULL, 0) != AOSE_OK) {
exit(1);
}
/* メモリ管理用のメモリプール (pool)。apr_pool_t に相当します。その実装コードは APR ライブラリにあります。*/
aos_pool_t *pool;
/* 新しいメモリプールを作成します。2 番目のパラメーターは NULL で、プールが他のメモリプールから継承しないことを示します。*/
aos_pool_create(&pool, NULL);
/* オプションを作成して初期化します。このパラメーターには、endpoint、access_key_id、access_key_secret、is_cname、curl などのグローバル構成情報が含まれます。*/
oss_request_options_t *oss_client_options;
/* メモリプール内のオプションにメモリを割り当てます。*/
oss_client_options = oss_request_options_create(pool);
/* クライアントオプション oss_client_options を初期化します。*/
init_options(oss_client_options);
/* パラメーターを初期化します。*/
aos_string_t bucket;
aos_string_t object;
aos_string_t file;
aos_http_request_t *req;
apr_time_t now;
char *url_str;
aos_string_t url;
int64_t expire_time;
int one_hour = 3600;
aos_str_set(&bucket, bucket_name);
aos_str_set(&object, object_name);
aos_str_set(&file, local_filename);
expire_time = now / 1000000 + one_hour;
req = aos_http_request_create(pool);
req->method = HTTP_GET;
now = apr_time_now();
/* 単位:マイクロ秒 */
expire_time = now / 1000000 + one_hour;
/* 署名付き URL を生成します。*/
url_str = oss_gen_signed_url(oss_client_options, &bucket, &object, expire_time, req);
aos_str_set(&url, url_str);
printf("Temporary download URL: %s\n", url_str);
/* メモリプールを解放します。これは、リクエスト中にさまざまなリソースに割り当てられたメモリを解放することに相当します。*/
aos_pool_destroy(pool);
/* 以前に割り当てられたグローバルリソースを解放します。*/
aos_http_io_deinitialize();
return 0;
}
署名付き URL を使用したファイルのダウンロード
署名付き URL を使用したファイルのダウンロードについては、Android SDK のサンプルコードをご参照ください。詳細については、「アクセス権限の付与 (Android SDK)」をご参照ください。