セキュリティトークンサービス (STS) は、ポリシーで定義された特定の OSS リソースへの時間制限付きアクセスをユーザーに付与する一時認証情報を生成します。これらの認証情報は自動的に有効期限切れとなり、柔軟かつ期間限定のアクセス制御を実現します。
ユースケース
E コマース企業である A 社は、大量の商品データを Alibaba Cloud OSS に保存しています。サプライヤーである B 社は、A 社の OSS に定期的にデータをアップロードし、自社システムを A 社の Alibaba Cloud リソースと統合する必要があります。
A 社には以下のセキュリティ要件があります。
データセキュリティ:A 社は、コアデータへの不正アクセスや悪用を防ぐため、長期的な AccessKey ペアを B 社に公開したくありません。
権限制御:A 社は、最初に B 社にアップロード権限のみを付与し、必要に応じて後から調整したいと考えています。これにより、アクセス権をきめ細かく制御できます。
権限管理:B 社および今後のパートナーに対して、A 社は各パートナーまたは一時的なニーズごとに認証情報を生成し、長期的な AccessKey ペアの継続的な管理を回避したいと考えています。
期間限定のアクセス制御:A 社は、B 社のデータアクセス期間を制限したいと考えています。認証情報の有効期限が切れると、B 社は自動的にアクセス権を失うため、アクセス期間を厳密に制御できます。
仕組み
A 社は一時認証情報を使用して、B 社が OSS に安全にファイルをアップロードできるように権限を付与します。
まず、A 社は必要な権限を持つ RAM ユーザーおよび RAM ロールを作成します。B 社がアクセスをリクエストすると、A 社は AssumeRole 操作を呼び出して STS 一時認証情報を取得し、それを B 社に渡します。この認証情報を使用して、B 社は A 社の OSS にデータをアップロードできます。
前提条件
A 社はバケットを作成済みです。詳細については、「バケットの作成」をご参照ください。
ステップ 1:A 社が一時認証情報を発行
1. RAM ユーザーの作成
Alibaba Cloud アカウントまたはRAM 管理者権限を持つ RAM ユーザーを使用して、RAM ユーザーを作成します。
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、アイデンティティ > Users を選択します。
ユーザーの作成 をクリックします。
ログイン名 および Display Name を入力します。
アクセスモード セクションで、OpenAPI Access を選択し、OK をクリックします。
プロンプトに従ってセキュリティ検証を完了します。
AccessKey ID および AccessKey Secret をコピーします。
重要RAM ユーザーの AccessKey Secret は作成時のみ表示され、後から取得することはできません。AccessKey ペアを含む CSV ファイルをダウンロードし、安全に保管してください。

2. RAM ユーザーに AssumeRole 権限を付与
RAM ユーザーを作成後、Alibaba Cloud アカウントまたはRAM 管理者権限を持つ RAM ユーザーを使用して、その RAM ユーザーにロールを偽装して STS サービスを呼び出す権限を付与します。
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、アイデンティティ > Users を選択します。ユーザー一覧で該当の RAM ユーザーを見つけ、Actions 列の 権限の追加 をクリックします。
Grant Permission ページで、AliyunSTSAssumeRoleAccess システムポリシーを選択します。
説明AliyunSTSAssumeRoleAccess ポリシーは、RAM ユーザーに STS
AssumeRole操作を呼び出す権限を付与します。これは、一時認証情報が継承するロール自体の権限とは異なります。
Grant permissions をクリックします。
3. RAM ロールの作成
Alibaba Cloud アカウントまたはRAM 管理者権限を持つ RAM ユーザーを使用して、RAM ロールを作成します。このロールは、偽装時に付与される OSS アクセス権限を定義します。
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、アイデンティティ > Roles を選択します。
Roles ページで、Create Role をクリックします。
Create Role ページで、Principal Type を Alibaba Cloud Account に、Principal Name を Current Alibaba Cloud Account に設定します。その後、OK をクリックします。

Create Role ダイアログボックスで、ロール名を入力し、OK をクリックします。
ARN の横にある Copy をクリックして、ロール ARN を保存します。

