配置访问凭证

使用Go SDK发起MaxCompute请求前,您需要配置访问凭证,即初始化凭证提供者,阿里云服务会通过访问凭证验证您的身份信息和访问权限。MaxCompute支持以多种方式配置访问凭证,您可以根据使用场景对认证和授权的要求,选择对应的方式。

前提条件

已安装Go SDK,安装方法请参见安装Go SDK

访问凭证配置方式对比

访问凭证配置方式

适用场景

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

底层实现所依赖的凭证

凭证有效期

凭证轮转或刷新方式

方式一:使用AK

部署运行在安全、稳定且不易受外部攻击的环境的应用程序,无需频繁轮转凭证就可以长期访问云服务。

AK

长期

手动轮转

方式二:使用STS Token

部署运行在不可信的环境的应用程序,希望能控制访问的有效期、权限。

STS Token

临时

手动刷新

方式三:使用RAMRoleARN

需要授权访问云服务,例如跨阿里云账号访问云服务的应用程序。

STS Token

临时

自动刷新

方式四:使用ECSRAMRole

部署运行在阿里云的ECS实例、ECI实例、容器服务Kubernetes版的Worker节点中的应用程序。

STS Token

临时

自动刷新

方式五:使用CredentialsURI

需要通过外部系统获取访问凭证的应用程序。

STS Token

临时

自动刷新

方式六:自定义访问凭证

如果以上凭证配置方式都不满足要求时,您可以采用自定义获取凭证的方式。

自定义

STS Token

自定义

自定义

方式一:使用AK

如果您的应用程序部署运行在安全、稳定且不易受外部攻击的环境中,需要长期访问您的MaxCompute,且不能频繁轮转凭证时,您可以使用阿里云账号(主账号)或RAM用户的AK(AccessKey ID、AccessKey Secret)初始化凭证提供者。需要注意的是,该方式需要您手动维护一个AK,存在安全性风险和维护复杂度增加的风险。如何获取AK,请参见CreateAccessKey - 创建主账号或RAM用户访问密钥

环境变量

  1. 添加credentials依赖。

    go get github.com/aliyun/credentials-go/credentials
  2. 使用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>
  3. 使用环境变量来传递凭证信息。

    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)
    }

配置文件

  1. 创建后缀名为.ini的文件,如config.ini。示例如下:

    重要

    该文件中,键值对中的值后面不能加注释。

    [odps]
    access_id = ""
    access_key = ""
    endpoint = ""
    project = ""
  2. 使用配置文件传递配置信息。

    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 - 获取扮演角色的临时身份凭证

环境变量

  1. 添加credentials依赖。

    go get github.com/aliyun/credentials-go/credentials
  2. 使用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>
  3. 使用环境变量来传递凭证信息。

    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)
    }

配置文件

  1. 创建后缀名为.ini的文件,如config.ini。示例如下:

    重要

    该文件中,键值对中的值后面不能加注释。

    [odps]
    access_id = ""
    access_key = ""
    sts_token = ""
    endpoint = ""
    project = ""
  2. 使用配置文件来传递配置信息。

    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 - 创建角色

  1. 添加credentials依赖。

    go get github.com/aliyun/credentials-go/credentials
  2. 配置访问凭证。

    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 - 创建角色

  1. 添加credentials依赖。

    go get github.com/aliyun/credentials-go/credentials
  2. 配置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的自动刷新逻辑,确保您的应用程序始终能获取到有效凭证。

  1. 为了使Credentials工具正确解析和使用STS Token,URI必须遵循以下响应协议:

    • 响应状态码:200

    • 响应体结构:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2024-10-09T16:39:33Z",
          "SecurityToken": "SecurityToken"
      }
  2. 添加credentials依赖。

    go get github.com/aliyun/credentials-go/credentials
  3. 配置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