全部產品
Search
文件中心

Object Storage Service:使用RAM使用者存取金鑰訪問OSS

更新時間:Dec 26, 2025

您可以為RAM使用者授予特定的許可權,通過RAM使用者存取金鑰長期訪問您的OSS資源。相較於阿里雲帳號存取金鑰,使用RAM使用者存取金鑰訪問OSS資源更加安全。

步驟一:建立RAM使用者

  1. 使用阿里雲帳號(主帳號)或Resource Access Management員登入RAM控制台

  2. 在左側導覽列,選擇身份管理 > 使用者

  3. 使用者頁面,單擊建立使用者

    image

  4. 建立使用者頁面的使用者帳號資訊地區,設定使用者基本資料。

    • 登入名稱稱:可包含英文字母、數字、半形句號(.)、短劃線(-)和底線(_),最多64個字元。

    • 顯示名稱:最多包含128個字元或漢字。

    • 標籤:單擊edit,然後輸入標籤鍵和標籤值。為RAM使用者綁定標籤,便於後續基於標籤的使用者管理。

    說明

    單擊添加使用者,可以大量建立多個RAM使用者。

  5. 訪問方式地區,選擇使用永久 AccessKey 訪問,然後單擊確定

  6. 單擊複製,儲存存取金鑰(AccessKey ID 和 AccessKey Secret)。

步驟二:為RAM使用者授予上傳檔案的許可權

  1. 建立上傳檔案的自訂權限原則。

    1. 在左側導覽列,選擇許可權管理 > 权限策略

    2. 單擊创建权限策略

    3. 创建权限策略頁面,單擊指令碼編輯,然後在策略文檔輸入框中賦予角色向目標儲存空間examplebucket下的目錄exampledir上傳檔案的許可權。具體配置樣本如下。

      警告

      以下樣本僅供參考。您需要根據實際需求配置更細粒度的授權策略,防止出現許可權過大的風險。關於更細粒度的授權策略配置詳情,請參見通過RAM或STS服務向其他使用者授權

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "oss:PutObject",
            "Resource": "acs:oss:*:*:examplebucket/exampledir/*"
          }
        ]
      }
    4. 策略配置完成後,單擊繼續編輯基本資料

    5. 基本資料地區,填寫策略名稱RamTestPolicy,然後單擊確定

  2. 為RAM使用者授予自訂權限原則。

    1. 在左側導覽列,選擇身份管理 > 用户

    2. 用户頁面,找到目標RAM使用者。

    3. 單擊RAM使用者右側的添加权限

    4. 添加权限頁面下的自定义策略頁簽,選擇已建立的自訂權限原則RamTestPolicy

    5. 單擊確認新增授權

步驟三:使用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?

請使用已有AccessKey或者參考建立AccessKey重新建立。請注意:為降低AccessKey泄露的風險,AccessKey Secret 只在建立時顯示一次,後續無法查看。請務必妥善保管。

使用RAM使用者的AK進行上傳檔案時,報錯AccessDenied如何排查?

上傳檔案時出現AccessDenied的問題,通常是因為使用了錯誤的AK資訊或沒有給RAM使用者添加上傳檔案的許可權,您可以按照以下步驟檢查:

  1. 檢查您使用的RAM使用者的AK是否正確。請使用已有AccessKey或者參考建立AccessKey重新建立。請注意:為降低AccessKey泄露的風險,AccessKey Secret 只在建立時顯示一次,後續無法查看。請務必妥善保管。

  2. 登入RAM控制台選擇具體使用者,給RAM使用者添加上傳檔案到OSS的許可權。

如果遇到報錯問題該如何查詢具體的錯誤類型?

關於錯誤類型的查詢,OSS文檔提供了EC錯誤碼供您參閱,例如關於認證方面的常見報錯問題,請參見02-AUTH

報錯NoSuchBucket如何處理?

出現該報錯的原因是指定的Bucket不存在。請檢查並配置正確的Bucket名稱。

報錯The bucket you are attempting to access must be addressed using the specified endpoint.如何處理?

出現該報錯的原因是Endpoint參數填寫錯誤。您需要根據Bucket所在Region填寫對應的Endpoint。關於Region與Endpoint對應關係的說明,請參見地區和Endpoint

相關文檔