4. RAM ロールにファイルアップロード権限を付与
RAM ロールを作成後、Alibaba Cloud アカウントまたはRAM 管理者権限を持つ RAM ユーザーを使用して、ポリシーをロールにアタッチします。これらのポリシーは、ロールによって付与される OSS アクセス権限を定義します。
ファイルアップロード用のカスタムポリシーを作成します。
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。
ポリシー ページで、ポリシーの作成 をクリックします。
ポリシーの作成 ページで、JSON タブをクリックします。ポリシーエディターで、examplebucket へのファイルアップロード権限をロールに付与します。以下のコードはその例です。
警告以下の例は参考情報です。最適なセキュリティを確保するため、過剰な権限に起因するリスクを回避するために、より詳細な権限付与ポリシーを設定することを推奨します。詳細な権限付与ポリシーの設定方法については、「RAM または STS を使用した他ユーザーへの権限付与」をご参照ください。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "oss:PutObject" ], "Resource": [ "acs:oss:*:*:examplebucket/*" ] } ] }説明RAM ロールの OSS 権限は、
Action設定によって決まります。たとえば、oss:PutObject権限を付与すると、その RAM ロールを偽装した RAM ユーザーは、指定されたバケットに対してシンプルアップロード、フォームアップロード、追加アップロード、フラグメントアップロード、再開可能なアップロード操作を実行できます。詳細については、「OSS アクション」をご参照ください。ポリシーを設定後、OK をクリックします。Edit Basic Information ページで、ポリシー名(例:RamTestPolicy)を入力し、OK をクリックします。
作成したカスタムポリシーを RamOssTest RAM ロールに付与します。
RAM コンソールにログインします。
左側のナビゲーションウィンドウで、アイデンティティ > Roles を選択します。
Roles ページで、対象の RAM ロール RamOssTest を見つけます。
RAM ロール RamOssTest の操作列で、[追加権限] をクリックします。
Grant Permission ページで、Select Policy セクションの Custom Policy を選択します。その後、ポリシー一覧で作成済みのカスタムポリシー RamTestPolicy をクリックします。
Grant permissions をクリックします。
5. RAM ロールを引き受け、一時認証情報を取得する
STS API オペレーションを呼び出して一時認証情報を取得する際に、Alibaba Cloud アカウントの AccessKey ペアを使用しないでください。これによりエラーが発生します。以下の例では、RAM ユーザーの AccessKey ペアを使用しています。
ロールにファイルアップロード権限を付与後、RAM ユーザーはロールを偽装して一時認証情報を取得する必要があります。一時認証情報は、セキュリティトークン、一時的な AccessKey ペア(AccessKey ID および AccessKey Secret)、および有効期限で構成されます。STS SDK を使用して、シンプルアップロード (
oss:PutObject) 権限を持つ一時認証情報を取得できます。他のプログラミング言語での STS SDK の例については、「STS SDK 概要」をご参照ください。サンプルコード内の endpoint は、STS エンドポイントのアドレスです。STS の応答を高速化するには、サーバーと同じリージョンまたは近隣の STS エンドポイントを選択してください。STS エンドポイントの詳細については、「エンドポイント」をご参照ください。
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 サービスのエンドポイント。例:sts.cn-hangzhou.aliyuncs.com。STS サービスにはインターネット経由または VPC 経由でアクセスできます。
String endpoint = "sts.cn-hangzhou.aliyuncs.com";
// サブステップ 1 で作成した RAM ユーザーの AccessKey ID および AccessKey Secret を環境変数から取得します。
String accessKeyId = System.getenv("ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ACCESS_KEY_SECRET");
// サブステップ 3 で作成した RAM ロールの ARN を環境変数から取得します。
String roleArn = System.getenv("RAM_ROLE_ARN");
// 異なるトークンを区別するためにカスタムロールセッション名を指定します。例:SessionTest。
String roleSessionName = "yourRoleSessionName";
// デフォルトでは、一時認証情報は偽装されたロールのすべての権限を持ちます。
String policy = null;
// 一時認証情報の有効期間(秒単位)。最小値:900。最大値:ロールの「最大セッション期間」パラメーターの値。このパラメーターの値は 3,600 ~ 43,200 秒です。デフォルト値:3,600 秒。
// 大容量ファイルのアップロードやその他の時間のかかる操作を行う場合は、STS サービスを繰り返し呼び出して新しい一時認証情報を取得する必要がないよう、十分な有効期間を指定することを推奨します。
Long durationSeconds = 3600L;
try {
// STS リクエストを開始するリージョン。デフォルト値(空文字列 "")をそのまま使用することを推奨します。
String regionId = "";
// エンドポイントを追加します。これは STS SDK for Java 3.12.0 以降に適用されます。
DefaultProfile.addEndpoint(regionId, "Sts", endpoint);
// エンドポイントを追加します。これは STS SDK for Java 3.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 3.12.0 以降に適用されます。
request.setSysMethod(MethodType.POST);
// これは STS SDK for Java 3.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
# サブステップ 1 で作成した RAM ユーザーの AccessKey ID および AccessKey Secret を環境変数から取得します。
access_key_id = os.getenv("ACCESS_KEY_ID")
access_key_secret = os.getenv("ACCESS_KEY_SECRET")
# サブステップ 3 で作成した RAM ロールの ARN を環境変数から取得します。
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)
# 異なるトークンを区別するためにカスタムロールセッション名を指定します。例:sessiontest。
request.add_query_param('RoleSessionName', 'sessiontest')
# STS 一時認証情報の有効期限を 3,600 秒に指定します。
request.add_query_param('DurationSeconds', '3600')
request.set_accept_format('JSON')
body = clt.do_action_with_exception(request)
# RAM ユーザーの AccessKey ID および AccessKey Secret を使用して、STS に一時認証情報をリクエストします。
token = json.loads(oss2.to_unicode(body))
# STS から返された一時的な AccessKey ペア(AccessKey ID および AccessKey Secret)、セキュリティトークン、および有効期限を出力します。
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({
// サブステップ 1 で作成した RAM ユーザーの AccessKey ID および AccessKey Secret を環境変数から取得します。
accessKeyId : process.env.ACCESS_KEY_ID,
accessKeySecret : process.env.ACCESS_KEY_SECRET
});
// process.env.RAM_ROLE_ARN は、サブステップ 3 で作成した RAM ロールの ARN を環境変数から取得するために使用されます。
// カスタムポリシーを指定して、STS 一時認証情報の権限をさらに制限します。ポリシーを指定しない場合、返された STS 一時認証情報は指定されたロールのすべての権限を持ちます。
// 一時認証情報の最終的な権限は、ステップ 4 で設定したロール権限とこのポリシーで設定した権限の共通部分になります。
// expiration パラメーターは、一時認証情報の有効期間(秒単位)を指定します。最小値:900。最大値:ロールの「最大セッション期間」パラメーターの値。この例では、有効期間を 3,600 秒に設定しています。
// sessionName パラメーターは、異なるトークンを区別するためにカスタムロールセッション名を指定します。例:sessiontest。
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() {
// サブステップ 1 で作成した RAM ユーザーの AccessKey ID および AccessKey Secret を環境変数から取得します。
accessKeyId := os.Getenv("ACCESS_KEY_ID")
accessKeySecret := os.Getenv("ACCESS_KEY_SECRET")
// サブステップ 3 で作成した RAM ロールの ARN を環境変数から取得します。
roleArn := os.Getenv("RAM_ROLE_ARN")
// ポリシークライアントを作成します。
config := &openapi.Config{
// 必須。サブステップ 1 で取得した AccessKey ID。
AccessKeyId: tea.String(accessKeyId),
// 必須。サブステップ 1 で取得した AccessKey Secret。
AccessKeySecret: tea.String(accessKeySecret),
}
// エンドポイントの詳細については、https://api.aliyun.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
}
// RAM ユーザーの AccessKey ID および AccessKey Secret を使用して、STS に一時認証情報をリクエストします。
request := &sts20150401.AssumeRoleRequest{
// STS 一時認証情報の有効期限を 3,600 秒に指定します。
DurationSeconds: tea.Int64(3600),
// サブステップ 3 で作成した RAM ロールの ARN を環境変数から取得します。
RoleArn: tea.String(roleArn),
// カスタムロールセッション名を指定します。この例では examplename を使用します。
RoleSessionName: tea.String("examplename"),
}
response, err := client.AssumeRoleWithOptions(request, &util.RuntimeOptions{})
if err != nil {
fmt.Printf("Failed to assume role: %v\n", err)
return
}
// STS から返された一時的な AccessKey ペア(AccessKey ID および AccessKey Secret)、セキュリティトークン、および有効期限を出力します。
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;
// サブステップ 1 で作成した RAM ユーザーの AccessKey ID および AccessKey Secret を環境変数から取得します。
$accessKeyId = getenv("ACCESS_KEY_ID");
$accessKeySecret = getenv("ACCESS_KEY_SECRET");
// サブステップ 3 で作成した RAM ロールの ARN を環境変数から取得します。
$roleArn = getenv("RAM_ROLE_ARN");
// Alibaba Cloud クライアントを初期化します。
AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret)
->regionId('cn-hangzhou')
->asDefaultClient();
try {
// STS リクエストを作成します。
$result = Sts::v20150401()
->assumeRole()
// ロール ARN を設定します。
->withRoleArn($roleArn)
// 異なるトークンを区別するためにカスタムロールセッション名を指定します。
->withRoleSessionName('sessiontest')
// STS 一時認証情報の有効期限を 3,600 秒に指定します。
->withDurationSeconds(3600)
->request();
// 応答から認証情報を取り出します。
$credentials = $result['Credentials'];
// STS から返された一時的な AccessKey ペア(AccessKey ID および AccessKey Secret)、セキュリティトークン、および有効期限を出力します。
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'
# パブリックフォルダーのパスを現在のフォルダー内の templates サブフォルダーに設定します。
set :public_folder, File.dirname(__FILE__) + '/templates'
def get_sts_token_for_oss_upload()
client = RPCClient.new(
# サブステップ 1 で作成した RAM ユーザーの AccessKey ID および AccessKey Secret を環境変数から取得します。
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: {
# サブステップ 3 で作成した RAM ロールの ARN を環境変数から取得します。
"RoleArn": ENV['RAM_ROLE_ARN'],
# STS 一時認証情報の有効期限を 3,600 秒に指定します。
"DurationSeconds": 3600,
# sessionName パラメーターは、異なるトークンを区別するためにカスタムロールセッション名を指定します。例:sessiontest。
"RoleSessionName": "sessiontest"
},
opts: {
method: 'POST',
format_params: true
}
)
end
if ARGV.length == 1
$server_port = ARGV[0]
elsif ARGV.length == 2
$server_ip = ARGV[0]
$server_port = ARGV[1]
end
$server_ip = "127.0.0.1" # 0.0.0.0 などの他のアドレスでリッスンするには、サーバーに認証メカニズムを追加する必要があります。
$server_port = 8000
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')
endSTS 一時認証情報は以下のとおりです:
説明Alibaba Cloud アカウントおよびその下の RAM ユーザーと RAM ロールは、STS サービスを呼び出して 1 秒あたり最大 100 回まで一時認証情報を取得できます。高同時実行のシナリオでは、一時認証情報をその有効期間内に再利用することを推奨します。
STS 一時認証情報の有効期限は協定世界時 (UTC) で表されます。UTC は中国標準時 (CST) より 8 時間遅れています。たとえば、一時認証情報の有効期限が 2024-04-18T11:33:40Z の場合、その認証情報は 2024 年 4 月 18 日 19:33:40(UTC + 08:00)に有効期限切れとなります。
{ "AccessKeyId": "STS.****************", "AccessKeySecret": "3dZn*******************************************", "SecurityToken": "CAIS*****************************************************************************************************************************************", "Expiration": "2024-**-*****:**:50Z" }
より詳細な粒度で一時アクセス権限を設定するには、以下の内容をご参照ください。
ロールから継承される権限をさらに制限するには、一時認証情報をリクエストする際に追加のポリシーを指定できます。たとえば、ロールに examplebucket へのファイルアップロード権限が付与されている場合、一時認証情報を使用してこのバケット内の特定のディレクトリにのみファイルをアップロードできるように制限できます。
// 以下のポリシーは、一時認証情報を使用して examplebucket の src ディレクトリにのみファイルをアップロードできるように制限します。 // 一時認証情報の最終的な権限は、ステップ 4 で設定したロール権限とこのポリシーで設定した権限の共通部分となるため、examplebucket の src ディレクトリにのみファイルをアップロードできます。 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 コンソールへのアクセスに必須です。コンソールは HTTPS を強制します。
以下の例は、一時認証情報を使用して OSS にファイルをアップロードする方法を示しています。SDK のインストールおよび一時認証情報を使ったファイルのアップロードやダウンロードなど各種操作のコード例については、「SDK リファレンス」をご参照ください。
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 で取得した一時的な AccessKey ID、AccessKey Secret、およびセキュリティトークンを指定します。RAM ユーザーの認証情報は使用しないでください。
// STS サービスから取得した AccessKey ID は "STS" で始まることに注意してください。
String accessKeyId = "yourSTSAccessKeyID";
String accessKeySecret = "yourSTSAccessKeySecret";
// STS から取得したセキュリティトークンを指定します。
String stsToken= "yourSecurityToken";
// DefaultCredentialProvider メソッドを使用して、直接 AccessKey ID および AccessKey Secret を設定します。
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret, stsToken);
// credentialsProvider を使用してクライアントを初期化します。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
// V4 署名アルゴリズムを使用することを明示的に宣言します。
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
// OSSClient インスタンスを作成します。
// OSSClient インスタンスの使用が終了したら、shutdown メソッドを呼び出してリソースを解放してください。
OSS ossClient = OSSClientBuilder.create()
// OSS アクセスドメイン名を設定します。中国 (杭州) リージョンの例:https://oss-cn-hangzhou.aliyuncs.com
.endpoint("endpoint")
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
// 宛先バケットのリージョンを設定します。中国 (杭州) リージョンの例:cn-hangzhou
.region("region")
.build();
try {
// PutObjectRequest オブジェクトを作成して、ローカルファイル exampletest.txt を examplebucket にアップロードします。
PutObjectRequest putObjectRequest = new PutObjectRequest("examplebucket", "exampletest.txt", new File("D:\\localpath\\exampletest.txt"));
// アップロード中にストレージクラスおよびアクセス権限を設定する必要がある場合は、以下のサンプルコードをご参照ください。
// ObjectMetadata metadata = new ObjectMetadata();
// metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
// metadata.setObjectAcl(CannedAccessControlList.Private);
// putObjectRequest.setMetadata(metadata);
// ファイルをアップロードします。
PutObjectResult result = ossClient.putObject(putObjectRequest);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
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("Caught a ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
Python
OSS SDK for Python には V2 と V1 があります。V2 は V1 を包括的にリファクタリングしたもので、本人確認、リクエストの再試行、エラー処理などの基盤操作を簡素化しています。また、より柔軟なパラメーター設定と新しい高度なインターフェイスも提供しています。要件に応じて以下の例をご参照ください。
V2 の例
import alibabacloud_oss_v2 as oss
def main():
# ステップ 1 のサブステップ 5 で取得した一時的な AccessKey ID、AccessKey Secret、およびセキュリティトークンを指定します。RAM ユーザーの認証情報は使用しないでください。
# STS サービスから取得した AccessKey ID は "STS" で始まることに注意してください。
sts_access_key_id = 'yourSTSAccessKeyID'
sts_access_key_secret = 'yourSTSAccessKeySecret'
# STS から取得したセキュリティトークンを指定します。
sts_security_token = 'yourSecurityToken'
# 静的認証情報プロバイダーを作成し、一時的な AccessKey ID、AccessKey Secret、およびセキュリティトークンを明示的に設定します。
credentials_provider = oss.credentials.StaticCredentialsProvider(
access_key_id=sts_access_key_id,
access_key_secret=sts_access_key_secret,
security_token=sts_security_token,
)
# SDK のデフォルト構成をロードし、認証情報プロバイダーを設定します。
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
# バケットのリージョンを指定します。中国 (杭州) の例:cn-hangzhou。
cfg.region = 'cn-hangzhou'
# 構成情報を使用して OSS クライアントを作成します。
client = oss.Client(cfg)
# アップロードするローカルファイルのパス。例:D:\\localpath\\exampletest.txt。
local_file_path = 'D:\\localpath\\exampletest.txt'
with open(local_file_path, 'rb') as file:
data = file.read()
# オブジェクトアップロードリクエストを実行して、ローカルファイル exampletest.txt を examplebucket にアップロードします。バケット名、オブジェクト名、およびアップロードするファイルを指定します。
result = client.put_object(oss.PutObjectRequest(
# バケット名
bucket='examplebucket',
# バケットにアップロードするオブジェクトの名前
key='exampletest.txt',
body=data,
))
# リクエスト状態コード、リクエスト ID、コンテンツ MD5、ETag、CRC-64 チェックサム、およびバージョン ID を出力して、リクエストが成功したかどうかを確認します。
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},'
)
# このスクリプトを直接実行する場合、main 関数を呼び出します。
if __name__ == "__main__":
main() # スクリプトのエントリーポイント。ファイルを直接実行すると、main 関数が呼び出されます。V1 の例
# -*- coding: utf-8 -*-
import oss2
# yourEndpoint はバケットのリージョンのエンドポイントを指定します。中国 (杭州) の例:https://oss-cn-hangzhou.aliyuncs.com。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
# ステップ 1 のサブステップ 5 で取得した一時的な AccessKey ID および AccessKey Secret を指定します。Alibaba Cloud アカウントの AccessKey ID および AccessKey Secret は使用しないでください。
sts_access_key_id = 'yourAccessKeyId'
sts_access_key_secret = 'yourAccessKeySecret'
# バケット名を指定します。
bucket_name = 'examplebucket'
# オブジェクトの完全なパスを指定します。オブジェクトの完全なパスにはバケット名を含めないでください。
object_name = 'examplebt.txt'
# ステップ 1 のサブステップ 5 で取得したセキュリティトークンを指定します。
security_token = 'yourSecurityToken'
# 一時認証情報の認証情報を使用して、StsAuth インスタンスを初期化します。
auth = oss2.StsAuth(sts_access_key_id,
sts_access_key_secret,
security_token)
# StsAuth インスタンスを使用してバケットを初期化します。
bucket = oss2.Bucket(auth, endpoint, bucket_name)
# オブジェクトをアップロードします。
result = bucket.put_object(object_name, "hello world")
print(result.status)Go
OSS SDK for Go には V2 と V1 があります。V2 は V1 を包括的にリファクタリングしたもので、本人確認、リクエストの再試行、エラー処理などの基盤操作を簡素化しています。また、より柔軟なパラメーター設定と新しい高度なインターフェイスも提供しています。要件に応じて以下の例をご参照ください。
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 で取得した一時的な AccessKey ID、AccessKey Secret、およびセキュリティトークンを指定します。RAM ユーザーの認証情報は使用しないでください。
// STS サービスから取得した AccessKey ID は "STS" で始まることに注意してください。
accessKeyID := "yourSTSAccessKeyID"
accessKeySecret := "yourSTSAccessKeySecret"
// STS から取得したセキュリティトークンを指定します。
stsToken := "yourSecurityToken"
// NewStaticCredentialsProvider メソッドを使用して、直接 AccessKey ID、AccessKey Secret、および STS トークンを設定します。
provider := credentials.NewStaticCredentialsProvider(accessKeyID, accessKeySecret, stsToken)
// デフォルト構成をロードし、認証情報プロバイダーおよびリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(provider).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// アップロードするローカルファイルのパスおよび名前を指定します。例:D:\\localpath\\exampletest.txt。
localFile := "D:\\localpath\\exampletest.txt"
// オブジェクトをアップロードするリクエストを作成します。
putRequest := &oss.PutObjectRequest{
Bucket: oss.Ptr("examplebucket"), // バケット名
Key: oss.Ptr("exampletest.txt"), // バケットにアップロードするオブジェクトの名前
StorageClass: oss.StorageClassStandard, // オブジェクトのストレージクラスを標準に設定します。
Acl: oss.ObjectACLPrivate, // オブジェクトのアクセス制御リスト (ACL) を非公開に設定します。
Metadata: map[string]string{
"yourMetadataKey1": "yourMetadataValue1", // オブジェクトのメタデータを設定します。
},
}
// オブジェクトアップロードリクエストを実行して、ローカルファイル exampletest.txt を examplebucket にアップロードします。
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() {
// ステップ 1 のサブステップ 5 で取得した一時認証情報を環境変数から取得します。このサンプルコードを実行する前に、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)
}
// OSSClient インスタンスを作成します。
// yourEndpoint はバケットのエンドポイントを指定します。中国 (杭州) の例:https://oss-cn-hangzhou.aliyuncs.com。リージョンに応じてエンドポイントを指定してください。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// バケット名を指定します。例:examplebucket。
bucketName := "examplebucket"
// オブジェクトの完全なパスを指定します。完全なパスにはバケット名を含めないでください。例:exampledir/exampleobject.txt。
objectName := "exampledir/exampleobject.txt"
// ローカルファイルの完全なパスを指定します。例:D:\\localpath\\examplefile.txt。
filepath := "D:\\localpath\\examplefile.txt"
bucket, err := client.Bucket(bucketName)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// STS を使用して第三者にファイルのアップロードを許可します。
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");
// 一時認証情報を使用して、クライアント側で OSS クライアントを初期化し、OSS リソースに一時的にアクセスできるようにします。
const getToken = async () => {
// クライアントがアクセス認証情報をリクエストするアドレスを設定します。
await axios.get("http://localhost:8000/sts").then((token) => {
const client = new OSS({
// yourRegion はバケットのリージョンを指定します。中国 (杭州) の例:oss-cn-hangzhou。
region: 'oss-cn-hangzhou',
// ステップ 1 のサブステップ 5 で取得した一時的な AccessKey ID および AccessKey Secret を指定します。Alibaba Cloud アカウントの AccessKey ID および AccessKey Secret は使用しないでください。
accessKeyId: token.data.AccessKeyId,
accessKeySecret: token.data.AccessKeySecret,
// ステップ 1 のサブステップ 5 で取得したセキュリティトークンを指定します。
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,
};
},
});
// 一時認証情報を使用してファイルをアップロードします。
// バケット名を除くオブジェクトの完全なパスを指定します。例:exampleobject.jpg。
// ローカルファイルの完全なパスを指定します。例:D:\\example.jpg。
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 で取得した一時的な AccessKey ID、AccessKey Secret、およびセキュリティトークンを指定します。RAM ユーザーの認証情報は使用しないでください。
// STS サービスから取得した AccessKey ID は "STS" で始まることに注意してください。
$accessKeyId = 'yourSTSAccessKeyID';
$accessKeySecret = 'yourSTSAccessKeySecret';
// STS から取得したセキュリティトークンを指定します。
$securityToken = 'yourSecurityToken';
// StaticCredentialsProvider クラスを使用して認証情報プロバイダーを作成します。
$provider = new StaticCredentialsProvider($accessKeyId, $accessKeySecret, $securityToken);
// バケットのリージョンのエンドポイントを指定します。中国 (杭州) の例:https://oss-cn-hangzhou.aliyuncs.com。
$endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// バケット名を指定します。例:examplebucket。
$bucket= "examplebucket";
// バケットにアップロードするオブジェクトの名前を指定します。
$object = "exampletest.txt";
// アップロードするローカルファイルのパスを指定します。例:D:\\localpath\\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"
);
// 構成情報を使用して OSS クライアントを作成します。
$ossClient = new OssClient($config);
// ローカルファイル exampletest.txt を examplebucket にアップロードするリクエストを送信します。
$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(
# この例では中国 (杭州) リージョンのエンドポイントを使用しています。ご使用のリージョンに基づいてエンドポイントを指定してください。
endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
# ステップ 1 のサブステップ 5 で取得した一時的な AccessKey ID および AccessKey Secret を指定します。Alibaba Cloud アカウントの AccessKey ID および AccessKey Secret を使用しないでください。
access_key_id: 'token.access_key_id',
access_key_secret: 'token.access_key_secret',
# ステップ 1 のサブステップ 5 で取得したセキュリティトークンを指定します。
sts_token: 'token.security_token'
)
# バケット名を指定します。例: examplebucket。
bucket = client.get_bucket('examplebucket')
# ファイルをアップロードします。
bucket.put_object('exampleobject.txt', :file => 'D:\test.txt')よくある質問
権限付与エラー
無効な DurationSeconds 値
無効なセキュリティトークン
存在しない AccessKeyId
匿名アクセスが禁止されています
NoSuchBucket エラー
バケット ACL エラー
権限付与者ポリシーエラー
エンドポイントが正しくありません
複数の認証情報の取得
タイムスタンプ形式が正しくありません
エラーコード 0003-0000301 の対処方法
参照
サーバーが発行した STS 認証情報を使用してクライアント側でアップロードする際に、ファイルサイズ、ファイルタイプ、またはアップロードパスを制限する方法については、「概要」をご参照ください。
STS 一時認証情報を使用して OSS へのファイルアップロードを許可した後、署名付き URL を使用してサードパーティとファイルを共有し、プレビューまたはダウンロードさせることができます。詳細については、「署名付き URL を使用したファイルのダウンロードまたはプレビュー」をご参照ください。

