全部產品
Search
文件中心

Object Storage Service:OSS Node.js SDK

更新時間:Jan 10, 2026

為Node.js應用提供簡單易用的OSS整合方案,支援檔案上傳下載、許可權管理等核心功能,快速實現雲端檔案儲存體和管理能力。

快速接入

通過以下步驟快速接入OSS Node.js SDK。

image

準備環境

下載並安裝Node.js運行環境。建議使用Node.js 8.0及以上版本以獲得更好的相容性和效能表現。

  • 執行node -v命令查看Node.js版本。

  • 執行npm -v命令查看npm版本。

安裝SDK

根據Node.js版本選擇對應的SDK版本。

  • Node.js 8.0及以上版本:使用最新的SDK 6.x版本。

  • Node.js 8.0以下版本:使用SDK 4.x版本。

安裝6.x版本(推薦)

npm install ali-oss@^6.x --save

安裝4.x版本

npm install ali-oss@^4.x --save

安裝完成後,執行npm list ali-oss命令驗證SDK是否成功安裝,成功時會顯示對應的SDK版本資訊。

配置訪問憑證

使用 RAM 使用者的 AccessKey 配置訪問憑證。

  1. RAM 控制台,建立使用永久 AccessKey 訪問的 RAM 使用者,儲存 AccessKey,然後為該使用者授予 AliyunOSSFullAccess 許可權。

  2. 使用 RAM 使用者的 AccessKey 配置環境變數。

    Linux

    1. 在命令列介面執行以下命令,將環境變數設定追加到~/.bashrc 檔案中。

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. 執行以下命令使變更生效。

      source ~/.bashrc
    3. 執行以下命令檢查環境變數是否生效。

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. 在終端中執行以下命令,查看預設Shell類型。

      echo $SHELL
    2. 根據預設Shell類型進行操作。

      Zsh
      1. 執行以下命令,將環境變數設定追加到 ~/.zshrc 檔案中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. 執行以下命令使變更生效。

        source ~/.zshrc
      3. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
      Bash
      1. 執行以下命令,將環境變數設定追加到 ~/.bash_profile 檔案中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. 執行以下命令使變更生效。

        source ~/.bash_profile
      3. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD
    1. 在CMD中運行以下命令。

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. 運行以下命令,檢查環境變數是否生效。

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%
    PowerShell
    1. 在PowerShell中運行以下命令。

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. 運行以下命令,檢查環境變數是否生效。

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)

初始化用戶端

以下範例程式碼使用華東1(杭州)地區的外網訪問網域名稱初始化用戶端,並通過列舉該帳號下的Bucket列表來驗證SDK配置是否正確。完整的地區和Endpoint列表請參見地區和Endpoint

// OSS Node.js SDK初始化用戶端樣本

const OSS = require('ali-oss');

async function main() {
    
    // 從環境變數中擷取訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    const client = new OSS({
        // 以華東1(杭州)為例,Region填寫為oss-cn-hangzhou
        region: 'oss-cn-hangzhou',
        // 從環境變數中擷取訪問憑證
        accessKeyId: process.env.OSS_ACCESS_KEY_ID,
        accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
        // 啟用V4簽名
        authorizationV4: true,
    });

    try {
        // 列舉所有Bucket
        const result = await client.listBuckets();
        
        // 輸出Bucket列表資訊
        console.log(`共找到 ${result.buckets.length} 個Bucket:`);
        
        for (const bucket of result.buckets) {
            console.log(bucket.name);
        }
        
    } catch (err) {
        console.log('列舉Bucket失敗,詳細資料如下:');
        console.error(err);
        return;
    }
}

// 執行主函數
main().catch(console.error);

用戶端配置

OSS用戶端支援多種配置選項以適應不同的網路環境和效能需求。通過自訂Endpoint類型、設定逾時時間和串連數等配置參數,可以最佳化用戶端的訪問效能和穩定性。完整配置選項詳見用戶端配置項

使用內網網域名稱

通過內網網域名稱訪問OSS可以避免公網流量費用,同時獲得更高的訪問速度和安全性。初始化用戶端時將Endpoint設定為內網訪問網域名稱即可啟用內網訪問。

