我正在尝试从帐户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()
返回一个空的凭证对象。
答案 0 :(得分:3)
打印出credentials.NewStaticCredentials()
返回的credentials.Credentials
值时,您看到的creds
值是存储在尚未填充的Credentials
类型中的缓存AWS凭据。调用Credentials.Get
时会填充此字段。在Get被调用之前,该值无效。
NewStaticCredentials
将创建满足StaticProvider
界面的Provider
值。 Credentials
类型将使用Provider.Retrieve()
方法从提供商处检索最新凭据Values
。 Credentials
类型会缓存来自creds
的{{1}}响应,直到Retrieve()
将凭据标记为expired。在Provider
的情况下,凭据永不过期。
这就是StaticProvider
返回值而没有错误的原因。如果您在调用creds.Get()
后打印creds
,则会在Get
类型中看到缓存的静态值。