Terraform 身份认证
阿里云 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获取的凭据信息。