全部產品
Search
文件中心

Terraform:Terraform 身份認證

更新時間:Jan 07, 2026

阿里雲 Terraform Provider 支援多種身份認證方式,其選擇需綜合考慮 Terraform 的運行環境與應用情境。

認證方式優先順序

配置阿里雲 Provider 時,通常只需選擇一種身份認證方式。Terraform Provider 會按以下順序尋找身份憑證,一旦匹配成功,即停止尋找:

  1. 靜態配置:優先讀取 provider 塊中顯式指定的 access_key、secret_key、security_token 或 ecs_role_name。

  2. 環境變數:若無靜態配置,則讀取系統內容變數(如 ALICLOUD_ACCESS_KEY、ALICLOUD_SECRET_KEY 等)。

  3. 共用設定檔

    1. 靜態配置:從本地共用設定檔中讀取指定 profile 的認證資訊,如AK/SK、ram_role_arn、ram_role_name、sts_token等。

    2. 進階配置:若共用設定檔中無靜態配置,但配置了 CloudSSO、OAuth、外部程式(External)或鏈式角色(ChainableRamRoleArn),則調用相應外掛程式擷取臨時STS憑證。

  4. URL 憑證:若以上皆為空白,則嘗試從 credentials_uri 指定的地址拉取憑證。

安全性建議

為提高生產環境的安全性,推薦使用以下基於臨時憑證的認證方式:

  • ECS 執行個體 RAM 角色

  • RAM 角色扮演(AssumeRole)

  • OIDC 身份供應商角色扮演

這些方式具有以下安全優勢:

  • 避免在配置中寫入程式碼或暴露長期有效 AccessKey,從而降低密鑰泄露風險。

  • 通過固定有效期間限制許可權的暴露視窗。

精細化授權支援

當需要根據應用、團隊或專案等維度對資源存取權限進行精細化管控時,可使用 RAM 角色扮演和 OIDC 身份供應商角色扮演。通過為不同的 Terraform 工作負載綁定專屬的角色及權限原則,以遵循最小許可權原則。

Terraform 身份認證方式

阿里雲 Terraform Provider 提供以下身份認證方式:

認證方式

使用說明

適應情境

靜態配置

(access_key)

將 AccessKey (AK) 明文定義在設定檔中,或通過參數傳入。

  • 開發環境測實驗證;

  • CI/CD 資源管理流程。

環境變數

(ALIBABA_CLOUD_ACCESS_KEY)

從環境變數中讀取 AK 資訊。

  • 開發環境測實驗證;

  • 獨立的運行環境(如 ECS)。

ECS服務角色

(ecs_role_name)

從 ECS 執行個體的中繼資料(Metadata)中擷取其綁定的 RAM 角色對應的訪問憑證。

Terraform 運行在 ECS 執行個體中。

OIDC角色扮演(assume_role_with_oidc)

通過 OIDC 角色扮演換取訪問憑證。

Terraform 運行在支援 OIDC 的 Kubernetes 叢集中(如阿里雲 ACK)。

角色扮演

(assume_role)

通過扮演 RAM 角色換取訪問憑證。

  • 多帳號資源管理;

  • CI/CD 資源管理流程。

URL憑證

(credentials_uri)

指定一個 URI 地址,通過訪問該地址擷取臨時憑證。

從自訂的憑證服務(API 或檔案)中擷取憑證。

共用設定檔

(profile)

支援多種認證方式通過阿里雲 CLI 配置到統一的檔案中,通過指定 profile 的名稱來擷取訪問憑證。目前支援的認證方式有:

  • AK

  • STSToken

  • ECSRamRole

  • CloudSSO

  • ChainableRamRoleArn

  • External

  • OAuth

  • 多帳號,多地區資源管理。

  • 多環境資源管理。

靜態配置

靜態配置是指直接在 Terraform 設定檔的 provider 塊中定義訪問憑證。

參數

參數名稱

說明

樣本值

access_key

Access Key ID。

abcd*******

secret_key

Access Key Secret。

abcd*******

security_token(可選)

STS 臨時訪問憑證的 Security Token。

abcd*******

provider "alicloud" {
  access_key = "<Access Key ID>"
  secret_key = "<Access Key Secret>"
  # 如果使用 STS 憑證,需配置 security_token
  # security_token = "<STS Token>"
}

樣本配置

為提高安全性,建議通過變數傳入訪問憑證,而非在設定檔中寫入程式碼明文,且變數不設定預設值:

variable "access_key_id" {
  description = "The AccessKey ID for operating your infrastructure"
}
variable "access_key_secret" {
  description = "The AccessKey Secret for operating your infrastructure"
}
variable "security_token" {
  description = "The Security Token for operating your infrastructure"
}
provider "alicloud" {
  access_key = var.access_key_id
  secret_key = var.access_key_secret
  # 如果使用 STS 憑證,需配置 security_token
  # security_token = var.security_token
}

運行 terraform 命令時,可通過 -var 選項傳入變數值:

$ terraform plan -var access_key_id="<Access Key ID>" -var access_key_secret="<Access Key Secret>" -var security_token="<STS Token>"

環境變數配置

將訪問憑證儲存在環境變數中。當設定檔中未靜態配置憑證時,Terraform 會從指定的環境變數中讀取憑證。

參數

參數名稱

說明

樣本值

ALICLOUD_ACCESS_KEY

Access Key ID。

abcd*******

ALICLOUD_SECRET_KEY

Access Key Secret。

abcd*******

ALICLOUD_SECURITY_TOKEN(可選)

STS 臨時訪問憑證的 Security Token。

abcd*******

樣本配置

Linux/macOS
說明

使用 export 命令配置的臨時環境變數僅對當前 Shell 會話有效。如需長期保留,可將 export 命令寫入 Shell 的啟動設定檔(如 .bash_profile 或 .zshrc)。

# AccessKey ID
$ export ALICLOUD_ACCESS_KEY="<AccessKey ID>"
# AccessKey Secret
$ export ALICLOUD_SECRET_KEY="<AccessKey Secret>"
# 如果使用 STS 憑證,需配置 security_token
$ export ALICLOUD_SECURITY_TOKEN="<STS Token>"
Windows
  1. 在案頭按右鍵 此電腦,選擇 屬性 > 進階系統設定 > 環境變數

  2. 在 系統變數 或 使用者變數 中,單擊 建立,建立以下環境變數:ALICLOUD_ACCESS_KEYALICLOUD_SECRET_KEYALICLOUD_SECURITY_TOKEN(可選)。

設定環境變數後,provider 塊中無需聲明憑證,可僅聲明地區等其他資訊:

provider "alicloud" {
  region = "cn-hangzhou"
}

region 也支援通過環境變數 ALICLOUD_REGION 配置。如果未在 provider 塊或環境變數中指定 region,將預設使用 cn-beijing

相比靜態配置,使用環境變數更便捷,安全性更高。

ECS服務角色

當 Terraform 運行在 ECS 執行個體上時,可使用 ECS 服務角色進行身份認證。通過為 ECS 執行個體關聯一個 RAM 角色,執行個體內部的應用程式(包括 Terraform)可以自動擷取並重新整理臨時訪問憑證。此方式無需配置 AccessKey,降低了密鑰泄露風險,並可通過 RAM 角色實現精細化的許可權控制。詳情請參見執行個體RAM角色

參數

參數名稱

說明

樣本值

ecs_role_name

綁定到 ECS 執行個體的 RAM 角色名稱。

terraform-ecs-role

樣本配置

  1. 準備一台具有公網訪問能力的 ECS 執行個體。

  2. 建立一個 RAM 角色,並將其綁定到該 ECS 執行個體。

  3. 在 provider 塊中設定 ecs_role_name 參數,其值為該 RAM 角色的名稱:

provider "alicloud" {
  ecs_role_name = "<綁定到 ECS 執行個體上的 RAM 角色名稱>"
}

該參數也支援通過環境變數 ALICLOUD_ECS_ROLE_NAME 設定。

基於 ECS 服務角色的認證方式安全性高,建議在 ECS 執行個體中執行 Terraform 時使用此方式。

OIDC角色扮演

OIDC 角色扮演與角色扮演(AssumeRole)類似,都是通過擷取 RAM 角色的臨時憑證來訪問阿里雲資源。其區別在於,OIDC 角色扮演所扮演的身份由 OIDC 身份供應商(IdP)頒發。詳情請參見管理OIDC身份供應商

參數

配置 OIDC 角色扮演時,所有相關參數均在 assume_role_with_oidc 塊中設定:

參數名稱

說明

樣本值

oidc_provider_arn(必填)

身份供應商的 ARN,格式為 :acs:ram::<阿里雲帳號ID>:oidc-provider/<RAM Provider 角色名稱>。可通過 RAM 控制台或 API 查看。該參數支援通過環境變數 ALIBABA_CLOUD_OIDC_PROVIDER_ARN 設定。

acs:ram::151192xxxxxx:oidc-provider/ackrole

oidc_token(可選)

由外部 IdP 簽發的 OIDC 令牌(OIDC Token)。oidc_token 和 oidc_token_file 必須設定其一。該參數支援通過環境變數 ALIBABA_CLOUD_OIDC_TOKEN 設定。

eyJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.************

oidc_token_file(可選)

存放 OIDC 令牌的檔案的絕對路徑。oidc_token 和 oidc_token_file 必須設定其一。該參數支援通過環境變數 ALIBABA_CLOUD_OIDC_TOKEN_FILE 設定。

/var/run/secrets/oidc/token

role_arn(必填)

指定要扮演的 RAM 角色 ARN,格式為 acs:ram::<阿里雲帳號ID>:role/<RAM角色名稱>。該參數支援通過環境變數 ALIBABA_CLOUD_ROLE_ARN 設定。

acs:ram::151192xxxxxx:role/k8srole

policy(可選)

一個 RAM 權限原則。如果設定,臨時憑證的最終許可權是此策略與 role_arn 對應角色所關聯權限原則的交集。如果未設定,則最終許可權僅由 role_arn 對應角色的許可權決定。

{"Version":"1","Statement":[{"Effect":"Allow","Action":"oss:ListBuckets","Resource":"acs:oss:oss-cn-hangzhou:*:*"}]}

role_session_name(可選)

自訂的角色會話名稱,通常設定為調用角色扮演的使用者身份。如果未設定,預設為 terraform。該參數支援通過環境變數 ALIBABA_CLOUD_ROLE_SESSION_NAME 設定。

使用者名稱

session_expiration(可選)

臨時憑證的有效期間,單位為秒。取值範圍為 900 到所扮演角色的 MaxSessionDuration(預設為 3600)。可通過 更新角色資訊修改角色的最大會話時間,上限為 43200 秒。

900

樣本配置

OIDC 角色扮演認證是通過調用 AssumeRoleWithOIDC - OIDC角色SSO時擷取扮演角色的臨時身份憑證 實現。配置前,需準備以下資訊:

  1. 建立 OIDC 身份供應商,從外部 IdP 擷取 OIDC 令牌(OIDC Token),並記錄供應商的 ARN 和 OIDC Token。

  2. 建立一個授信實體為“身份供應商”的 RAM 角色,為其授予要求的權限(如 AliyunOSSFullAccess),並記錄該角色的 ARN。

  3. (可選)編寫一個 RAM 自訂權限原則(如僅允許訪問杭州地區的 Bucket),用於與角色許可權取交集,以實現更精細的存取控制。

準備完成後,在 provider 塊中進行如下配置:

provider "alicloud" {
  assume_role_with_oidc {
    oidc_provider_arn  = "<OIDC 身份供應商的 ARN>"
    oidc_token         = "<外部 IDP 申請簽發的 OIDC Token>"
    role_arn           = "<RAM 角色的 ARN>"
    policy             = "<RAM 權限原則的具體內容>"
    role_session_name  = "<自訂的角色會話名稱>"
    session_expiration = <臨時身份訪問憑證的最大有效期間>
  }
}

阿里雲Container Service ACK 支援通過 RRSA 功能自動建立 OIDC Provider 和簽發 OIDC 令牌。詳情請參見通過RRSA配置ServiceAccount的RAM許可權實現Pod許可權隔離。開啟 RRSA 後,ack-pod-identity-webhook 組件會自動為 Pod 注入 ALIBABA_CLOUD_OIDC_PROVIDER_ARNALIBABA_CLOUD_OIDC_TOKEN_FILE 和 ALIBABA_CLOUD_ROLE_ARN 環境變數。在此環境下,若要在 ACK Pod 內運行 Terraform,上述樣本可簡化為:

provider "alicloud" {
  region = "cn-hangzhou"
  assume_role_with_oidc {
    policy             = <<EOF
    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "oss:ListBuckets",
          "Resource": "acs:oss:oss-cn-hangzhou:*:*"
        }
      ]
    }
    EOF
    session_name = "terraform-assume-role-session"
    session_expiration = 1000
  }
}

如果不需要通過 policy 參數進行精細化授權,可直接將要求的權限授予 RAM 角色。此時,配置可進一步簡化:

provider "alicloud" {
  region = "cn-hangzhou"
  assume_role_with_oidc {
    session_name = "terraform-assume-role-session"
    session_expiration = 1000
  }
}

角色扮演

角色扮演(AssumeRole)適用於需要將許可權與身份(如 RAM 使用者或 ECS 執行個體角色)分離,或需要跨帳號訪問資源的情境。它通過一個已有身份(如 RAM 使用者)扮演另一個 RAM 角色,從而擷取該角色的臨時憑證來訪問資源。

參數

配置角色扮演時,支援以下參數:

  1. access_key / secret_key 用於扮演角色的 RAM 使用者的 AccessKey。該使用者必須擁有 sts:AssumeRole 許可權。這些參數也支援通過環境變數設定。

  2. assume_role:是一個配置塊,包含以下參數:

參數名稱

說明

樣本值

role_arn(必填)

指定要扮演的 RAM 角色 ARN,格式為 acs:ram::1234567890123456:role/<RAM角色名稱>

acs:ram::151192xxxxxx:role/k8srole

policy(可選)

一個 RAM 權限原則。如果設定,臨時憑證的最終許可權是此策略與 role_arn 對應角色所關聯權限原則的交集。如果未設定,則最終許可權僅由 role_arn 對應角色的許可權決定。

{"Version":"1","Statement":[{"Effect":"Allow","Action":"oss:ListBuckets","Resource":"acs:oss:oss-cn-hangzhou:*:*"}]}

session_name(可選)

自訂的角色會話名稱,用於在審計日誌中區分操作者。如果未設定,預設為 terraform

terraform

session_expiration(可選)

臨時憑證的有效期間,單位為秒。取值範圍為 900 到所扮演角色的 MaxSessionDuration(預設為 3600)。可通過 更新角色資訊修改角色的最大會話時間,上限為 43200 秒。

3600

external_Id(可選)

角色外部 ID,用於防止“混淆代理人”問題。詳情請參見使用ExternalId防止混淆代理人問題

ID

樣本配置

角色扮演認證通過調用 AssumeRole - 擷取扮演角色的臨時身份憑證 實現。配置前,需準備以下內容:

  1. 建立一個 RAM 使用者,並授予 AliyunSTSAssumeRoleAccess 策略(或包含 sts:AssumeRole 許可權的自訂策略)。

  2. 為該 RAM 使用者建立 AccessKey。

  3. 建立一個授信實體為“阿里雲帳號”的 RAM 角色,為其授予要求的權限(如 AliyunOSSFullAccess),並記錄該角色的 ARN。

  4. (可選)編寫一個 RAM 自訂權限原則,用於與角色許可權取交集,以實現更精細的存取控制。

準備完成後,在 provider 塊中進行如下配置:

provider "alicloud" {
  # 用於調用 AssumeRole 的 RAM 使用者的 AccessKey ID
  access_key = "<RAM 使用者的 AccessKey ID>"
  # 用於調用 AssumeRole 的 RAM 使用者的 AccessKey Secret
  secret_key = "<RAM 使用者的 AccessKey Secret>"
  assume_role {
    role_arn           = "<一個 RAM 角色的 ARN>"
    policy             = "<一個 RAM 權限原則的具體內容>"
    session_name       = "<一個自訂的角色會話名稱>"
    session_expiration = <臨時身份訪問憑證的最大有效期間>
  }
}

以下樣本示範了如何通過角色扮演擷取訪問杭州地區 OSS Bucket 列表的許可權。為安全起見,樣本中的 access_key 和 secret_key 通過環境變數設定,未在代碼中明文寫入:

provider "alicloud" {
  # 為了安全起見,此處的 access_key 和 secret_key 已經通過環境變數進行了設定
  region = "cn-hangzhou"
  assume_role {
    role_arn           = "acs:ram::11827xxxxxx:role/tf-assume-role"
    policy             = <<EOF
    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "oss:ListBuckets",
          "Resource": "acs:oss:oss-cn-hangzhou:*:*"
        }
      ]
    }
    EOF
    session_name       = "terraform-assume-role-session"
    session_expiration = 1000
  }
}
說明

運行此樣本前,需確保 tf-assume-role 角色已被授予 AliyunOSSFullAccess 許可權,否則訪問 OSS Bucket 時會因許可權不足而失敗。

如果 Terraform 運行在 ECS 執行個體上,可結合 ECS 服務角色,避免寫入程式碼 AccessKey。此時,只需為綁定到 ECS 執行個體的 RAM 角色授予 AliyunSTSAssumeRoleAccess 策略即可。配置方式如下:

provider "alicloud" {
  ecs_role_name = "<綁定到 ECS 執行個體上的 RAM 角色名稱>"
  region        = "cn-hangzhou"
  assume_role {
    role_arn           = "acs:ram::11827xxxxxx:role/tf-assume-role"
    policy             = <<EOF
    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "oss:ListBuckets",
          "Resource": "acs:oss:oss-cn-hangzhou:*:*"
        }
      ]
    }
    EOF
    session_name       = "terraform-assume-role-session"
    session_expiration = 1000
  }
}

URL憑證

通過訪問一個指定的 URI 來擷取憑證。

參數

參數名稱

說明

樣本值

credentials_url

一個用於擷取憑證的本地或遠程 URI 地址。如果該 URI 未返回 HTTP 200 狀態代碼或返回內容格式不正確,認證將失敗。

http://credentials.uri/

region

預設地區和可用性區域

部分雲產品不支援跨地區訪問,建議將預設地區設定為資源所在地區。

cn-hangzhou

樣本配置

provider "alicloud" {
  region = "cn-hangzhou"
  credentials_url= "http://credentials.uri/"
}

共用設定檔

Terraform 支援通過共用設定檔來使用已配置的訪問憑證。共用設定檔是阿里雲 CLI 產生的 config.json 檔案,可以在一個檔案中配置多種憑證資訊(如靜態 AK、ECS 角色、角色扮演等),並通過 profile 名稱進行引用。更多配置方法,請參見配置憑證

共用設定檔的預設路徑如下:

  • Linux/Mac系統:~/.aliyun/config.json

  • Windows系統: C:\Users\USER_NAME\.aliyun\config.json

配置樣本

在 Terraform 的 provider 配置中,通過 profile 參數指定要使用的憑證配置名稱。如果設定檔不在預設路徑,可通過 shared_credentials_file 參數指定設定檔的絕對路徑。配置樣本如下:

