4、AWS SDK for Go-session使用

公冶和豫
2023-12-01

session使用注意事项

在适用于 Go 的 AWS 开发工具包中,会话是一个对象,其中包含服务客户端的配置信息。用于与 AWS 服务进行交互。例如,会话可以包含有关将发送请求的区域、要使用的凭据或其他请求处理程序的信息。无论何时创建服务客户端,都必须指定会话。有关会话的更多信息,请参阅 AWS SDK for Go API 参考中的会话包。

会话可以在共享相同基本配置的所有服务客户端之间共享。会话是根据 SDK 的默认配置和请求处理程序构建的。

您应该尽可能缓存会话。这是因为每次创建新会话时,都会从环境和配置文件中加载所有配置值。在所有服务客户端之间共享会话值可确保加载配置的次数最少。

并发

只要会话没有被修改,会话就可以安全地并发使用。创建会话后,SDK 不会修改会话。从共享会话同时创建服务客户端是安全的。

具有共享配置文件的会话

使用前面的方法,您可以创建仅在AWS_SDK_LOAD_CONFIG设置了环境变量的情况下加载附加配置文件的会话。或者,您可以显式创建启用共享配置的会话。为此,您可以使用 NewSessionWithOptions配置会话的创建方式。使用 NewSessionWithOptionswith SharedConfigStateset to SharedConfigEnable将创建会话,就像AWS_SDK_LOAD_CONFIG 设置了环境变量一样。

创建会话

创建 时session,您可以传入aws.Config覆盖默认值或覆盖当前配置值的可选值。这允许您根据需要提供额外的或基于案例的配置。

默认情况下NewSession,仅从共享凭据文件 ( ~/.aws/credentials) 加载凭据。如果AWS_SDK_LOAD_CONFIG环境变量设置为真值,则会话是根据共享配置 ( ~/.aws/config) 和共享凭证 ( ~/.aws/credentials) 文件中的配置值创建的。有关详细信息,请参阅具有共享配置文件的会话。

使用默认配置和请求处理程序创建会话。以下示例使用来自环境变量或共享凭证文件的凭证、区域和配置文件值创建会话。它要求AWS_PROFILE设置或default 使用。

sess, err := session.NewSession()

SDK 提供所有会话都使用的默认配置,除非您覆盖某个字段。例如,您可以在使用aws.Configstruct 创建会话时指定 AWS 区域。有关您可以指定的字段的更多信息,请参阅 AWS SDK for Go API 参考中的aws.Config。

sess, err := session.NewSession(&aws.Config{
    Region: aws.String("us-east-2")},
)

从会话创建 Amazon S3 客户端实例:

sess, err := session.NewSession()
if err != nil {
    // Handle Session creation error
}
svc := s3.New(sess)

使用选项覆盖创建会话

此外NewSession,您还可以使用 NewSessionWithOptions. 此函数允许您控制和覆盖如何通过代码创建会话,而不是仅由环境变量驱动。

当您想要提供配置文件或覆盖共享凭证状态 ( )时,请使用

NewSessionWithOptions 。AWS_SDK_LOAD_CONFIG

// Equivalent to session.New
sess, err := session.NewSessionWithOptions(session.Options{})

// Specify profile to load for the session's config
sess, err := session.NewSessionWithOptions(session.Options{
    Profile: "profile_name",
})

// Specify profile for config and region for requests
sess, err := session.NewSessionWithOptions(session.Options{
    Config: aws.Config{Region: aws.String("us-east-2")},
    Profile: "profile_name",
})

// Force enable Shared Config support
sess, err := session.NewSessionWithOptions(session.Options{
    SharedConfigState: SharedConfigEnable,
})

// Assume an IAM role with MFA prompting for token code on stdin
sess := session.Must(session.NewSessionWithOptions(session.Options{
    AssumeRoleTokenProvider: stscreds.StdinTokenProvider,
    SharedConfigState: SharedConfigEnable,
}))

已弃用New

该New函数已被弃用,因为它没有提供返回加载配置文件和值时发生的错误的好方法。因此, NewSession已创建,因此可以在创建会话失败时检索错误。

共享配置字段

默认情况下,SDK 从共享凭证文件加载凭证 ~/.aws/credentials。任何其他配置值由环境变量、SDK 默认值和用户提供的aws.config值提供。

