您可以為RAM使用者授予特定的許可權,通過RAM使用者存取金鑰長期訪問您的OSS資源。相較於阿里雲帳號存取金鑰,使用RAM使用者存取金鑰訪問OSS資源更加安全。
步驟一:建立RAM使用者
使用阿里雲帳號(主帳號)或Resource Access Management員登入RAM控制台。
在左側導覽列,選擇。
在使用者頁面,單擊建立使用者。

在建立使用者頁面的使用者帳號資訊地區,設定使用者基本資料。
登入名稱稱:可包含英文字母、數字、半形句號(.)、短劃線(-)和底線(_),最多64個字元。
顯示名稱:最多包含128個字元或漢字。
標籤:單擊
,然後輸入標籤鍵和標籤值。為RAM使用者綁定標籤,便於後續基於標籤的使用者管理。
說明單擊添加使用者,可以大量建立多個RAM使用者。
在訪問方式地區,選擇使用永久 AccessKey 訪問,然後單擊確定。
單擊複製,儲存存取金鑰(AccessKey ID 和 AccessKey Secret)。
步驟二:為RAM使用者授予上傳檔案的許可權
建立上傳檔案的自訂權限原則。
在左側導覽列,選擇。
單擊创建权限策略。
在创建权限策略頁面,單擊指令碼編輯,然後在策略文檔輸入框中賦予角色向目標儲存空間examplebucket下的目錄exampledir上傳檔案的許可權。具體配置樣本如下。
警告以下樣本僅供參考。您需要根據實際需求配置更細粒度的授權策略,防止出現許可權過大的風險。關於更細粒度的授權策略配置詳情,請參見通過RAM或STS服務向其他使用者授權。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:PutObject", "Resource": "acs:oss:*:*:examplebucket/exampledir/*" } ] }策略配置完成後,單擊繼續編輯基本資料。
在基本資料地區,填寫策略名稱為RamTestPolicy,然後單擊確定。
為RAM使用者授予自訂權限原則。
在左側導覽列,選擇。
在用户頁面,找到目標RAM使用者。
單擊RAM使用者右側的添加权限。
在添加权限頁面下的自定义策略頁簽,選擇已建立的自訂權限原則RamTestPolicy。
單擊確認新增授權。
步驟三:使用RAM使用者存取金鑰上傳檔案至OSS
以下Java範例程式碼用於將本地檔案examplefile.txt上傳到目標儲存空間examplebucket中exampledir目錄下的exampleobject.txt檔案。
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.*;
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 {
// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填寫Bucket名稱,例如examplebucket。
String bucketName = "examplebucket";
// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。
String objectName = "exampledir/exampleobject.txt";
// 填寫本地檔案的完整路徑,例如D:\\localpath\\examplefile.txt。
// 如果未指定本地路徑,則預設從樣本程式所屬專案對應本地路徑中上傳檔案。
String filePath= "D:\\localpath\\examplefile.txt";
// 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。
String region = "cn-hangzhou";
// 建立OSSClient執行個體。
// 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
OSS ossClient = OSSClientBuilder.create()
.endpoint(endpoint)
.credentialsProvider(credentialsProvider)
.clientConfiguration(clientBuilderConfiguration)
.region(region)
.build();
try {
// 建立PutObjectRequest對象。
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, new File(filePath));
// 如果需要上傳時設定儲存類型和存取權限,請參考以下範例程式碼。
// 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 an 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();
}
}
}
}常見問題
如何查看RAM使用者的AK?是否可以查看舊的AccessKey Secret?
使用RAM使用者的AK進行上傳檔案時,報錯AccessDenied如何排查?
如果遇到報錯問題該如何查詢具體的錯誤類型?
報錯NoSuchBucket如何處理?
報錯The bucket you are attempting to access must be addressed using the specified endpoint.如何處理?
相關文檔
檔案上傳到OSS後,您可以通過簽名URL的方式將檔案分享給第三方使用者進行預覽或者下載。具體操作,請參見使用預簽名URL下載或預覽檔案。