const client = new OSS({
    // 以華東1(杭州)為例,Region填寫為oss-cn-hangzhou
    region: 'oss-cn-hangzhou',
    // 從環境變數中擷取訪問憑證
    accessKeyId: process.env.OSS_ACCESS_KEY_ID,
    accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
    // 啟用V4簽名
    authorizationV4: true,
    // 使用內網訪問網域名稱,以華東1(杭州)為例
    endpoint: 'https://oss-cn-hangzhou-internal.aliyuncs.com',
});

使用自訂網域名

將Endpoint指定為自訂網域名,並在初始化用戶端時通過cname: true參數啟用CNAME選項,即可實現自訂網域名訪問。

使用前需確保已將自訂網域名綁定到Bucket。詳見通過自訂網域名訪問OSS
說明

使用自訂網域名時無法調用client.listBuckets()方法。

// 從環境變數中擷取訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
const client = new OSS({
    // 以華東1(杭州)為例,Region填寫為oss-cn-hangzhou
    region: 'oss-cn-hangzhou',
    // 從環境變數中擷取訪問憑證
    accessKeyId: process.env.OSS_ACCESS_KEY_ID,
    accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
    // 啟用V4簽名
    authorizationV4: true,
    // 使用自訂網域名
    endpoint: 'http://example.com',
    // 填寫Bucket名稱,Bucket名稱必須和自訂網域名綁定
    bucket: 'example-bucket',
    // 開啟CNAME選項
    cname: true,
});

使用傳輸加速網域名稱

初始化OSS用戶端時,將Endpoint指定為傳輸加速網域名稱即可實現加速訪問。

// 從環境變數中擷取訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
const client = new OSS({
    // 以華東1(杭州)為例,Region填寫為oss-cn-hangzhou
    region: 'oss-cn-hangzhou',
    // 從環境變數中擷取訪問憑證
    accessKeyId: process.env.OSS_ACCESS_KEY_ID,
    accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
    // 啟用V4簽名
    authorizationV4: true,
    // 使用傳輸加速網域名稱
    endpoint: 'https://oss-accelerate.aliyuncs.com',
    // 填寫Bucket名稱,Bucket必須開啟傳輸加速功能
    bucket: 'example-bucket',
});

簽名版本

重要

阿里雲Object Storage Service V1 簽名將按以下時間錶停止使用,建議儘快升級為V4簽名,確保服務不受影響。

  • 自 2025 年 3 月 1 日起,新註冊使用者無法使用 V1 簽名。

  • 自 2025 年 9 月 1 日起,逐步停止 V1 簽名的更新維護,且新建立的 Bucket 無法使用 V1 簽名。

以下範例程式碼採用V1簽名初始化用戶端。V4簽名用戶端初始化範例程式碼參見初始化用戶端

// OSS Node.js SDK初始化用戶端樣本

const OSS = require('ali-oss');

async function main() {
    
    // 從環境變數中擷取訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    const client = new OSS({
        // 從環境變數中擷取訪問憑證
        accessKeyId: process.env.OSS_ACCESS_KEY_ID,
        accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
    });

    try {
        // 列舉所有Bucket
        const result = await client.listBuckets();
        
        // 輸出Bucket列表資訊
        console.log(`共找到 ${result.buckets.length} 個Bucket:`);
        
        for (const bucket of result.buckets) {
            console.log(bucket.name);
        }
        
    } catch (err) {
        console.log('列舉Bucket失敗,詳細資料如下:');
        console.error(err);
        return;
    }
}

// 執行主函數
main().catch(console.error);

範例程式碼

以下提供檔案基本操作的範例程式碼,涵蓋上傳、下載、刪除和列舉檔案等核心功能。通過這些樣本可以快速掌握OSS Node.js SDK的基本用法,更多完整樣本請參見Github樣本或具體功能SDK參考文檔。

上傳檔案

以下樣本示範如何將本地檔案上傳至OSS Bucket,同時展示如何通過自訂要求標頭設定檔案屬性,實現儲存類型、存取權限、標籤等精細化控制。

// OSS Node.js SDK上傳檔案樣本

const OSS = require('ali-oss');
const path = require('path');

