存取控制RAM可以協助您系統管理使用者身份和資源存取權限,使用RAM使用者訪問Tablestore資源比直接使用阿里雲帳號更加安全。本文介紹如何使用RAM使用者的存取金鑰發起請求訪問Tablestore資源。
背景資訊
RAM使用者即RAM帳號,是存取控制RAM(Resource Access Management)的一種實體身份類型。您可以為阿里雲帳號(主帳號)建立RAM使用者並為其授權,實現不同RAM使用者擁有不同資源存取權限的目的。更多資訊,請參見RAM使用者概覽。
操作步驟
使用RAM使用者存取金鑰訪問Tablestore,您需要建立一個RAM使用者並授予其訪問Tablestore的許可權,再用RAM使用者的存取金鑰發起請求,訪問Tablestore資源。
步驟一:建立RAM使用者
使用阿里雲帳號(主帳號)或Resource Access Management員登入RAM控制台。
在左側導覽列,選擇
。在使用者頁面,單擊建立使用者。
在建立使用者頁面的使用者帳號資訊地區,設定使用者基本資料。
登入名稱稱:可包含英文字母、數字、半形句號(.)、短劃線(-)和底線(_),最多64個字元。
顯示名稱:最多包含128個字元或漢字。
標籤:單擊
,輸入標籤鍵和標籤值。為RAM使用者綁定標籤,便於後續基於標籤系統管理使用者。
說明通過單擊添加使用者,您可以大量建立多個RAM使用者。
在訪問方式地區,選中使用永久AccessKey訪問,單擊確定。
說明如果需要使用RAM使用者登入和訪問阿里雲控制台,請選中控制台訪問。
單擊操作列的複製,儲存RAM使用者資訊。您也可以單獨複製AccessKey ID和AccessKey Secret。
重要RAM使用者的AccessKey Secret只在建立時顯示,頁面關閉後將無法查看,請及時儲存並妥善保管。
步驟二:為RAM使用者授予訪問Tablestore許可權
建立RAM使用者後,您需要為RAM使用者授予Tablestore的存取權限。
使用預設策略
以 AliyunOTSFullAccess
為例授予RAM使用者訪問Tablestore的許可權。
AliyunOTSFullAccess
擁有Tablestore的完整存取,您也可以選擇以下方式進行授權。
如果需要唯讀許可權,請授予RAM使用者
AliyunOTSReadOnlyAccess
許可權。如果需要唯寫許可權,請授予RAM使用者
AliyunOTSWriteOnlyAccess
許可權。
在左側導覽列,選擇
。在使用者頁面,找到目標RAM使用者。
單擊RAM使用者右側的添加許可權。
在新增授權面板的權限原則地區,搜尋
AliyunOTSFullAccess
並選中。單擊確認新增授權。
使用自訂策略
建立自訂權限原則。
在左側導覽列,選擇
。在權限原則頁面,單擊建立權限原則。
在建立權限原則頁面,單擊指令碼編輯,並在輸入框中編寫指令碼,單擊確定。
說明以下樣本指令碼授予RAM使用者訪問單個執行個體的許可權,您可以根據需要自訂策略指令碼,例如表和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使用者存取金鑰訪問Tablestore
準備工作
在Table Store控制台建立執行個體和資料表。
擷取執行個體名稱、執行個體訪問地址、地區ID。地區列表請參見地區。
根據不同的程式設計語言,安裝對應的Tablestore SDK。
Java
如果您使用的是Maven專案,請在專案的pom.xml檔案中添加如下依賴:
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>tablestore</artifactId> <version>5.17.4</version> </dependency>
更多資訊,請參見安裝Tablestore Java SDK。
Go
在專案目錄中執行
go mod init <DIRNAME>
命令產生go.mod檔案後,執行如下命令安裝TablestoreGo SDK。說明<DIRNAME>
為專案目錄路徑,請以實際路徑為準。go get github.com/aliyun/aliyun-tablestore-go-sdk/tablestore
更多資訊,請參見安裝Tablestore Go SDK。
Python
執行如下命令直接通過pip進行SDK安裝。
sudo pip install tablestore
更多資訊,請參見安裝Tablestore Python SDK。
Node.js
通過npm執行如下命令安裝Table StoreNode.js SDK。
npm install tablestore
更多資訊,請參見安裝Tablestore Node.js SDK。
.NET
具體操作,請參見安裝Tablestore .NET SDK。
PHP
具體操作,請參見安裝Tablestore PHP SDK。
寬表模型
使用寬表模型時,您需要使用RAM使用者的存取金鑰初始化Tablestore Client並發起請求。
運行代碼前請替換代碼內的執行個體資訊,並將RAM使用者的AccessKey配置到系統內容變數,配置方法請參見配置環境變數。
Java
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.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.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";
// 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
// 構造 V4 簽名
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
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";
// 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
// 構造 V2 簽名
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
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();
}
}
Go
以下Go範例程式碼用於初始化Tablestore Client,並擷取執行個體中的所有資料表名稱。
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-tablestore-go-sdk/tablestore"
)
func main() {
// yourInstanceName 填寫您的執行個體名稱
instanceName := "yourInstanceName"
// yourEndpoint 填寫您的執行個體訪問地址
endpoint := "yourEndpoint"
// 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
accessKeyId := os.Getenv("TABLESTORE_ACCESS_KEY_ID")
accessKeySecret := os.Getenv("TABLESTORE_ACCESS_KEY_SECRET")
// 初始化 Tablestore Client
client := tablestore.NewClient(endpoint, instanceName, accessKeyId, accessKeySecret)
// 列出執行個體中的資料表列表並列印到控制台
tables, err := client.ListTable()
if err != nil {
fmt.Println("Failed to list table")
} else {
for _, table := range (tables.TableNames) {
fmt.Println(table)
}
}
}
Python
以下Python範例程式碼用於初始化Tablestore Client,並擷取執行個體中的所有資料表名稱。
# -*- coding: utf-8 -*-
import os
from tablestore import OTSClient
# yourInstanceName 填寫您的執行個體名稱
instance_name = "yourInstanceName"
# yourEndpoint 填寫您的執行個體訪問地址
endpoint = "yourEndpoint"
# 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
access_key_id = os.getenv("TABLESTORE_ACCESS_KEY_ID")
access_key_secret = os.getenv("TABLESTORE_ACCESS_KEY_SECRET")
# 初始化 Tablestore Client
client = OTSClient(endpoint, access_key_id, access_key_secret, instance_name)
# 列出執行個體中的資料表列表並列印到控制台
resp = client.list_table()
for table_name in resp:
print(table_name)
Node.js
以下Node.js範例程式碼用於初始化Tablestore Client,並擷取執行個體中的所有資料表名稱。
// 此處為相對路徑,請根據實際情況進行調整。
var TableStore = require('../index.js');
// yourInstanceName 填寫您的執行個體名稱
var instancename = 'yourInstanceName';
// yourEndpoint 填寫您的執行個體訪問地址
var endpoint = 'yourEndpoint';
// 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
var accessKeyId = process.env.TABLESTORE_ACCESS_KEY_ID;
var secretAccessKey = process.env.TABLESTORE_ACCESS_KEY_SECRET;
// 初始化 Tablestore Client
var client = new TableStore.Client({
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
endpoint: endpoint,
instancename: instancename
});
// 列出執行個體中的資料表列表並列印到控制台
client.listTable({}, function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', data);
});
.NET
以下 .NET 範例程式碼用於初始化Tablestore Client,並擷取執行個體中的所有資料表名稱。
using Aliyun.OTS.Request;
using Aliyun.OTS.Response;
using System;
namespace Aliyun.OTS.Samples
{
public class Sample
{
public static void Main()
{
// yourEndpoint 填寫您的執行個體訪問地址
string endpoint = "yourEndpoint";
// yourInstanceName 填寫您的執行個體名稱
string instanceName = "yourInstanceName";
// 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
string accessKeyId = Environment.GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_ID");
string accessKeySecret = Environment.GetEnvironmentVariable("TABLESTORE_ACCESS_KEY_SECRET");
OTSClientConfig config = new OTSClientConfig(endpoint, accessKeyId, accessKeySecret, instanceName)
{
OTSDebugLogHandler = null,
OTSErrorLogHandler = null
};
try
{
// 初始化Tablestore Client
OTSClient otsClient = new OTSClient(config);
// 列出執行個體中的資料表列表並列印
ListTableResponse response = otsClient.ListTable(new ListTableRequest());
foreach (var tableName in response.TableNames)
{
Console.WriteLine(tableName);
}
}
catch (Exception ex)
{
Console.WriteLine("List table failed, exception:{0}", ex.Message);
}
}
}
}
PHP
以下PHP範例程式碼用於初始化Tablestore Client,並擷取執行個體中的所有資料表名稱。
<?php
// 此處為相對路徑,請根據實際情況進行調整。
require (__DIR__ . '/../../vendor/autoload.php');
use Aliyun\OTS\OTSClient as OTSClient;
// yourInstanceName 填寫您的執行個體名稱
$instanceName = "yourInstanceName";
// yourEndpoint 填寫您的執行個體訪問地址
$endpoint = "yourEndpoint";
// 擷取系統變數裡的 AccessKey ID 和 AccessKey Secret
$accessKeyId = getenv('TABLESTORE_ACCESS_KEY_ID');
$accessKeySecret = getenv('TABLESTORE_ACCESS_KEY_SECRET');
// 初始化 Tablestore Client
$otsClient = new OTSClient(array(
'EndPoint' => $endpoint,
'AccessKeyID' => $accessKeyId,
'AccessKeySecret' => $accessKeySecret,
'InstanceName' => $instanceName,
));
# 列出執行個體中的資料表列表並列印到控制台
$response = $otsClient->listTable (array ());
print json_encode ($response);
時序模型
使用時序模型時,您需要使用RAM使用者的存取金鑰初始化Timeseries Client並發起請求。目前僅Java和Go語言支援操作時序模型。
運行代碼前請替換代碼內的執行個體資訊,並將RAM使用者的AccessKey配置到系統內容變數,配置方法請參見配置環境變數。
Java
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";
// 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
// 構造 V4 簽名
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
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";
// 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
final String accessKeyId = System.getenv("TABLESTORE_ACCESS_KEY_ID");
final String accessKeySecret = System.getenv("TABLESTORE_ACCESS_KEY_SECRET");
// 構造 V2 簽名
DefaultCredentials credentials = new DefaultCredentials(accessKeyId, accessKeySecret);
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();
}
}
Go
以下Go範例程式碼用於初始化Timeseries Client,並擷取執行個體中的所有時序表名稱。
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-tablestore-go-sdk/tablestore"
)
func main() {
// yourInstanceName 填寫您的執行個體名稱
instanceName := "yourInstanceName"
// yourEndpoint 填寫您的執行個體訪問地址
endpoint := "yourEndpoint"
// 擷取環境變數裡的 AccessKey ID 和 AccessKey Secret
accessKeyId := os.Getenv("TABLESTORE_ACCESS_KEY_ID")
accessKeySecret := os.Getenv("TABLESTORE_ACCESS_KEY_SECRET")
// 初始化 Tablestore Client
client := tablestore.NewTimeseriesClient(endpoint, instanceName, accessKeyId, accessKeySecret)
// 列出執行個體下的時序表列表並列印到控制台
timeseriesTables, err := client.ListTimeseriesTable()
if err != nil {
fmt.Println("Failed to list table")
} else {
for _, timeseriesTablesMeta := range (timeseriesTables.GetTimeseriesTableMeta()) {
fmt.Println(timeseriesTablesMeta.GetTimeseriesTableName())
}
}
}
配置環境變數
直接在代碼中儲存訪問憑證容易導致資訊泄露,建議您按以下操作將訪問憑證儲存在系統內容變數中。
Windows
以管理員身份運行命令提示字元,執行以下命令。
# 配置 RAM 使用者的 AccessKey ID
setx TABLESTORE_ACCESS_KEY_ID your_access_key_id /m
# 配置 RAM 使用者的 AccessKey Secret
setx TABLESTORE_ACCESS_KEY_SECRET your_access_key_secret /m
macOS/Linux/Unix
# 配置 RAM 使用者的 AccessKey ID
export TABLESTORE_ACCESS_KEY_ID=your_access_key_id
# 配置 RAM 使用者的 AccessKey Secret
export TABLESTORE_ACCESS_KEY_SECRET=your_access_key_secret