1

我正在尝试从账户 B 读取账户 A 中的 S3 对象。
我能够在账户 B 中担任角色并检索sts.Credentials对象。

stsClient := sts.New(session.Must(session.NewSession()))
params := &sts.AssumeRoleInput{
    RoleArn:         aws.String(roleArn),
    RoleSessionName: aws.String("role-session-name"),
}
stsResp, err := stsClient.AssumeRole(params)
checkErr(err)
// stsResp.Credentials.AccessKeyId     = ASIA...
// stsResp.Credentials.SecretAccessKey = abc...
// stsResp.Credentials.SessionToken    = xyz...

然后我必须将sts.Credentials对象转换为credentials.Credentials对象才能使用它

s3Client := s3.New(session.Must(session.NewSession()), &aws.Config{Credentials: creds})

但是,当我这样做时:

creds := credentials.NewStaticCredentials(*stsResp.Credentials.AccessKeyId, *stsResp.Credentials.SecretAccessKey, *stsResp.Credentials.SessionToken)

creds由于某种原因是一个指向空credentials.Credentials对象的指针:

&{creds:{AccessKeyID: SecretAccessKey: SessionToken: ProviderName:} forceRefresh:true m:{state:0 sema:0} provider:0xc4201a2840}

我也试过:

values, err := creds.Get()
checkErr(err)
fmt.Println(values) // prints out credentials values as expected

所以,我不太清楚为什么credentials.NewStaticCredentials()返回一个空的凭证对象。

4

1 回答 1

3

当打印出您看到的打印credentials.Credentials值返回credentials.NewStaticCredentials()的值时,缓存的 AWS 凭证存储在尚未填充的类型中。调用时填充此字段。在调用 Get 之前该值无效。credsCredentialsCredentials.Get

NewStaticCredentials创建一个StaticProvider满足Provider接口的值。该Credentials类型将使用该Provider.Retrieve()方法Values从 Provider 检索最新的凭证。该Credentials类型将缓存creds响应,Retrieve()直到Provider将凭据标记为expiredStaticProvider在凭据永不过期的情况下。

这就是为什么creds.Get()返回值没有错误。如果您在被调用creds后打印,Get您会在类型中看到缓存的静态值Credentials

于 2017-04-02T16:26:55.223 回答