セキュリティトークンサービス (STS) を使用すると、永続的な AccessKey ペアを公開することなく、Object Storage Service (OSS) リソースへの期限付きアクセスを許可できます。一時的な認証情報が有効期限切れになると、アクセスは自動的に取り消されます。
次のような場合に、STS ベースの一時的な認証情報を使用します。
永続的な認証情報を共有することなく、サードパーティ (サプライヤーやパートナーなど) にご利用の OSS バケットへの期限付きアクセスを許可する
権限を動的にコントロールする — サードパーティが必要とする特定の操作のみを許可し、要件の変更に応じてアクセスを調整または取り消す
外部関係者のための長期的な認証情報の管理を回避する
OSS は、一時的なアクセス用に署名付き URL もサポートしています。ロールベースの権限コントロールと動的なアクセス管理が必要な場合は STS を使用します。期限付き URL で特定のオブジェクトを共有する必要がある場合は、署名付き URL を使用します。
仕組み
このフローには、企業 (Alibaba Cloud アカウント (root ユーザー) の所有者)、STS、およびサプライヤー (サードパーティ) の 3 者が関与します。
企業は Resource Access Management (RAM) ユーザーと RAM ロールを設定し、そのロールに必要な OSS 権限を付与します。
サプライヤーは、企業のアプリケーションサーバに一時的な認証情報をリクエストします。
アプリケーションサーバは、RAM ユーザーの認証情報を使用して
AssumeRoleを呼び出し、STS から一時的な認証情報を取得します。STS は、有効期限付きの一時的な認証情報 (AccessKey ID、AccessKey Secret、および STS トークン) を返します。
サプライヤーは、一時的な認証情報を使用して OSS バケットにデータをアップロードします。
前提条件
開始する前に、以下を確認してください。
既存の OSS バケットがあること。詳細については、「バケットの作成」をご参照ください。
ステップ 1: 企業側の設定
企業は、サプライヤーが一時的な認証情報をリクエストできるように、以下の設定を一度だけ行います。
1.1 RAM ユーザーの作成
RAM ユーザーは、ご利用のアプリケーションサーバを表します。企業に代わって STS を呼び出し、一時的な認証情報を生成します。
RAM コンソールにログインします。RAM コンソールRAM コンソールRAM コンソールRAM コンソールRAM コンソール。
左側のナビゲーションウィンドウで、[Identities] > [Users] を選択します。
[ユーザーの作成] をクリックします。
[ログオン名] および [表示名] を指定します。
[アクセスモード] で、[永続的な AccessKey を使用してアクセス] を選択し、次に [OK] をクリックします。
プロンプトに従ってセキュリティ検証を完了します。
AccessKey ID と AccessKey Secret をコピーし、安全な場所に保存します。
AccessKey Secret は作成時に一度しか表示されません。すぐに CSV ファイルをダウンロードし、安全な場所に保管してください。

1.2 RAM ユーザーへの AssumeRole 呼び出し権限の付与
RAM コンソールで、ID > ユーザー を選択します。
作成した RAM ユーザーを見つけ、[操作列] で [権限の追加] をクリックします。
[権限の付与] パネルで [AliyunSTSAssumeRoleAccess] ポリシーを選択します。
[権限を付与] をクリックします。
AliyunSTSAssumeRoleAccess は、RAM ユーザーに AssumeRole の呼び出しのみを許可します。OSS へのアクセス権は付与されません。これは次に作成する RAM ロールから付与されます。
1.3 RAM ロールの作成
RAM ロールは、一時的な認証情報で何ができるかを定義します。サプライヤーの一時的な認証情報は、このロールの権限を継承します。
RAM コンソールで、[アイデンティティ] > [ロール] を選択します。
[ロールの作成] をクリックします。
[プリンシパルタイプ] を [クラウドアカウント] に、プリンシパル名 を [現在のアカウント] に設定し、[OK]をクリックします。

「ロールの作成」ダイアログで、ロール名を指定し、[OK] をクリックします。
ロールの詳細ページで、[コピー] を [基本情報] セクションの ARN フィールドの横をクリックします。ARN を保存してください。AssumeRole を呼び出す際に必要になります。