async function main() {
    
    // 從環境變數中擷取訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    const client = new OSS({
        // 以華東1(杭州)為例,Region填寫為oss-cn-hangzhou
        region: 'oss-cn-hangzhou',
        // 從環境變數中擷取訪問憑證
        accessKeyId: process.env.OSS_ACCESS_KEY_ID,
        accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
        // 啟用V4簽名
        authorizationV4: true,
        // 填寫Bucket名稱
        bucket: 'example-bucket',
    });

    // 自訂要求標頭
    const headers = {
        // 指定Object的儲存類型
        'x-oss-storage-class': 'Standard',
        // 指定Object的存取權限
        'x-oss-object-acl': 'private',
        // 通過檔案URL訪問檔案時,指定以附件形式下載檔案
        'Content-Disposition': 'attachment',
        // 設定Object的標籤,可同時設定多個標籤
        'x-oss-tagging': 'Tag1=1&Tag2=2',
        // 指定PutObject操作時是否覆蓋同名目標Object。此處設定為true,表示禁止覆蓋同名Object
        'x-oss-forbid-overwrite': 'true',
    };

    try {
        // 設定檔資訊
        const key = 'dest.jpg';                    // OSS中的檔案路徑
        const localFilePath = path.normalize('dest.jpg'); // 本地檔案的完整路徑
        
        // 將本地檔案上傳到OSS指定路徑
        const result = await client.put(key, localFilePath, { headers });
        
        console.log(`檔案上傳完成: ${localFilePath} -> ${key}`);
        console.log('上傳結果:', result);
        
    } catch (err) {
        console.log('上傳失敗,詳細資料如下:');
        console.error(err);
        return;
    }
}

// 執行主函數
main().catch(console.error);

下載檔案

以下樣本示範如何從OSS Bucket下載檔案至本地指定路徑。

// OSS Node.js SDK下載檔案樣本

const OSS = require('ali-oss');

async function main() {
    
    // 從環境變數中擷取訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    const client = new OSS({
        // 以華東1(杭州)為例,Region填寫為oss-cn-hangzhou
        region: 'oss-cn-hangzhou',
        // 從環境變數中擷取訪問憑證
        accessKeyId: process.env.OSS_ACCESS_KEY_ID,
        accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
        // 啟用V4簽名
        authorizationV4: true,
        // 填寫Bucket名稱
        bucket: 'example-bucket',
    });

    try {
        // 設定檔資訊
        const key = 'dest.jpg';       // OSS中的檔案路徑
        const filePath = 'dest.jpg';  // 本地儲存路徑
        
        // 將OSS中的檔案下載到本地指定路徑
        const result = await client.get(key, filePath);
        
        console.log(`檔案下載完成: ${key} -> ${filePath}`);
        
    } catch (err) {
        console.log('下載失敗,詳細資料如下:');
        console.error(err);
        return;
    }
}

// 執行主函數
main().catch(console.error);

刪除檔案

以下樣本示範如何刪除OSS Bucket中的指定檔案。

// OSS Node.js SDK刪除檔案樣本

const OSS = require('ali-oss');

async function main() {
    
    // 從環境變數中擷取訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    const client = new OSS({
        // 以華東1(杭州)為例,Region填寫為oss-cn-hangzhou
        region: 'oss-cn-hangzhou',
        // 從環境變數中擷取訪問憑證
        accessKeyId: process.env.OSS_ACCESS_KEY_ID,
        accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
        // 啟用V4簽名
        authorizationV4: true,
        // 填寫Bucket名稱
        bucket: 'example-bucket',
    });

    try {
        // 設定檔資訊
        const key = 'dest.jpg';  // OSS中要刪除的檔案路徑
        
        // 刪除OSS中的指定檔案
        const result = await client.delete(key);
        
        console.log(`檔案刪除完成: ${key}`);
        console.log('刪除結果:', result);
        
    } catch (err) {
        console.log('刪除失敗,詳細資料如下:');
        console.error(err);
        return;
    }
}

// 執行主函數
main().catch(console.error);

列舉檔案

以下樣本示範如何列舉OSS Bucket中的檔案,預設返回最多100個檔案的詳細資料。

// OSS Node.js SDK列舉檔案樣本

const OSS = require('ali-oss');

