为什么NewStaticCredentials返回空白的凭据对象?

时间:2017-03-25 05:31:10

标签: aws-sdk-go

我正在尝试从帐户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()返回一个空的凭证对象。

1 个答案:

答案 0 :(得分:3)

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

NewStaticCredentials将创建满足StaticProvider界面的Provider值。 Credentials类型将使用Provider.Retrieve()方法从提供商处检索最新凭据ValuesCredentials类型会缓存来自creds的{​​{1}}响应,直到Retrieve()将凭据标记为expired。在Provider的情况下,凭据永不过期。

这就是StaticProvider返回值而没有错误的原因。如果您在调用creds.Get()后打印creds,则会在Get类型中看到缓存的静态值。