您可以通過STS服務為其他使用者頒發一個臨時訪問憑證,該使用者可使用臨時訪問憑證在有效時間內訪問Tablestore資源。臨時訪問憑證無需透露您的長期密鑰,且超過有效期間後,該憑證自動失效,使您的Tablestore資源訪問更加靈活和安全。
背景資訊
RAM角色是一種虛擬使用者,可以被授予訪問特定資源的許可權。與RAM使用者不同,RAM角色沒有永久身份憑證(登入密碼或存取金鑰),需要被一個可信實體(如RAM使用者)扮演。扮演成功後,可信實體將獲得RAM角色的臨時身份憑證,即安全性權杖(STS Token),使用該安全性權杖就能以RAM角色身份訪問Tablestore。更多資訊,請參見RAM角色概覽。
可信實體為阿里雲帳號的RAM角色主要用於解決跨帳號訪問和臨時授權問題。本文以同帳號的RAM使用者扮演RAM角色為例向您介紹如何使用STS臨時訪問憑證發起請求訪問Tablestore資源。
操作步驟
使用STS臨時訪問憑證訪問Tablestore,首先您需要建立一個RAM角色用於被扮演,該角色需要被授予訪問Tablestore的許可權。其次您需要建立一個RAM使用者用來扮演RAM角色,擷取STS臨時訪問憑證。最後您需要使用擷取到的STS臨時訪問憑證發起請求,訪問Tablestore資源。
步驟一:建立RAM角色
使用阿里雲帳號(主帳號)或Resource Access Management員登入RAM控制台。
在左側導覽列,選擇
。單擊建立角色,選擇可信實體類型為阿里雲帳號,單擊下一步。
在建立角色對話方塊,填寫角色名稱為
RamTablestore
,設定選擇信任的雲帳號為當前雲帳號。單擊完成。角色建立完成後,單擊關閉。
使用STS服務擷取臨時訪問憑證時需要指定RAM角色的ARN,您可以在角色列表中單擊角色名稱進入角色詳情頁,在基本資料地區內找到ARN並複製。
步驟二:為RAM角色授予訪問Tablestore許可權
使用預設策略
以 AliyunOTSFullAccess
為例授予RAM角色訪問Tablestore的許可權。
AliyunOTSFullAccess
擁有Tablestore的完整存取,您也可以選擇以下方式進行授權。
如果需要唯讀許可權,請授予RAM角色
AliyunOTSReadOnlyAccess
許可權。如果需要唯寫許可權,請授予RAM角色
AliyunOTSWriteOnlyAccess
許可權。
在左側導覽列,選擇
。在角色頁面,找到目標RAM角色。
單擊RAM角色右側的新增授權或單擊角色名稱進入角色詳情頁,在許可權管理地區單擊新增授權。
在新增授權面板的權限原則地區,搜尋
AliyunOTSFullAccess
並選中。單擊確認新增授權。
使用自訂策略
建立自訂權限原則。
在左側導覽列,選擇
。在權限原則頁面,單擊建立權限原則。
在建立權限原則頁面,單擊指令碼編輯,並在輸入框中編寫指令碼,單擊確定。
以下樣本指令碼授予訪問單個執行個體的許可權,您可以根據需要自訂策略指令碼,例如表和API層級的許可權控制或基於情境(IP、訪問時間限制等)的許可權控制。關於RAM Policy的更多資訊,請參見自訂RAM Policy。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ots:*", "Resource": "acs:ots:*:*:instance/your_instance_name*" } ] }
在建立權限原則對話方塊,填寫策略名稱稱,例如
TestRAMPolicy
,單擊確定。
為RAM角色授予自訂權限原則。
在左側導覽列,選擇
。在角色頁面,找到目標RAM角色。
單擊RAM角色右側的新增授權或單擊角色名稱進入角色詳情頁,在許可權管理地區單擊新增授權。
在新增授權面板的權限原則地區,搜尋並選中已建立的自訂權限原則。
單擊確認新增授權。
您可以在角色列表單擊角色名稱進入角色詳情頁,在許可權管理頁簽下查看被授權的權限原則。
步驟三:建立RAM使用者
建立一個RAM使用者用於扮演RAM角色。
使用阿里雲帳號(主帳號)或Resource Access Management員登入RAM控制台。
在左側導覽列,選擇
。在使用者頁面,單擊建立使用者。
在建立使用者頁面的使用者帳號資訊地區,設定使用者基本資料。
登入名稱稱:可包含英文字母、數字、半形句號(.)、短劃線(-)和底線(_),最多64個字元。
顯示名稱:最多包含128個字元或漢字。
標籤:單擊
,輸入標籤鍵和標籤值。為RAM使用者綁定標籤,便於後續基於標籤系統管理使用者。
說明通過單擊添加使用者,您可以大量建立多個RAM使用者。
在訪問方式地區,選中使用永久AccessKey訪問,單擊確定。
說明如果需要使用RAM使用者登入和訪問阿里雲控制台,請選中控制台訪問。
單擊操作列的複製,儲存RAM使用者資訊。您也可以單獨複製AccessKey ID和AccessKey Secret。
重要RAM使用者的AccessKey Secret只在建立時顯示,頁面關閉後將無法查看,請及時儲存並妥善保管。
步驟四:為RAM使用者授予請求AssumeRole的許可權
扮演RAM角色需要授予RAM使用者請求AssumeRole的許可權。
在左側導覽列,選擇
。在使用者頁面,找到目標RAM使用者。
單擊RAM使用者右側的新增授權或單擊使用者名稱稱進入使用者詳情頁,在許可權管理頁簽單擊新增授權。
在新增授權面板的權限原則地區,搜尋
AliyunSTSAssumeRoleAccess
並選中。單擊確認新增授權。
步驟五:使用RAM使用者扮演RAM角色擷取臨時訪問憑證
在訪問資源之前,您需要使用RAM使用者扮演RAM角色擷取臨時訪問憑證,臨時訪問憑證只能在憑證有效期間內使用。
如果您想在OpenAPI門戶直接調用AssumeRole介面擷取臨時訪問憑證,請參見調用AssumeRole介面。
準備工作
您需要在Maven專案中引用以下依賴。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>sts20150401</artifactId>
<version>1.1.6</version>
</dependency>
範例程式碼
以下範例程式碼使用RAM使用者扮演RAM角色擷取STS臨時訪問憑證並列印到控制台,憑證有效期間是1個小時。
運行代碼前請將RAM使用者的AccessKey以及RAM角色的ARN配置到系統內容變數,配置方法請參見配置環境變數。
STS服務存取點(Endpoint)列表請參見服務存取點。
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.tea.*;
public class AssumeRoleSample {
public static com.aliyun.sts20150401.Client createClient() throws Exception {
// 工程代碼泄露可能會導致 AccessKey 泄露,並威脅帳號下所有資源的安全性。以下程式碼範例僅供參考。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
// 必填,請確保代碼運行環境設定了環境變數 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Endpoint,STS 服務存取點
config.endpoint = "sts.cn-hangzhou.aliyuncs.com";
return new com.aliyun.sts20150401.Client(config);
}
public static void main(String[] args) throws Exception {
com.aliyun.sts20150401.Client client = AssumeRoleSample.createClient();
com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest()
// 臨時訪問憑證的有效時間,單位為秒。最小值為900,最大值以當前角色設定的最大會話時間為準。當前角色最大會話時間取值範圍為3600秒~43200秒,預設值為3600秒。
.setDurationSeconds(3600L)
// 必填,請確保代碼運行環境設定了環境變數 TABLESTORE_STS_ROLE_ARN,即 RAM 角色的 ARN。
.setRoleArn(System.getenv("TABLESTORE_STS_ROLE_ARN"))
// 必填,自訂角色會話名稱,用來區分不同的令牌。
.setRoleSessionName("RAMTablestore");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 擷取 STS 臨時訪問憑證並列印,請妥善保管臨時訪問憑證。
AssumeRoleResponse response = client.assumeRoleWithOptions(assumeRoleRequest, runtime);
System.out.println("Expiration: " + response.getBody().getCredentials().getExpiration());
System.out.println("Access Key Id: " + response.getBody().getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + response.getBody().getCredentials().getAccessKeySecret());
System.out.println("Security Token: " + response.getBody().getCredentials().getSecurityToken());
} catch (TeaException error) {
// 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此處僅做列印展示,請謹慎對待異常處理,在工程專案中切勿直接忽略異常。
// 錯誤 message
System.out.println(error.getMessage());
// 診斷地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
}
}
如果您想瞭解更多語言的STS SDK及程式碼範例,請參見STS SDK概覽。
步驟六:使用臨時訪問憑證訪問Tablestore
準備工作
在Table Store控制台建立執行個體和資料表。
擷取執行個體名稱、執行個體訪問地址、地區ID。地區列表請參見地區。
在Maven專案中添加以下依賴。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>tablestore</artifactId> <version>5.17.2</version> </dependency>
寬表模型
使用寬表模型時,您需要使用STS臨時訪問憑證初始化Tablestore Client並發起請求。
運行代碼前請替換代碼內的執行個體資訊,並將STS臨時訪問憑證配置到系統內容變數,配置方法請參見配置環境變數。
V4簽名(推薦)
以下Java範例程式碼使用V4簽名初始化Tablestore Client,並擷取執行個體下的所有資料表名稱。
import com.alicloud.openservices.tablestore.ClientConfiguration;
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.*;
import com.alicloud.openservices.tablestore.model.AlwaysRetryStrategy;
import com.alicloud.openservices.tablestore.model.ListTableResponse;
public class InitClientV4 {
public static void main(String[] args) {
// yourRegion 填寫您的執行個體所在地區,如 cn-hangzhou
final String region = "yourRegion";
// yourInstanceName 填寫您的執行個體名稱
final String instanceName = "yourInstanceName";
// yourEndpoint 填寫您的執行個體訪問地址
final String endpoint = "yourEndpoint";
// 擷取系統變數裡的 STS AccessKey ID、STS AccessKey Secret 和 STS Token
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
final String secretAccessKey = System.getenv("TABLESTORE_SESSION_TOKEN");
// 構造 V4 簽名
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret, secretAccessKey);
V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
// 初始化 Tablestore Client
SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
/*
// 您可以通過指定 ClientConfiguration 修改預設配置項,以下樣本為部分自訂配置項。
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setConnectionTimeoutInMillisecond(5000); // 設定建立串連的逾時時間,單位為毫秒。
clientConfiguration.setSocketTimeoutInMillisecond(5000); // 設定 socket 逾時時間,單位為毫秒。
clientConfiguration.setRetryStrategy(new AlwaysRetryStrategy()); // 設定重試策略,如果不設定,則採用預設的重試策略。
SyncClient client = new SyncClient(endpoint, provider, instanceName, clientConfiguration, new ResourceManager(null, null));
*/
// 列出執行個體下的資料表列表並列印到控制台
ListTableResponse listTableResponse = client.listTable();
listTableResponse.getTableNames().forEach(System.out::println);
// 關閉 Tablestore Client
client.shutdown();
}
}
V2簽名
以下Java範例程式碼使用V2簽名初始化Tablestore Client,並擷取執行個體下的所有資料表名稱。
import com.alicloud.openservices.tablestore.ClientConfiguration;
import com.alicloud.openservices.tablestore.SyncClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.model.AlwaysRetryStrategy;
import com.alicloud.openservices.tablestore.model.ListTableResponse;
public class InitClientV2 {
public static void main(String[] args) {
// yourInstanceName 填寫您的執行個體名稱
final String instanceName = "yourInstanceName";
// yourEndpoint 填寫您的執行個體訪問地址
final String endpoint = "yourEndpoint";
// 擷取系統變數裡的 STS AccessKey ID、STS AccessKey Secret 和 STS Token
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
final String secretAccessKey = System.getenv("TABLESTORE_SESSION_TOKEN");
// 構造 V2 簽名
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret, secretAccessKey);
CredentialsProvider provider = new DefaultCredentialProvider(credentials);
// 初始化 Tablestore Client
SyncClient client = new SyncClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
/*
// 您可以通過指定 ClientConfiguration 修改預設配置項,以下樣本為部分自訂配置項。
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setConnectionTimeoutInMillisecond(5000); // 設定建立串連的逾時時間,單位為毫秒。
clientConfiguration.setSocketTimeoutInMillisecond(5000); // 設定 socket 逾時時間,單位為毫秒。
clientConfiguration.setRetryStrategy(new AlwaysRetryStrategy()); // 設定重試策略,如果不設定,則採用預設的重試策略。
SyncClient client = new SyncClient(endpoint, provider, instanceName, clientConfiguration, new ResourceManager(null, null));
*/
// 列出執行個體下的資料表列表並列印到控制台
ListTableResponse listTableResponse = client.listTable();
listTableResponse.getTableNames().forEach(System.out::println);
// 關閉 Tablestore Client
client.shutdown();
}
}
時序模型
使用時序模型時,您需要使用STS臨時訪問憑證初始化Timeseries Client並發起請求。
運行代碼前請替換代碼內的執行個體資訊,並將STS臨時訪問憑證配置到系統內容變數,配置方法請參見配置環境變數。
V4簽名(推薦)
以下Java範例程式碼使用V4簽名初始化Timeseries Client,並擷取執行個體下的所有時序表名稱。
import com.alicloud.openservices.tablestore.ClientConfiguration;
import com.alicloud.openservices.tablestore.TimeseriesClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.core.auth.V4Credentials;
import com.alicloud.openservices.tablestore.model.AlwaysRetryStrategy;
import com.alicloud.openservices.tablestore.model.timeseries.ListTimeseriesTableResponse;
public class InitTimeseriesClientV4 {
public static void main(String[] args) {
// yourRegion 填寫您的執行個體所在地區,如 cn-hangzhou
final String region = "yourRegion";
// yourInstanceName 填寫您的執行個體名稱
final String instanceName = "yourInstanceName";
// yourEndpoint 填寫您的執行個體訪問地址
final String endpoint = "yourEndpoint";
// 擷取系統變數裡的 STS AccessKey ID、STS AccessKey Secret 和 STS Token
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
final String secretAccessKey = System.getenv("TABLESTORE_SESSION_TOKEN");
// 構造 V4 簽名
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret, secretAccessKey);
V4Credentials credentialsV4 = V4Credentials.createByServiceCredentials(credentials, region);
CredentialsProvider provider = new DefaultCredentialProvider(credentialsV4);
// 初始化 Tablestore TimeSeries Client
TimeseriesClient client = new TimeseriesClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
/*
// 您可以通過指定 ClientConfiguration 修改預設配置項,以下樣本為部分自訂配置項。
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setConnectionTimeoutInMillisecond(5000); // 設定建立串連的逾時時間,單位為毫秒。
clientConfiguration.setSocketTimeoutInMillisecond(5000); // 設定 socket 逾時時間,單位為毫秒。
clientConfiguration.setRetryStrategy(new AlwaysRetryStrategy()); // 設定重試策略,如果不設定,則採用預設的重試策略。
TimeseriesClient client = new TimeseriesClient(endpoint, provider, instanceName, clientConfiguration, new ResourceManager(null, null));
*/
// 列出執行個體下的時序表列表並列印到控制台
ListTimeseriesTableResponse listTimeseriesTableResponse = client.listTimeseriesTable();
listTimeseriesTableResponse.getTimeseriesTableNames().forEach(System.out::println);
// 關閉 Tablestore Client
client.shutdown();
}
}
V2簽名
以下Java範例程式碼使用V2簽名初始化Timeseries Client,並擷取執行個體下的所有時序表名稱。
import com.alicloud.openservices.tablestore.ClientConfiguration;
import com.alicloud.openservices.tablestore.TimeseriesClient;
import com.alicloud.openservices.tablestore.core.ResourceManager;
import com.alicloud.openservices.tablestore.core.auth.CredentialsProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentialProvider;
import com.alicloud.openservices.tablestore.core.auth.DefaultCredentials;
import com.alicloud.openservices.tablestore.model.AlwaysRetryStrategy;
import com.alicloud.openservices.tablestore.model.timeseries.ListTimeseriesTableResponse;
public class InitTimeseriesClientV2 {
public static void main(String[] args) {
// yourInstanceName 填寫您的執行個體名稱
final String instanceName = "yourInstanceName";
// yourEndpoint 填寫您的執行個體訪問地址
final String endpoint = "yourEndpoint";
// 擷取系統變數裡的 STS AccessKey ID、STS AccessKey Secret 和 STS Token
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
final String secretAccessKey = System.getenv("TABLESTORE_SESSION_TOKEN");
// 構造 V2 簽名
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret, secretAccessKey);
CredentialsProvider provider = new DefaultCredentialProvider(credentials);
// 初始化 Tablestore TimeSeries Client
TimeseriesClient client = new TimeseriesClient(endpoint, provider, instanceName, null, new ResourceManager(null, null));
/*
// 您可以通過指定 ClientConfiguration 修改預設配置項,以下樣本為部分自訂配置項。
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setConnectionTimeoutInMillisecond(5000); // 設定建立串連的逾時時間,單位為毫秒。
clientConfiguration.setSocketTimeoutInMillisecond(5000); // 設定 socket 逾時時間,單位為毫秒。
clientConfiguration.setRetryStrategy(new AlwaysRetryStrategy()); // 設定重試策略,如果不設定,則採用預設的重試策略。
TimeseriesClient client = new TimeseriesClient(endpoint, provider, instanceName, clientConfiguration, new ResourceManager(null, null));
*/
// 列出執行個體下的時序表列表並列印到控制台
ListTimeseriesTableResponse listTimeseriesTableResponse = client.listTimeseriesTable();
listTimeseriesTableResponse.getTimeseriesTableNames().forEach(System.out::println);
// 關閉 Tablestore Client
client.shutdown();
}
}
配置環境變數
直接在代碼中儲存訪問憑證容易導致資訊泄露,請按以下操作將訪問憑證儲存在系統內容變數中。
Windows
# 配置 RAM 使用者的 AccessKey ID
setx ALIBABA_CLOUD_ACCESS_KEY_ID your_access_key_id /m
# 配置 RAM 使用者的 AccessKey Secret
setx ALIBABA_CLOUD_ACCESS_KEY_SECRET your_access_key_secret /m
# 配置 RAM 角色的 ARN
setx TABLESTORE_STS_ROLE_ARN your_ram_role_arn /m
# 配置臨時訪問憑證 STS AccessKey ID
setx TABLESTORE_ACCESS_KEY_ID your_sts_access_key_id /m
# 配置臨時訪問憑證 STS AccessKey Secret
setx TABLESTORE_ACCESS_KEY_SECRET your_sts_access_key_secret /m
# 配置臨時訪問憑證 STS Token
setx TABLESTORE_SESSION_TOKEN your_sts_token /m
macOS/Linux/Unix
# 配置 RAM 使用者的 AccessKey ID
export ALIBABA_CLOUD_ACCESS_KEY_ID=your_access_key_id
# 配置 RAM 使用者的 AccessKey Secret
export ALIBABA_CLOUD_ACCESS_KEY_SECRET=your_access_key_secret
# 配置 RAM 角色的 ARN
export TABLESTORE_STS_ROLE_ARN=your_ram_role_arn
# 配置臨時訪問憑證 STS AccessKey ID
export TABLESTORE_ACCESS_KEY_ID=your_sts_access_key_id
# 配置臨時訪問憑證 STS AccessKey Secret
export TABLESTORE_ACCESS_KEY_SECRET=your_sts_access_key_secret
# 配置臨時訪問憑證 STS Token
export TABLESTORE_SESSION_TOKEN=your_sts_token