AWS' Golang SDK说我应该使用stscreds.AssumeRoleProvider
来承担跨帐户角色(在这种情况下,用于从Web服务器查询另一个帐户的DynamoDb表)。此代码有效:
var sess *session.Session
func init() {
sess = session.Must(session.NewSession(&aws.Config{
Region: aws.String("us-west-2"),
}))
}
func getDynamoDbClient() *dynamodb.DynamoDB {
crossAccountRoleArn := "arn:...:my-cross-account-role-ARN"
creds := stscreds.NewCredentials(sess, crossAccountRoleArn, func(arp *stscreds.AssumeRoleProvider) {
arp.RoleSessionName = "my-role-session-name"
arp.Duration = 60 * time.Minute
arp.ExpiryWindow = 30 * time.Second
})
dynamoDbClient := dynamodb.New(sess, aws.NewConfig().WithCredentials(creds))
return dynamoDbClient
}
根据文档,返回的客户端是线程安全的:
DynamoDB方法可以安全地同时使用。
问题是,由于凭证是通过stscreds.AssumeRoleProvider
自动续订的,我是否
需要在每个请求中新建一个新客户端(以确保我有未过期的凭据)或
我可以在Web服务器启动时新建一个DynamoDb客户端,并在Web服务器的生命周期内重复使用它吗?
我深入研究了Golang AWS SDK的源代码,看起来stscreds.NewCredentials()
返回的凭据只不过是对stscreds.AssumeRoleProvider
的引用的包装。因此,我觉得客户端可能会神奇地获得自动续订的凭据。
AWS'文档留下了一些需要的东西。