async function main() {
    
    // 從環境變數中擷取訪問憑證(需要設定OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET)
    const client = new OSS({
        // 以華東1(杭州)為例,Region填寫為oss-cn-hangzhou
        region: 'oss-cn-hangzhou',
        // 從環境變數中擷取訪問憑證
        accessKeyId: process.env.OSS_ACCESS_KEY_ID,
        accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
        // 啟用V4簽名
        authorizationV4: true,
        // 填寫Bucket名稱
        bucket: 'example-bucket',
    });

    try {
        // 不帶任何參數,預設最多返回100個檔案
        const result = await client.list();
        
        console.log(`共找到 ${result.objects ? result.objects.length : 0} 個檔案:`);
        
        // 輸出檔案列表資訊
        if (result.objects && result.objects.length > 0) {
            for (const object of result.objects) {
                console.log(`檔案名稱: ${object.name}, 大小: ${object.size} bytes, 修改時間: ${object.lastModified}`);
            }
        } else {
            console.log('Bucket中沒有找到任何檔案');
        }
        
    } catch (err) {
        console.log('列舉檔案失敗,詳細資料如下:');
        console.error(err);
        return;
    }
}

// 執行主函數
main().catch(console.error);

異常處理

使用OSS Node.js SDK訪問OSS時出現錯誤,OSS會返回包含HTTP狀態代碼、錯誤訊息、請求ID等詳細資料的錯誤響應。例如下載不存在的對象檔案時,會返回以下錯誤資訊(省略了部分資訊):

Error [NoSuchKeyError]: Object not exists {
  status: 404,
  code: 'NoSuchKey',
  requestId: '6904202CA7BABC37395E28AB'
}

通過錯誤碼尋找相應錯誤原因和解決方案,完整的錯誤碼資訊請參見HTTP錯誤碼。遇到問題時也可根據requestId尋求線上支援人員的協助。

訪問憑證配置

OSS 支援多種憑證初始化方式,需根據認證和授權需求選擇合適的初始化方式。

單擊查看如何選擇訪問憑證

憑證提供者初始化方式

適用情境

是否需要提供前置的AK或STS Token

底層實現基於的憑證

憑證有效期間

憑證輪轉或重新整理方式

使用RAM使用者的AK

部署運行在安全、穩定且不易受外部攻擊的環境的應用程式,無需頻繁輪轉憑證就可以長期訪問雲端服務

AK

長期

手動輪轉

使用STS臨時訪問憑證

部署運行在不可信的環境的應用程式,希望能控制訪問的有效期間、許可權

STS Token

臨時

手動重新整理

使用RAMRoleARN

需要授權訪問雲端服務,例如跨阿里雲帳號訪問雲端服務的應用程式

STS Token

臨時

自動重新整理

使用ECSRAMRole

部署運行在阿里雲的ECS執行個體、ECI執行個體、Container ServiceKubernetes版的Worker節點中的應用程式

STS Token

臨時

自動重新整理

使用OIDCRoleARN

部署運行在阿里雲的Container ServiceKubernetes版的Worker節點中的不可信應用程式

STS Token

臨時

自動重新整理

使用CredentialsURI

需要通過外部系統擷取訪問憑證的應用程式

STS Token

臨時

自動重新整理

使用RAM使用者的AK

適用於應用程式部署運行在安全、穩定且不易受外部攻擊的環境中,需要長期訪問OSS且無法頻繁輪轉憑證的情境。通過阿里雲主帳號或RAM使用者的AK(Access Key ID、Access Key Secret)初始化憑證提供者。該方式需要手動維護AK,存在安全性風險和維護複雜度增加的風險。

