在适用于 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函数已被弃用,因为它没有提供返回加载配置文件和值时发生的错误的好方法。因此, 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)
}