1.4 RAM ロールへの OSS アップロード権限の付与
サプライヤーが必要とする権限のみを付与するポリシーを RAM ロールにアタッチします。
カスタムポリシーの作成:
RAM コンソールで、[権限] > [ポリシー] を選択します。
[ポリシーの作成] をクリックします。
[JSON] をクリックし、特定のバケットにオブジェクトをアップロードできる次のポリシーを入力します:
警告この例では、バケット全体への広範なアップロードアクセスを許可しています。本番環境で使用する場合は、
Resourceを特定のディレクトリに制限してください。詳細については、「RAM ポリシーの一般的な例」をご参照ください。oss:PutObjectは、単純なアップロード、フォームアップロード、追加アップロード、マルチパートアップロード、および再開可能なアップロードをカバーします。その他の操作については、「OSS の RAM ポリシーにおける Action 要素」をご参照ください。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:examplebucket/*" ] } ] }[OK] をクリックします。ダイアログボックスで、ポリシー名(例:
RamTestPolicy)を入力し、[OK] をクリックします。
RAM ロールへのポリシーのアタッチ:
RAM コンソールで、[アイデンティティ] > [ロール] を選択します。
RamOssTestロールを見つけ、操作列の [権限の付与] をクリックします。「ポリシー」セクションで、タイプのドロップダウンから「カスタムポリシー」を選択し、次に
RamTestPolicyを選択します。[権限を付与] をクリックしてください。
1.5 一時的な認証情報の生成
アプリケーションサーバは、RAM ユーザーの AccessKey ペア (ステップ 1.1 で取得) を使用して AssumeRole を呼び出し、STS から一時的な認証情報を取得します。
Alibaba Cloud アカウントのものではなく、RAM ユーザーの AccessKey ペアを使用してください。Alibaba Cloud アカウントの認証情報で STS を呼び出すと失敗します。
以下のすべての例では、環境変数から認証情報を読み取り、ステップ 1.3 で取得した RAM ロールの ARN を使用します。返される認証情報には、AccessKey ID (STS. で始まる)、AccessKey Secret、STS トークン、および有効期限が含まれます。
応答の例:
{
"AccessKeyId": "STS.****************",
"AccessKeySecret": "3dZn*******************************************",
"SecurityToken": "CAIS*****************************************************************************************************************************************",
"Expiration": "2024-**-*****:**:50Z"
}有効期限は協定世界時 (UTC) です。例えば、2024-04-18T11:33:40Z は 2024 年 4 月 18 日 19:33:40 (UTC+8) を意味します。Alibaba Cloud アカウント、およびその RAM ユーザーと RAM ロールは、STS に 1 秒あたり最大 100 リクエスト (RPS) を送信できます。同時実行数の多いシナリオでは、各操作で新しい認証情報をリクエストするのではなく、有効期限が切れるまで認証情報を再利用してください。
有効期間:
| シナリオ | 最小 | 最大 |
|---|---|---|
| デフォルトのロールの最大セッション期間 (3,600 秒) | 900 秒 | 3,600 秒 |
| カスタムのロールの最大セッション期間 | 900 秒 | 最大 43,200 秒 |
操作に十分な長さの有効期間を設定してください。大きなファイルのアップロードやその他の時間のかかるタスクの場合は、操作の途中で認証情報をリフレッシュしないように、より長い期間を使用してください。
Java
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.auth.sts.AssumeRoleRequest;
import com.aliyuncs.auth.sts.AssumeRoleResponse;
public class StsServiceSample {
public static void main(String[] args) {
// STS エンドポイント — 応答を高速化するため、アプリケーションサーバと同じリージョンのものを使用します
String endpoint = "sts.cn-hangzhou.aliyuncs.com";
// 環境変数から RAM ユーザーの認証情報を読み取ります (ステップ 1.1 で作成)
String accessKeyId = System.getenv("ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ACCESS_KEY_SECRET");
// 環境変数から RAM ロールの ARN を読み取ります (ステップ 1.3 で作成)
String roleArn = System.getenv("RAM_ROLE_ARN");
// このセッションを識別するためのラベル — 監査に役立ちます
String roleSessionName = "yourRoleSessionName";
// null は、一時的な認証情報がすべてのロール権限を継承することを意味します
String policy = null;
// 有効期間 (秒単位) (最小: 900、最大: ロールの最大セッション期間、デフォルト最大: 3,600)
Long durationSeconds = 3600L;
try {
String regionId = "";
// STS SDK for Java V3.12.0 以降の場合:
DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
// STS SDK for Java V3.12.0 より前の場合:
// DefaultProfile.addEndpoint("", regionId, "Sts", endpoint);
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
final AssumeRoleRequest request = new AssumeRoleRequest();
// STS SDK for Java V3.12.0 以降の場合:
request.setSysMethod(MethodType.POST);
// STS SDK for Java V3.12.0 より前の場合:
// request.setMethod(MethodType.POST);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy);
request.setDurationSeconds(durationSeconds);
final AssumeRoleResponse response = client.getAcsResponse(request);
System.out.println("Expiration: " + response.getCredentials().getExpiration());
System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
System.out.println("RequestId: " + response.getRequestId());
} catch (ClientException e) {
System.out.println("Failed: ");
System.out.println("Error code: " + e.getErrCode());
System.out.println("Error message: " + e.getErrMsg());
System.out.println("RequestId: " + e.getRequestId());
}
}
}Python
# -*- coding: utf-8 -*-
from aliyunsdkcore import client
from aliyunsdkcore.request import CommonRequest
import json
import oss2
import os
# 環境変数から RAM ユーザーの認証情報を読み取ります (ステップ 1.1 で作成)
access_key_id = os.getenv("ACCESS_KEY_ID")
access_key_secret = os.getenv("ACCESS_KEY_SECRET")
# 環境変数から RAM ロールの ARN を読み取ります (ステップ 1.3 で作成)
role_arn = os.getenv("RAM_ROLE_ARN")
clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')
request = CommonRequest(product="Sts", version='2015-04-01', action_name='AssumeRole')
request.set_method('POST')
request.set_protocol_type('https')
request.add_query_param('RoleArn', role_arn)
# このセッションを識別するためのラベル
request.add_query_param('RoleSessionName', 'sessiontest')
# 有効期間: 3,600 秒
request.add_query_param('DurationSeconds', '3600')
request.set_accept_format('JSON')
body = clt.do_action_with_exception(request)
token = json.loads(oss2.to_unicode(body))
print('AccessKeyId: ' + token['Credentials']['AccessKeyId'])
print('AccessKeySecret: ' + token['Credentials']['AccessKeySecret'])
print('SecurityToken: ' + token['Credentials']['SecurityToken'])
print('Expiration: ' + token['Credentials']['Expiration'])Node.js
const { STS } = require('ali-oss');
const express = require("express");
const app = express();
app.get('/sts', (req, res) => {
let sts = new STS({
// 環境変数から RAM ユーザーの認証情報を読み取ります (ステップ 1.1 で作成)
accessKeyId: process.env.ACCESS_KEY_ID,
accessKeySecret: process.env.ACCESS_KEY_SECRET
});
// 環境変数から RAM ロールの ARN を読み取ります (ステップ 1.3 で作成)
// 2 番目の引数は、権限をさらに制限するためのオプションのインラインポリシーです
// 有効期間: 3,600 秒 (最小: 900)
// このセッションを識別するためのラベル
sts.assumeRole(process.env.RAM_ROLE_ARN, ``, '3600', 'sessiontest').then((result) => {
console.log(result);
res.set('Access-Control-Allow-Origin', '*');
res.set('Access-Control-Allow-METHOD', 'GET');
res.json({
AccessKeyId: result.credentials.AccessKeyId,
AccessKeySecret: result.credentials.AccessKeySecret,
SecurityToken: result.credentials.SecurityToken,
Expiration: result.credentials.Expiration
});
}).catch((err) => {
console.log(err);
res.status(400).json(err.message);
});
});
app.listen(8000, () => {
console.log("server listen on:8000")
})Go
package main
import (
"fmt"
"os"
openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
func main() {
// 環境変数から RAM ユーザーの認証情報を読み取ります (ステップ 1.1 で作成)
accessKeyId := os.Getenv("ACCESS_KEY_ID")
accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")
// 環境変数から RAM ロールの ARN を読み取ります (ステップ 1.3 で作成)
roleArn := os.Getenv("RAM_ROLE_ARN")
config := &openapi.Config{
AccessKeyId: tea.String(accessKeyId),
AccessKeySecret: tea.String(accessKeySecret),
}
// STS エンドポイント — すべてのエンドポイントについては https://api.alibabacloud.com/product/Sts をご参照ください
config.Endpoint = tea.String("sts.cn-hangzhou.aliyuncs.com")
client, err := sts20150401.NewClient(config)
if err != nil {
fmt.Printf("Failed to create client: %v\n", err)
return
}
request := &sts20150401.AssumeRoleRequest{
// 有効期間: 3,600 秒
DurationSeconds: tea.Int64(3600),
RoleArn: tea.String(roleArn),
// このセッションを識別するためのラベル
RoleSessionName: tea.String("examplename"),
}
response, err := client.AssumeRoleWithOptions(request, &util.RuntimeOptions{})
if err != nil {
fmt.Printf("Failed to assume role: %v\n", err)
return
}
credentials := response.Body.Credentials
fmt.Println("AccessKeyId: " + tea.StringValue(credentials.AccessKeyId))
fmt.Println("AccessKeySecret: " + tea.StringValue(credentials.AccessKeySecret))
fmt.Println("SecurityToken: " + tea.StringValue(credentials.SecurityToken))
fmt.Println("Expiration: " + tea.StringValue(credentials.Expiration))
}php
<?php
require __DIR__ . '/vendor/autoload.php';
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
use AlibabaCloud\Sts\Sts;
// 環境変数から RAM ユーザーの認証情報を読み取ります (ステップ 1.1 で作成)
$accessKeyId = getenv("ACCESS_KEY_ID");
$accessKeySecret = getenv("ACCESS_KEY_SECRET");
// 環境変数から RAM ロールの ARN を読み取ります (ステップ 1.3 で作成)
$roleArn = getenv("RAM_ROLE_ARN");
AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret)
->regionId('cn-hangzhou')
->asDefaultClient();
try {
$result = Sts::v20150401()
->assumeRole()
->withRoleArn($roleArn)
// このセッションを識別するためのラベル
->withRoleSessionName('sessiontest')
// 有効期間: 3,600 秒
->withDurationSeconds(3600)
->request();
$credentials = $result['Credentials'];
echo 'AccessKeyId: ' . $credentials['AccessKeyId'] . PHP_EOL;
echo 'AccessKeySecret: ' . $credentials['AccessKeySecret'] . PHP_EOL;
echo 'SecurityToken: ' . $credentials['SecurityToken'] . PHP_EOL;
echo 'Expiration: ' . $credentials['Expiration'] . PHP_EOL;
} catch (ClientException $e) {
echo $e->getErrorMessage() . PHP_EOL;
} catch (ServerException $e) {
echo $e->getErrorMessage() . PHP_EOL;
}Ruby
require 'sinatra'
require 'base64'
require 'open-uri'
require 'cgi'
require 'openssl'
require 'json'
require 'sinatra/reloader'
require 'sinatra/content_for'
require 'aliyunsdkcore'
set :public_folder, File.dirname(__FILE__) + '/templates'
def get_sts_token_for_oss_upload()
client = RPCClient.new(
# 環境変数から RAM ユーザーの認証情報を読み取ります (ステップ 1.1 で作成)
access_key_id: ENV['ACCESS_KEY_ID'],
access_key_secret: ENV['ACCESS_KEY_SECRET'],
endpoint: 'https://sts.cn-hangzhou.aliyuncs.com',
api_version: '2015-04-01'
)
response = client.request(
action: 'AssumeRole',
params: {
# 環境変数から RAM ロールの ARN を読み取ります (ステップ 1.3 で作成)
"RoleArn": ENV['RAM_ROLE_ARN'],
# 有効期間: 3,600 秒
"DurationSeconds": 3600,
# このセッションを識別するためのラベル
"RoleSessionName": "sessiontest"
},
opts: {
method: 'POST',
format_params: true
}
)
end
$server_ip = "127.0.0.1" # 別の IP アドレスでリッスンするには、サーバ側で認証を実装します
$server_port = 8000
if ARGV.length == 1
$server_port = ARGV[0]
elsif ARGV.length == 2
$server_ip = ARGV[0]
$server_port = ARGV[1]
end
puts "App server is running on: http://#{$server_ip}:#{$server_port}"
set :bind, $server_ip
set :port, $server_port
get '/get_sts_token_for_oss_upload' do
token = get_sts_token_for_oss_upload()
response = {
"AccessKeyId" => token["Credentials"]["AccessKeyId"],
"AccessKeySecret" => token["Credentials"]["AccessKeySecret"],
"SecurityToken" => token["Credentials"]["SecurityToken"],
"Expiration" => token["Credentials"]["Expiration"]
}
response.to_json
end
get '/*' do
puts "********************* GET "
send_file File.join(settings.public_folder, 'index.html')
end他の言語については、「STS SDK の概要」をご参照ください。
詳細な権限 (オプション)
デフォルトでは、一時的な認証情報は RAM ロールのすべての権限を持ちます。例えば、特定のディレクトリへのアップロードのみを許可するなど、さらに制限するには、AssumeRole リクエストでインラインポリシーを渡します。最終的な権限は、ロールの権限とインラインポリシーの共通部分になります。
// このポリシーは、一時的な認証情報が src/ ディレクトリへのオブジェクトのアップロードのみに制限します。
// 最終的な権限 = ロールの権限 (ステップ 1.4) とこのインラインポリシーの共通部分
String policy = "{\n" +
" \"Version\": \"1\", \n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": [\n" +
" \"oss:PutObject\"\n" +
" ], \n" +
" \"Resource\": [\n" +
" \"acs:oss:*:*:examplebucket/src/*\" \n" +
" ], \n" +
" \"Effect\": \"Allow\"\n" +
" }\n" +
" ]\n" +
"}";ステップ 2: 一時的な認証情報を使用したデータのアップロード
2025 年 3 月 20 日以降、新しい OSS ユーザーは、中国本土リージョンの OSS バケットでデータ API オペレーションを実行するために、カスタムドメイン名(CNAME)を使用する必要があります。これらのオペレーションでは、デフォルトのパブリックエンドポイントが制限されています。公式アナウンスで、影響を受けるオペレーションの完全なリストをご確認ください。HTTPS 経由でデータにアクセスする場合は、カスタムドメインに有効な SSL 証明書をバインドしてください。これは OSS コンソールへのアクセスに必須です。
ステップ 1.5 で取得した一時的な認証情報 (AccessKey ID、AccessKey Secret、および STS トークン) を使用して OSS クライアントを初期化します。一時的な AccessKey ID は STS. で始まります。
他の言語については、「概要」をご参照ください。
Java
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.File;
public class Demo {
public static void main(String[] args) throws Exception {
// ステップ 1.5 で取得した一時的な認証情報を使用します — RAM ユーザーの認証情報ではありません
// 一時的な AccessKey ID は STS. で始まります
String accessKeyId = "yourSTSAccessKeyID";
String accessKeySecret = "yourSTSAccessKeySecret";
String stsToken = "yourSecurityToken";
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// V4 署名を使用
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
// バケットが配置されているリージョンのエンドポイント、例: https://oss-cn-hangzhou.aliyuncs.com
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
// リージョン ID、例: cn-hangzhou
.region("region")
.build();
try {
// exampletest.txt を examplebucket にアップロード
PutObjectRequest putObjectRequest = new PutObjectRequest(
"examplebucket",
"exampletest.txt",
new File("D:\\localpath\\exampletest.txt")
);
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("OSS error — request reached OSS but was rejected:");
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("Client error — could not reach OSS:");
System.out.println("Error Message: " + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}Python
OSS SDK for Python には 2 つのバージョンがあります。バージョン 2.0 は 1.0 の完全な書き換えであり、認証、リトライロジック、エラー処理が合理化され、より柔軟な設定オプションが追加されています。
V2 の例
import alibabacloud_oss_v2 as oss
def main():
# ステップ 1.5 で取得した一時的な認証情報を使用します — RAM ユーザーの認証情報ではありません
# 一時的な AccessKey ID は STS. で始まります
sts_access_key_id = 'yourSTSAccessKeyID'
sts_access_key_secret = 'yourSTSAccessKeySecret'
sts_security_token = 'yourSecurityToken'
credentials_provider = oss.credentials.StaticCredentialsProvider(
access_key_id=sts_access_key_id,
access_key_secret=sts_access_key_secret,
security_token=sts_security_token,
)
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# バケットが配置されているリージョン、例: cn-hangzhou
cfg.region = 'cn-hangzhou'
client = oss.Client(cfg)
# ローカルファイルを examplebucket にアップロード
local_file_path = 'D:\\localpath\\exampletest.txt'
with open(local_file_path, 'rb') as file:
data = file.read()
result = client.put_object(oss.PutObjectRequest(
bucket='examplebucket',
key='exampletest.txt',
body=data,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' content md5: {result.content_md5},'
f' etag: {result.etag},'
f' hash crc64: {result.hash_crc64},'
f' version id: {result.version_id},'
)
if __name__ == "__main__":
main()V1 の例
# -*- coding: utf-8 -*-
import oss2
# バケットが配置されているリージョンのエンドポイント、例: https://oss-cn-hangzhou.aliyuncs.com
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# ステップ 1.5 で取得した一時的な認証情報を使用します — RAM ユーザーの認証情報ではありません
sts_access_key_id = 'yourAccessKeyId'
sts_access_key_secret = 'yourAccessKeySecret'
bucket_name = 'examplebucket'
object_name = 'examplebt.txt'
security_token = 'yourSecurityToken'
auth = oss2.StsAuth(sts_access_key_id, sts_access_key_secret, security_token)
bucket = oss2.Bucket(auth, endpoint, bucket_name)
result = bucket.put_object(object_name, "hello world")
print(result.status)Go
OSS SDK for Go には 2 つのバージョンがあります。バージョン 2.0 は 1.0 の完全な書き換えであり、認証、リトライロジック、エラー処理が合理化され、より柔軟な設定オプションが追加されています。
V2 の例
package main
import (
"context"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)
func main() {
// バケットが配置されているリージョン、例: cn-hangzhou
region := "cn-hangzhou"
// ステップ 1.5 で取得した一時的な認証情報を使用します — RAM ユーザーの認証情報ではありません
// 一時的な AccessKey ID は STS. で始まります
accessKeyID := "yourSTSAccessKeyID"
accessKeySecret := "yourSTSAccessKeySecret"
stsToken := "yourSecurityToken"
provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret, stsToken)
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(provider).
WithRegion(region)
client := oss.NewClient(cfg)
localFile := "D:\\localpath\\exampletest.txt"
putRequest := &oss.PutObjectRequest{
Bucket: oss.Ptr("examplebucket"),
Key: oss.Ptr("exampletest.txt"),
StorageClass: oss.StorageClassStandard,
Acl: oss.ObjectACLPrivate,
Metadata: map[string]string{
"yourMetadataKey1": "yourMetadataValue1",
},
}
result, err := client.PutObjectFromFile(context.TODO(), putRequest, localFile)
if err != nil {
log.Fatalf("failed to put object from file %v", err)
}
log.Printf("put object from file result:%#v\n", result)
}V1 の例
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func main() {
// 環境変数から一時的な認証情報を読み取ります
// 実行前に OSS_ACCESS_KEY_ID、OSS_ACCESS_KEY_SECRET、および OSS_SESSION_TOKEN を設定します
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケットが配置されているリージョンのエンドポイント、例: https://oss-cn-hangzhou.aliyuncs.com
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
bucketName := "examplebucket"
objectName := "exampledir/exampleobject.txt"
filepath := "D:\\localpath\\examplefile.txt"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
err = bucket.PutObjectFromFile(objectName, filepath)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Println("upload success")
}Node.js
この例では Axios が必要です。
const axios = require("axios");
const OSS = require("ali-oss");
const getToken = async () => {
// アプリケーションサーバ (ステップ 1.5 を実行中) から一時的な認証情報を取得します
await axios.get("http://localhost:8000/sts").then((token) => {
const client = new OSS({
// バケットが配置されているリージョン、例: oss-cn-hangzhou
region: 'oss-cn-hangzhou',
// ステップ 1.5 で取得した一時的な認証情報を使用します
accessKeyId: token.data.AccessKeyId,
accessKeySecret: token.data.AccessKeySecret,
stsToken: token.data.SecurityToken,
authorizationV4: true,
bucket: "examplebucket",
// 有効期限が切れる前に認証情報を自動的にリフレッシュします
refreshSTSToken: async () => {
const refreshToken = await axios.get("http://localhost:8000/sts");
return {
accessKeyId: refreshToken.data.AccessKeyId,
accessKeySecret: refreshToken.data.AccessKeySecret,
stsToken: refreshToken.data.SecurityToken,
};
},
});
// 一時的な認証情報を使用してオブジェクトをアップロードします
client.put('exampleobject.jpg', 'D:\\example.jpg')
.then((res) => { console.log(res) })
.catch(e => console.log(e))
});
};
getToken()php
<?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\Credentials\StaticCredentialsProvider;
use OSS\OssClient;
use OSS\Core\OssException;
try {
// ステップ 1.5 で取得した一時的な認証情報を使用します — RAM ユーザーの認証情報ではありません
// 一時的な AccessKey ID は STS. で始まります
$accessKeyId = 'yourSTSAccessKeyID';
$accessKeySecret = 'yourSTSAccessKeySecret';
$securityToken = 'yourSecurityToken';
$provider = new StaticCredentialsProvider($accessKeyId, $accessKeySecret, $securityToken);
// バケットが配置されているリージョンのエンドポイント、例: https://oss-cn-hangzhou.aliyuncs.com
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
$bucket = "examplebucket";
$object = "exampletest.txt";
$localFilePath = "D:\\localpath\\exampletest.txt";
$options = array(
OssClient::OSS_HEADERS => array(
'x-oss-object-acl' => 'private',
'x-oss-meta-info' => 'yourinfo'
),
);
$config = array(
"provider" => $provider,
"endpoint" => $endpoint,
"signatureVersion" => OssClient::OSS_SIGNATURE_VERSION_V4,
// バケットが配置されているリージョン、例: cn-hangzhou
"region" => "cn-hangzhou"
);
$ossClient = new OssClient($config);
$ossClient->putObject($bucket, $object, $localFilePath, $options);
} catch (OssException $e) {
printf($e->getMessage() . "\n");
return;
}Ruby
require 'aliyun/sts'
require 'aliyun/oss'
client = Aliyun::OSS::Client.new(
# バケットが配置されているリージョンのエンドポイント、例: https://oss-cn-hangzhou.aliyuncs.com
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# ステップ 1.5 で取得した一時的な認証情報を使用します — RAM ユーザーの認証情報ではありません
access_key_id: 'token.access_key_id',
access_key_secret: 'token.access_key_secret',
sts_token: 'token.security_token'
)
bucket = client.get_bucket('examplebucket')
bucket.put_object('exampleobject.txt', :file => 'D:\test.txt')コンプライアンスおよびセキュリティの向上を目的としたポリシー変更に伴い、2025 年 3 月 20 日から、新しい OSS ユーザーは、中国本土のリージョンにある OSS バケットでデータ API オペレーションを実行する際に、カスタムドメイン名(CNAME)を使用する必要があります。これらの操作では、デフォルトのパブリックエンドポイントが制限されます。影響を受ける操作の完全なリストについては、公式アナウンスをご参照ください。HTTPS 経由でデータにアクセスする場合は、カスタムドメインに有効な SSL 証明書をバインドする必要があります。これは、コンソールが HTTPS を強制するため、[OSS コンソールへのアクセス]に必須です。
よくある質問
"You are not authorized to do this action. You should be authorized by RAM" (この操作を行う権限がありません。RAM によって承認される必要があります)
"The Min/Max value of DurationSeconds is 15min/1hr" (DurationSeconds の最小/最大値は 15 分/1 時間です)
「指定されたセキュリティトークンは無効です」
"The OSS Access Key Id you provided does not exist in our records" (提供された OSS Access Key Id は当社の記録に存在しません)
"AccessDenied: Anonymous access is forbidden for this operation" (アクセスが拒否されました: この操作では匿名アクセスは禁止されています)
NoSuchBucket
"You have no right to access this object because of bucket acl" (バケットの ACL により、このオブジェクトにアクセスする権限がありません)
"Access denied by authorizer's policy" (承認者のポリシーによってアクセスが拒否されました)
"アクセスしようとしているバケットは、指定されたエンドポイントでアドレス指定する必要があります"
複数の有効な一時的な認証情報を同時に保持できますか?
時刻形式のエラー
エラー 0003-0000301
次のステップ
クライアントからの直接アップロード: クライアントが一時的な認証情報を使用して OSS に直接アップロードできるようにします。アップロード条件には、ファイルサイズ制限、許可されるファイルタイプ、送信先ディレクトリなどがあります。詳細については、「クライアントからの直接アップロード」をご参照ください。
アップロードされたオブジェクトの共有: 一時的な認証情報を使用してアップロードされたオブジェクトを共有するために、署名付き URL を生成します。詳細については、「署名付き URL を使用したファイルのダウンロードまたはプレビュー」をご参照ください。

