使用Go SDK发起MaxCompute请求前,您需要配置访问凭证,即初始化凭证提供者,阿里云服务会通过访问凭证验证您的身份信息和访问权限。MaxCompute支持以多种方式配置访问凭证,您可以根据使用场景对认证和授权的要求,选择对应的方式。
前提条件
已安装Go SDK,安装方法请参见安装Go SDK。
访问凭证配置方式对比
访问凭证配置方式 | 适用场景 | 是否需要提供前置的AK或STS Token | 底层实现所依赖的凭证 | 凭证有效期 | 凭证轮转或刷新方式 |
部署运行在安全、稳定且不易受外部攻击的环境的应用程序,无需频繁轮转凭证就可以长期访问云服务。 | 是 | AK | 长期 | 手动轮转 | |
部署运行在不可信的环境的应用程序,希望能控制访问的有效期、权限。 | 是 | STS Token | 临时 | 手动刷新 | |
需要授权访问云服务,例如跨阿里云账号访问云服务的应用程序。 | 是 | STS Token | 临时 | 自动刷新 | |
部署运行在阿里云的ECS实例、ECI实例、容器服务Kubernetes版的Worker节点中的应用程序。 | 否 | STS Token | 临时 | 自动刷新 | |
需要通过外部系统获取访问凭证的应用程序。 | 否 | STS Token | 临时 | 自动刷新 | |
如果以上凭证配置方式都不满足要求时,您可以采用自定义获取凭证的方式。 | 自定义 | STS Token | 自定义 | 自定义 |
方式一:使用AK
如果您的应用程序部署运行在安全、稳定且不易受外部攻击的环境中,需要长期访问您的MaxCompute,且不能频繁轮转凭证时,您可以使用阿里云账号(主账号)或RAM用户的AK(AccessKey ID、AccessKey Secret)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个AK,存在安全性风险和维护复杂度增加的风险。如何获取AK,请参见CreateAccessKey - 创建主账号或RAM用户访问密钥。
环境变量
添加credentials依赖。
go get github.com/aliyun/credentials-go/credentials
使用AK设置环境变量。
macOS X/Linux/Unix系统:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
Windows系统:
set ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
使用环境变量来传递凭证信息。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main() { // 从环境变量中读取AK信息: “ALIBABA_CLOUD_ACCESS_KEY_ID” 和 “ALIBABA_CLOUD_ACCESS_KEY_SECRET” credential, err := credentials.NewCredential(nil) if err != nil { return } aliyunAccount := account.NewStsAccountWithCredential(credential) // 获取具体的endpoint,此处以杭州为例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 默认的MaxCompute项目 defaultProject := "" odpsIns := odps.NewOdps(aliyunAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
配置文件
创建后缀名为
.ini
的文件,如config.ini。示例如下:重要该文件中,键值对中的值后面不能加注释。
[odps] access_id = "" access_key = "" endpoint = "" project = ""
使用配置文件传递配置信息。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "log" ) func main() { // 配置文件路径 configPath := "./config.ini" conf, err := odps.NewConfigFromIni(configPath) if err != nil { log.Fatalf("%+v", err) } aliAccount := account.NewAliyunAccount(conf.AccessId, conf.AccessKey) odpsIns := odps.NewOdps(aliAccount, conf.Endpoint) // 设置默认的MaxCompute项目 odpsIns.SetDefaultProjectName(conf.ProjectName) fmt.Printf("odps:%#v\n", odpsIns) }
方式二:使用STS Token
如果您的应用程序需要临时访问MaxCompute,您可以使用通过STS服务获取的临时身份凭证(AccessKey ID、AccessKey Secret和Security Token)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个STS Token,存在安全性风险和维护复杂度增加的风险。此外,如果您需要多次临时访问MaxCompute,需要手动刷新STS Token。如何获取STS Token,请参见AssumeRole - 获取扮演角色的临时身份凭证。
环境变量
添加credentials依赖。
go get github.com/aliyun/credentials-go/credentials
使用AK设置环境变量。
macOS X/Linux/Unix系统:
export ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> export ALIBABA_CLOUD_SECURITY_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
Windows系统:
set ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID> set ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET> set ALIBABA_CLOUD_SECURITY_TOKEN=<ALIBABA_CLOUD_SECURITY_TOKEN>
使用环境变量来传递凭证信息。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main() { // 从环境变量中读取AK信息: "ALIBABA_CLOUD_ACCESS_KEY_ID","ALIBABA_CLOUD_ACCESS_KEY_SECRET", "ALIBABA_CLOUD_SECURITY_TOKEN" credential, err := credentials.NewCredential(nil) if err != nil { return } aliyunAccount := account.NewStsAccountWithCredential(credential) // 获取具体的endpoint,此处以杭州为例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 默认的MaxCompute项目 defaultProject := "" odpsIns := odps.NewOdps(aliyunAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
配置文件
创建后缀名为
.ini
的文件,如config.ini。示例如下:重要该文件中,键值对中的值后面不能加注释。
[odps] access_id = "" access_key = "" sts_token = "" endpoint = "" project = ""
使用配置文件来传递配置信息。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "log" ) func main() { // 配置文件路径 configPath := "./config.ini" conf, err := odps.NewConfigFromIni(configPath) if err != nil { log.Fatalf("%+v", err) } aliAccount := account.NewAliyunAccount(conf.AccessId, conf.AccessKey) odpsIns := odps.NewOdps(aliAccount, conf.Endpoint) // 设置默认的MaxCompute项目 odpsIns.SetDefaultProjectName(conf.ProjectName) fmt.Printf("odps:%#v\n", odpsIns) }
方式三:使用RAMRoleARN
如果您的应用程序需要授权访问MaxCompute(例如跨阿里云账号访问OSS),您可以使用RAMRoleARN初始化凭证提供者。该方式底层实现是STS Token。通过指定RAM角色的ARN(Alibabacloud Resource Name),Credentials工具会前往STS服务获取STS Token,并在会话到期前自动刷新STS Token。此外,您还可以通过为Policy赋值来限制RAM角色到一个更小的权限集合。需要注意的是,该方式需要您提供一个AK或STS Token,存在安全性风险和维护复杂度增加的风险。如何获取AK或STS Token,请参见CreateAccessKey - 为RAM用户创建访问密钥或AssumeRole - 获取扮演角色的临时身份凭证。如何获取RAMRoleARN,请参见CreateRole - 创建角色。
添加credentials依赖。
go get github.com/aliyun/credentials-go/credentials
配置访问凭证。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" "log" ) func main() { // 先获取AK信息 accessKeyId := "" accessKeySecret := "" config := new(credentials.Config). // 所需的凭证类型 SetType("ram_role_arn"). // 云账号的Accesskey ID SetAccessKeyId(accessKeyId). // 云账号的Accesskey Secret SetAccessKeySecret(accessKeySecret). // RoleArn格式: acs:ram::USER_Id:role/ROLE_NAME SetRoleArn("RoleArn"). // RoleSession名称 SetRoleSessionName("RoleSessionName"). // 非必需,限制STS Token的权限 SetPolicy("Policy"). // 非必需, 限制STS Token的有效期 SetRoleSessionExpiration(3600) credential, err := credentials.NewCredential(config) if err != nil { log.Fatalf("%+v", err) } stsAccount := account.NewStsAccountWithCredential(credential) // 获取具体的endpoint,此处以杭州为例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 默认的MaxCompute项目 defaultProject := "" odpsIns := odps.NewOdps(stsAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
方式四:使用ECSRAMRole
如果您的应用程序运行在ECS实例、ECI实例、容器服务Kubernetes版的Worker节点中,建议您使用ECSRAMRole初始化凭证提供者。该方式底层实现是STS Token。ECSRAMRole允许您将一个角色关联到ECS实例、ECI实例或容器服务 Kubernetes 版的Worker节点,实现在实例内部自动刷新STS Token。该方式无需您提供一个AK或STS Token,消除了手动维护AK或STS Token的风险。如何获取ECSRAMRole,请参见CreateRole - 创建角色。
添加credentials依赖。
go get github.com/aliyun/credentials-go/credentials
配置ECSRAMRole作为访问凭证。
package main import ( "fmt" "log" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main(){ config := new(credentials.Config). // 凭证类型 SetType("ecs_ram_role"). // “roleName” 为可选值. 如果未设置,将进行自动检索。强烈建议对其进行设置以减少请求 SetRoleName("RoleName"). // “DisableIMDSv1”为可选值,建议打开。可以通过设置环境变量来替换它: ALIBABA_CLOUD_IMDSV1_DISABLED SetDisableIMDSv1(true) credential, err := credentials.NewCredential(config) if err != nil { log.Fatalf("%+v", err) } stsAccount := account.NewStsAccountWithCredential(credential) // 获取具体的endpoint,此处以杭州为例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 默认的MaxCompute项目 defaultProject := "" odpsIns := odps.NewOdps(stsAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
方式五:使用CredentialsURI
如果您的应用程序需要通过外部系统获取阿里云凭证,从而实现灵活的凭证管理和无密钥访问,您可以使用CredentialsURI初始化凭证提供者。该方式底层实现是STS Token。Credentials工具通过您提供的URI获取STS Token,完成凭证客户端初始化。该方式无需您提供一个AK或STS Token,消除了手动维护AK或STS Token的风险。需要注意的是,提供CredentialsURI响应的后端服务需要实现STS Token的自动刷新逻辑,确保您的应用程序始终能获取到有效凭证。
为了使Credentials工具正确解析和使用STS Token,URI必须遵循以下响应协议:
响应状态码:200
响应体结构:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2024-10-09T16:39:33Z", "SecurityToken": "SecurityToken" }
添加credentials依赖。
go get github.com/aliyun/credentials-go/credentials
配置CredentialsURI作为访问凭证。
package main import ( "fmt" "github.com/aliyun/aliyun-odps-go-sdk/odps" "github.com/aliyun/aliyun-odps-go-sdk/odps/account" "github.com/aliyun/credentials-go/credentials" ) func main() { config := new(credentials.Config).SetType("credentials_uri").SetURLCredential("<yourCredentialsURI>") credential, err := credentials.NewCredential(config) if err != nil { return } stsAccount := account.NewStsAccountWithCredential(credential) // 获取具体的endpoint,此处以杭州为例 endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api" // 默认的MaxCompute项目 defaultProject := "" odpsIns := odps.NewOdps(stsAccount, endpoint) odpsIns.SetDefaultProjectName(defaultProject) fmt.Printf("odps:%#v\n", odpsIns) }
方式六:自定义访问凭证
若以上凭证配置方式都不满足要求,您还可以通过实现Credential Providers接口的方式,来自定义凭证提供方式。
package main
import (
"fmt"
"github.com/aliyun/aliyun-odps-go-sdk/odps"
"github.com/aliyun/aliyun-odps-go-sdk/odps/account"
"github.com/aliyun/credentials-go/credentials"
)
type CustomCredentialProvider struct {
}
func (cp *CustomCredentialProvider) GetType() (*string, error) {
s := "CustomProvider"
return &s, nil
}
func (cp *CustomCredentialProvider) GetCredential() (*credentials.CredentialModel, error) {
accessKeyId := ""
accessKeySecurity := ""
accessKeyToken := ""
return &credentials.CredentialModel{
AccessKeyId: &accessKeyId,
AccessKeySecret: &accessKeyToken,
SecurityToken: &accessKeySecurity,
}, nil
}
func main() {
provider := &CustomCredentialProvider{}
stsAccount := account.NewStsAccountWithProvider(provider)
// 获取具体的endpoint,此处以杭州为例
endpoint := "http://service.cn-hangzhou.maxcompute.aliyun.com/api"
// 默认的MaxCompute项目
defaultProject := ""
odpsIns := odps.NewOdps(stsAccount, endpoint)
odpsIns.SetDefaultProjectName(defaultProject)
fmt.Printf("odps:%#v\n", odpsIns)
}
下一步
配置完访问凭证后,您可初始化MaxCompute SDK。具体操作,请参见初始化MaxCompute SDK。