【问题标题】:How to Assume Cross-Account Role?如何承担跨账户角色?
【发布时间】:2021-10-15 02:00:19
【问题描述】:

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 的文档有一些不足之处。

【问题讨论】:

  • 不作为答案发布,因为我不确定在这种特定情况下,但我过去使用 AWS 开发工具包和临时凭证的经验表明您需要在启动时创建客户端,如果/当它停止工作时,然后创建一个新客户端。每个请求都比需要的更频繁,但在启动时创建的请求可能不会永远有效。

标签: go aws-sdk aws-sdk-go


【解决方案1】:
roleArn := "arn:aws:iam::1234567890:role/my-role"
awsSession, _ := session.NewSession(&aws.Config{
    Region: aws.String("us-west-2"),
})

stsClient := sts.New(awsSession)
stsRequest := sts.AssumeRoleInput{
    RoleArn:         aws.String(roleArn),
    RoleSessionName: aws.String("my-role-test"),
    DurationSeconds: aws.Int64(900), //min allowed
}

stsResponse, err := stsClient.AssumeRole(&stsRequest)

if err != nil {
    log.Fatal("an exception occurred when attempting to assume the my role. error=" + err.Error())
}

os.Setenv("AWS_ACCESS_KEY_ID", *stsResponse.Credentials.AccessKeyId)
os.Setenv("AWS_SECRET_ACCESS_KEY", *stsResponse.Credentials.SecretAccessKey)
os.Setenv("AWS_SESSION_TOKEN", *stsResponse.Credentials.SessionToken)
os.Setenv("AWS_SECURITY_TOKEN", *stsResponse.Credentials.SessionToken)
os.Setenv("ASSUMED_ROLE", roleArn)

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2017-03-16
    相关资源
    最近更新 更多