重要
  • 阿里雲帳號擁有資源的全部許可權,AK一旦泄露,會給系統帶來巨大風險,不建議使用。推薦使用最小化授權的RAM使用者的AK。

  • 如需建立RAM使用者的AK,請直接存取建立AccessKey。RAM使用者的Access Key ID、Access Key Secret資訊僅在建立時顯示,如若遺忘請建立新的AK進行替換。

  1. 使用RAM使用者AccessKey配置環境變數。

    Linux

    1. 在命令列介面執行以下命令,將環境變數設定追加到~/.bashrc 檔案中。

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
    2. 執行以下命令使變更生效。

      source ~/.bashrc
    3. 執行以下命令檢查環境變數是否生效。

      echo $OSS_ACCESS_KEY_ID
      echo $OSS_ACCESS_KEY_SECRET

    macOS

    1. 在終端中執行以下命令,查看預設Shell類型。

      echo $SHELL
    2. 根據預設Shell類型進行操作。

      Zsh
      1. 執行以下命令,將環境變數設定追加到 ~/.zshrc 檔案中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. 執行以下命令使變更生效。

        source ~/.zshrc
      3. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
      Bash
      1. 執行以下命令,將環境變數設定追加到 ~/.bash_profile 檔案中。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. 執行以下命令使變更生效。

        source ~/.bash_profile
      3. 執行以下命令檢查環境變數是否生效。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET

    Windows

    CMD
    1. 在CMD中運行以下命令。

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. 運行以下命令,檢查環境變數是否生效。

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%
    PowerShell
    1. 在PowerShell中運行以下命令。

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. 運行以下命令,檢查環境變數是否生效。

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. 參考上述方式修改系統內容變數後,需重啟或重新整理編譯運行環境,包括IDE、命令列介面、其他傳統型應用程式及後台服務,以確保最新的系統內容變數成功載入。

  3. 使用環境變數傳遞憑證資訊。

    const OSS = require("ali-oss");
    
    // 初始化OSS
    const client = new OSS({
      // 從環境變數中擷取AccessKey ID的值
      accessKeyId: process.env.OSS_ACCESS_KEY_ID,
      // 從環境變數中擷取AccessKey Secret的值
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET
    });
    
    // listBuckets
    const buckets = await client.listBuckets();
    console.log(buckets);

使用STS臨時訪問憑證

適用於應用程式需要臨時訪問OSS的情境。通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token)初始化憑證提供者。該方式需要手動維護STS Token,存在安全性風險和維護複雜度增加的風險。如果需要多次臨時訪問OSS,需要手動重新整理STS Token。

重要
  1. 使用臨時身份憑證設定環境變數。

    Mac OS/Linux/Unix

    重要
    • 請注意,此處使用的是通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token),而非RAM使用者的Access Key和Access Key Secret。

    • 請注意區分STS服務擷取的Access Key ID以STS開頭,例如“STS.****************”。

    export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>

    Windows

    重要
    • 請注意,此處使用的是通過STS服務擷取的臨時身份憑證(Access Key ID、Access Key Secret和Security Token),而非RAM使用者的AK(Access Key ID、Access Key Secret)。

    • 請注意區分STS服務擷取的Access Key ID以STS開頭,例如“STS.****************”。

    set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
  2. 通過環境變數傳遞憑證資訊。

    const OSS = require("ali-oss");
    
    // 初始化OSS
    const client = new OSS({
      // 從環境變數中擷取AccessKey ID的值
      accessKeyId: process.env.OSS_ACCESS_KEY_ID,
      // 從環境變數中擷取AccessKey Secret的值
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
      // 從環境變數中擷取STS Token的值
      stsToken: process.env.OSS_SESSION_TOKEN
    });
    
    // listBuckets
    const buckets = await client.listBuckets();
    console.log(buckets);

使用RAMRoleARN

適用於應用程式需要授權訪問OSS,例如跨阿里雲帳號訪問OSS的情境。通過指定RAM角色的ARN(Alibabacloud Resource Name)初始化憑證提供者,底層實現基於STS Token。Credentials工具會前往STS服務擷取STS Token,並在會話到期前調用AssumeRole介面申請新的STS Token。還可以通過為policy賦值來限制RAM角色到一個更小的許可權集合。