如果AWS_SDK_LOAD_CONFIG设置了环境变量,或者使用SharedConfigEnable选项来创建会话(如下例所示),则还会从共享配置文件 ( ~/.aws/config) 中加载其他配置信息(如果存在)。如果两个文件之间的任何配置设置值不同,则共享凭证文件 ( ~/.aws/credentials) 中的值优先。

sess := session.Must(session.NewSessionWithOptions(session.Options{
    SharedConfigState: session.SharedConfigEnable,
}))

有关共享凭据设置的更多信息,请参阅会话包的文档。

环境变量

创建会话时,您可以设置多个环境变量来调整 SDK 的运行方式以及创建会话时加载的配置数据。环境值是可选的。对于凭证,您必须同时设置访问密钥和秘密访问密钥。否则,Go 会忽略你设置的那个。除非另有说明,否则所有环境变量值都是字符串。

有关环境变量设置的更多信息,请参阅会话包的文档。

添加请求处理程序

您可以将处理程序添加到会话以处理 HTTP 请求。所有使用会话的服务客户端都会继承处理程序。例如,以下处理程序记录服务客户端发出的每个请求及其有效负载。

// Create a session, and add additional handlers for all service
// clients created with the Session to inherit. Adds logging handler.
sess, err := session.NewSession()
sess.Handlers.Send.PushFront(func(r *request.Request) {
    // Log every request made and its payload
    logger.Println("Request: %s/%s, Payload: %s",
        r.ClientInfo.ServiceName, r.Operation, r.Params)
})

复制会话

您可以使用Copy 方法创建会话的副本。当您想要创建具有相似设置的多个会话时,复制会话非常有用。每次复制会话时,您都可以为任何字段指定不同的值。例如,以下代码片段在将字段sess覆盖到时复制会话 :Regionus-east-2

usEast2Sess := sess.Copy(&aws.Config{Region: aws.String("us-east-2")})

示例代码

package main

import (
	"fmt"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
	"github.com/aws/aws-sdk-go/service/s3/s3manager"
	"os"
)

var (
	accessKey = "xxx"
	secretKey = "xxx" 
	region    = "oss-cn-beijing"
	endpoint  = "oss-cn-beijing.aliyuncs.com"
)

func main() {
	//只要不修改session,session就可以安全的并发使用。
	sess, err := session.NewSession(&aws.Config{
		Credentials: credentials.NewStaticCredentials(accessKey, secretKey, ""),
		Endpoint:    aws.String(endpoint),
		Region:      aws.String(region),
		//minio:true,oss:false
		S3ForcePathStyle: aws.Bool(false),
		//SDK 支持使用客户端 TLS 证书配置的环境和会话选项,这些证书作为客户端 TLS 握手的一部分发送以进行客户端身份验证。
		//如果使用,则需要 Cert 和 Key 值。如果缺少一个,或者无法加载文件的内容,则会返回一个错误。
		//ClientTLSCert:              nil,
		//ClientTLSKey:               nil,
	})
	if err != nil {
		panic(err)
	}
	//使用 New 函数创建新的服务客户端。
	//使用该客户端,您可以向服务发出 API 请求。
	//这些客户端可以安全地并发使用。
	svc := s3.New(sess)
	fmt.Println("Endpoint:", *svc.Config.Endpoint)
	fmt.Println("S3ForcePathStyle:", *svc.Config.S3ForcePathStyle)
	fmt.Println("Region:", *svc.Config.Region)
	fmt.Println("-------------------------------")

	//复制会话
	//想要创建具有相似设置的多个会话时,复制会话非常有用。每次复制会话时,您都可以为任何字段指定不同的值。例如,以下代码片段在将字段sess覆盖到时复制会话 :Regionus-east-2
	usEast2Sess := sess.Copy(&aws.Config{Region: aws.String("us-east-2")})
	fmt.Println("usEast2Sess Endpoint:", *usEast2Sess.Config.Endpoint)
	fmt.Println("usEast2Sess S3ForcePathStyle:", *usEast2Sess.Config.S3ForcePathStyle)
	fmt.Println("usEast2Sess Region:", *usEast2Sess.Config.Region)

}
 类似资料: