阿里雲 Terraform Provider 支援多種身份認證方式,其選擇需綜合考慮 Terraform 的運行環境與應用情境。
認證方式優先順序
配置阿里雲 Provider 時,通常只需選擇一種身份認證方式。Terraform Provider 會按以下順序尋找身份憑證,一旦匹配成功,即停止尋找:
靜態配置:優先讀取 provider 塊中顯式指定的 access_key、secret_key、security_token 或 ecs_role_name。
環境變數:若無靜態配置,則讀取系統內容變數(如 ALICLOUD_ACCESS_KEY、ALICLOUD_SECRET_KEY 等)。
共用設定檔:
靜態配置:從本地共用設定檔中讀取指定 profile 的認證資訊,如AK/SK、ram_role_arn、ram_role_name、sts_token等。
進階配置:若共用設定檔中無靜態配置,但配置了 CloudSSO、OAuth、外部程式(External)或鏈式角色(ChainableRamRoleArn),則調用相應外掛程式擷取臨時STS憑證。
URL 憑證:若以上皆為空白,則嘗試從 credentials_uri 指定的地址拉取憑證。
安全性建議
為提高生產環境的安全性,推薦使用以下基於臨時憑證的認證方式:
ECS 執行個體 RAM 角色
RAM 角色扮演(AssumeRole)
OIDC 身份供應商角色扮演
這些方式具有以下安全優勢:
避免在配置中寫入程式碼或暴露長期有效 AccessKey,從而降低密鑰泄露風險。
通過固定有效期間限制許可權的暴露視窗。
精細化授權支援
當需要根據應用、團隊或專案等維度對資源存取權限進行精細化管控時,可使用 RAM 角色扮演和 OIDC 身份供應商角色扮演。通過為不同的 Terraform 工作負載綁定專屬的角色及權限原則,以遵循最小許可權原則。
Terraform 身份認證方式
阿里雲 Terraform Provider 提供以下身份認證方式:
認證方式 | 使用說明 | 適應情境 |
(access_key) | 將 AccessKey (AK) 明文定義在設定檔中,或通過參數傳入。 |
|
(ALIBABA_CLOUD_ACCESS_KEY) | 從環境變數中讀取 AK 資訊。 |
|
(ecs_role_name) | 從 ECS 執行個體的中繼資料(Metadata)中擷取其綁定的 RAM 角色對應的訪問憑證。 | Terraform 運行在 ECS 執行個體中。 |
OIDC角色扮演(assume_role_with_oidc) | 通過 OIDC 角色扮演換取訪問憑證。 | Terraform 運行在支援 OIDC 的 Kubernetes 叢集中(如阿里雲 ACK)。 |
(assume_role) | 通過扮演 RAM 角色換取訪問憑證。 |
|
(credentials_uri) | 指定一個 URI 地址,通過訪問該地址擷取臨時憑證。 | 從自訂的憑證服務(API 或檔案)中擷取憑證。 |
(profile) | 支援多種認證方式通過阿里雲 CLI 配置到統一的檔案中,通過指定 profile 的名稱來擷取訪問憑證。目前支援的認證方式有:
|
|
共用設定檔
Terraform 支援通過共用設定檔來使用已配置的訪問憑證。共用設定檔是阿里雲 CLI 產生的 config.json 檔案,可以在一個檔案中配置多種憑證資訊(如靜態 AK、ECS 角色、角色扮演等),並通過 profile 名稱進行引用。更多配置方法,請參見配置憑證。
共用設定檔的預設路徑如下:
Linux/Mac系統:
~/.aliyun/config.jsonWindows系統:
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擷取的憑據資訊。