重要
  • 阿里雲帳號擁有資源的全部許可權,AK一旦泄露,會給系統帶來巨大風險,不建議使用。推薦使用最小化授權的RAM使用者的AK。

  • 如需建立RAM使用者的AK,請直接存取建立AccessKey。RAM使用者的Access Key ID、Access Key Secret資訊僅在建立時顯示,請及時儲存,如若遺忘請建立新的AK進行輪換。

  • 如需擷取RAMRoleARN,請直接存取建立角色

  1. 添加credentials依賴。

    npm install @alicloud/credentials
  2. 配置AK和RAMRoleARN作為訪問憑證。

    const Credential = require("@alicloud/credentials");
    const OSS = require("ali-oss");
    
    // 使用RamRoleArn初始化Credentials Client。
    const credentialsConfig = new Credential.Config({
      // 憑證類型。
      type: "ram_role_arn",
      // 從環境變數中擷取AccessKey ID的值
      accessKeyId: process.env.OSS_ACCESS_KEY_ID,
      // 從環境變數中擷取AccessKey Secret的值
      accessKeySecret: process.env.OSS_ACCESS_KEY_SECRET,
      // 要扮演的RAM角色ARN,樣本值:acs:ram::123456789012****:role/adminrole,可以通過環境變數ALIBABA_CLOUD_ROLE_ARN設定roleArn
      roleArn: '<RoleArn>',
      // 角色會話名稱,可以通過環境變數ALIBABA_CLOUD_ROLE_SESSION_NAME設定RoleSessionName
      roleSessionName: '<RoleSessionName>',
      // 設定更小的權限原則,非必填。樣本值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
      // policy: '<Policy>',
      roleSessionExpiration: 3600
    });
    const credentialClient = new Credential.default(credentialsConfig);
    const credential = await credentialClient.getCredential();
    
    // 初始化OSS
    const client = new OSS({
      accessKeyId:credential.accessKeyId,
      accessKeySecret: credential.accessKeySecret,
      stsToken: credential.securityToken,
      refreshSTSTokenInterval: 0, // 由Credential控制accessKeyId、accessKeySecret和stsToken值的更新
      refreshSTSToken: async () => {
        const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
        return {
          accessKeyId,
          accessKeySecret,
          stsToken: securityToken,
        };
      }
    });
    
    // listBuckets
    const buckets = await client.listBuckets();
    console.log( buckets);

使用ECSRAMRole

適用於應用程式運行在ECS執行個體、ECI執行個體、Container ServiceKubernetes版的Worker節點中的情境。建議使用ECSRAMRole初始化憑證提供者,底層實現基於STS Token。ECSRAMRole允許將一個角色關聯到ECS執行個體、ECI執行個體或Container Service Kubernetes 版的Worker節點,實現在執行個體內部自動重新整理STS Token。該方式無需提供AK或STS Token,消除了手動維護AK或STS Token的風險。如何擷取ECSRAMRole,請參見建立角色。如何將一個角色關聯到ECS執行個體,請參見執行個體RAM角色

  1. 添加credentials依賴。

    npm install @alicloud/credentials
  2. 配置ECSRAMRole作為訪問憑證。

    const Credential = require("@alicloud/credentials");
    const OSS = require("ali-oss");
    
    // 使用RamRoleArn初始化Credentials Client。
    const credentialsConfig = new Credential.Config({
      // 憑證類型。
      type: "ecs_ram_role",
      // 選填,該ECS角色的角色名稱,不填會自動擷取,但是建議加上以減少請求次數,可以通過環境變數ALIBABA_CLOUD_ECS_METADATA設定roleName
      roleName: '<RoleName>'
    });
    const credentialClient = new Credential.default(credentialsConfig);
    
    const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
    
    // 初始化OSS Client
    const client = new OSS({
      accessKeyId,
      accessKeySecret,
      stsToken: securityToken,
      refreshSTSTokenInterval: 0, // 由Credential控制accessKeyId、accessKeySecret和stsToken值的更新
      refreshSTSToken: async () => {
        const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
        
        return {
          accessKeyId,
          accessKeySecret,
          stsToken: securityToken,
        };
      }
    });
    
    // listBuckets
    const buckets = await client.listBuckets();
    console.log(buckets);

使用OIDCRoleARN