provider "alicloud" {
  region                  = "cn-hangzhou"
  shared_credentials_file = "~/.aliyun/config.json"
  profile                 = "TerraformTest"
}

config.json設定檔樣本:

{
    "current": "<PROFILE_NAME>",
    "profiles": [
        {
            "name": "<PROFILE_NAME>",
            "mode": "AK",
            "access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
            "access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
        },
        {
            "name": "<PROFILE_NAME1>",
            "mode": "StsToken",
            "access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
            "access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
            "sts_token": "<SECURITY_TOKEN>"
        },
        {
            "name": "<PROFILE_NAME2>",
            "mode": "RamRoleArn",
            "access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
            "access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
            "ram_role_arn": "<ROLE_ARN>",
            "ram_session_name": "<ROLE_SESSION_NAME>",
            "expired_seconds": 3600
        },
        {
            "name": "<PROFILE_NAME3>",
            "mode": "EcsRamRole",
            "ram_role_name": "<RAM_ROLE_ARN>"
        },
        {
            "name": "<PROFILE_NAME4>",
            "mode": "External",
            "process_command": "<YOUR_COMMAND>",
            "region_id": "<REGION_ID>",
            "output_format": "json",
            "language": "en"
        },
        {
            "name": "<PROFILE_NAME5>",
            "mode": "OIDC",
            "oidc_provider_arn": "<OIDC_PROVIDER_ARN>",
            "oidc_token_file": "<OIDC_TOKEN_FILE>",
            "ram_role_arn": "<ROLE_ARN>",
            "ram_session_name": "<ROLE_SESSION_NAME>",
            "expired_seconds": 3600
        },
        {
            "name": "<PROFILE_NAME6>",
            "mode": "ChainableRamRoleArn",
            "source_profile": "<PROFILE_NAME>",
            "ram_role_arn": "<ROLE_ARN>",
            "ram_session_name": "<ROLE_SESSION_NAME>",
            "expired_seconds": 3600
        },
        {
            "name": "<PROFILE_NAME7>",
            "mode": "CloudSSO",
            "cloud_sso_sign_in_url": "https://******/login",
            "access_token": "eyJraWQiOiJiYzViMzUwYy******",
            "cloud_sso_access_token_expire": 1754316142,
            "cloud_sso_access_config": "ac-00s1******",
            "cloud_sso_account_id": "151266******"
        },
        {
            "name": "<PROFILE_NAME8>",
            "mode": "OAuth",
            "access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
            "access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
            "sts_token": "<SECURITY_TOKEN>",
            "region_id": "<REGION_ID>",
            "output_format": "json",
            "language": "<zh|en>",
            "sts_expiration": "<STS_EXPIRATION>",
            "oauth_access_token": "<OAUTH_ACCESS_TOKEN>",
            "oauth_refresh_token": "<OAUTH_REFRESH_TOKEN>",
            "oauth_access_token_expire": 1754316142,
            "oauth_site_type": "<CN|EN>"
        }
    ]
}

config.json設定檔中可以通過mode指定不同的憑據:

  • AK:使用使用者的Access Key作為憑據資訊;

  • StsToken:使用STS Token作為憑據資訊;

  • RamRoleArn:使用RAM角色的ARN來擷取憑據資訊;

  • EcsRamRole:利用ECS綁定的RAM角色來擷取憑據資訊;

  • External:通過執行外部程式命令動態擷取憑證;

  • OIDC:通過OIDC ARN和OIDC Token來擷取憑據資訊;

  • ChainableRamRoleArn:採用角色鏈的方式,通過source_profile指定config.json設定檔中其他憑據的名稱,以重新擷取新的憑據資訊;

  • OAuth: 使用CLI通過OAuth登入方式來擷取的憑據資訊;

  • CloudSSO:雲SSO使用者使用阿里雲CLI擷取的憑據資訊。