在Container ServiceKubernetes版中設定了Worker節點RAM角色後,對應節點內的Pod中的應用也可以像ECS上部署的應用一樣,通過中繼資料服務(Meta Data Server)擷取關聯角色的STS Token。但如果容器叢集上部署的是不可信的應用(比如部署客戶提交的應用,代碼也沒有開放),可能並不希望它們能通過中繼資料服務擷取Worker節點關聯執行個體RAM角色的STS Token。為了避免影響雲上資源的安全,同時又能讓這些不可信的應用安全地擷取所需的STS Token,實現應用層級的許可權最小化,可以使用RRSA(RAM Roles for Service Account)功能。該方式底層實現基於STS Token。阿里雲容器叢集會為不同的應用Pod建立和掛載相應的服務賬戶OIDC Token檔案,並將相關配置資訊注入到環境變數中,Credentials工具通過擷取環境變數的配置資訊,調用STS服務的AssumeRoleWithOIDC介面換取綁定角色的STS Token。該方式無需提供AK或STS Token,消除了手動維護AK或STS Token的風險。詳情請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離

  1. 添加credentials依賴。

    npm install @alicloud/credentials
  2. 配置OIDC的RAM角色作為訪問憑證。

    const OSS = require("ali-oss");
    const Credential = require("@alicloud/credentials");
    
    const credentialsConfig = new Credential.Config({
      // 憑證類型。
      type: "oidc_role_arn",
      // RAM角色名稱ARN,可以通過環境變數ALIBABA_CLOUD_ROLE_ARN設定roleArn
      roleArn: '<RoleArn>',
      // OIDC供應商ARN,可以通過環境變數ALIBABA_CLOUD_OIDC_PROVIDER_ARN設定oidcProviderArn
      oidcProviderArn: '<OidcProviderArn>',
      // OIDC Token檔案路徑,可以通過環境變數ALIBABA_CLOUD_OIDC_TOKEN_FILE設定oidcTokenFilePath
      oidcTokenFilePath: '<OidcTokenFilePath>',
      // 角色會話名稱,可以通過環境變數ALIBABA_CLOUD_ROLE_SESSION_NAME設定roleSessionName
      roleSessionName: '<RoleSessionName>',
      // 設定更小的權限原則,非必填。樣本值:{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
      // policy: "<Policy>",
      // 設定session到期時間
      roleSessionExpiration: 3600
    });
    const credentialClient = new Credential.default(credentialsConfig);
    const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
    const client = new OSS({
      accessKeyId,
      accessKeySecret,
      stsToken: securityToken,
      refreshSTSTokenInterval: 0, // 由Credential控制accessKeyId、accessKeySecret和stsToken值的更新
      refreshSTSToken: async () => {
        const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
        
        return {
          accessKeyId,
          accessKeySecret,
          stsToken: securityToken,
        };
      }
    });
    const buckets = await client.listBuckets();
    
    console.log(buckets);

使用CredentialsURI

適用於應用程式需要通過外部系統擷取阿里雲憑證,從而實現靈活的憑證管理和無密鑰訪問的情境。可以使用CredentialsURI初始化憑證提供者,底層實現基於STS Token。Credentials工具通過提供的URI擷取STS Token,完成憑證用戶端初始化。該方式無需提供AK或STS Token,消除了手動維護AK或STS Token的風險。

重要
  • CredentialsURI指擷取STS Token的伺服器位址。

  • 提供CredentialsURI響應的後端服務需要實現STS Token的自動重新整理邏輯,確保應用程式始終能擷取到有效憑證。

  1. 為了使Credentials工具正確解析和使用STS Token,URI必須遵循以下響應協議:

    • 響應狀態代碼:200

    • 響應體結構:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. 添加credentials依賴。

    npm install @alicloud/credentials
  3. 配置CredentialsURI作為訪問憑證。

    const OSS = require("ali-oss");
    const Credential = require("@alicloud/credentials");
    
    // 通過憑證的 URI 初始化Credentials Client。
    const credentialsConfig = new Credential.Config({
      // 憑證類型。
      type: "credentials_uri",
      // 擷取憑證的 URI,格式為http://local_or_remote_uri/,可以通過環境變數ALIBABA_CLOUD_CREDENTIALS_URI設定credentialsUri
      credentialsURI: '<CredentialsUri>'
    });
    const credentialClient = new Credential.default(credentialsConfig);
    const credential = await credentialClient.getCredential();
    
    // 初始化OSS
    const client = new OSS({
      accessKeyId: credential.accessKeyId,
      accessKeySecret: credential.accessKeySecret,
      stsToken: credential.securityToken,
      refreshSTSTokenInterval: 0, // 由Credential控制accessKeyId、accessKeySecret和stsToken值的更新
      refreshSTSToken: async () => {
        const { accessKeyId, accessKeySecret, securityToken } = await credentialClient.getCredential();
    
        return {
          accessKeyId,
          accessKeySecret,
          stsToken: securityToken,
        };
      }
    });
    
    // listBuckets
    const buckets = await client.listBuckets();
    console.log(buckets);

相關文檔