我正在尝试编写一个示例,说明如何将Web身份令牌与容器一起使用来执行EC2操作。容器规范包含服务帐户,并具有访问令牌路径的必要权限,其命名空间是角色中的受信任实体。
package main
import (
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/credentials/stscreds"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/aws/aws-sdk-go/service/sts"
)
func main() {
sess, _ := session.NewSession()
config := aws.NewConfig().WithRegion("us-east-1")
stsSTS := sts.New(sess)
roleARN := "arn:aws:iam::1234567:role/s2-p0o5-csi-drivers-ebs-cloud-credentials"
roleProvider := stscreds.NewWebIdentityRoleProviderWithOptions(stsSTS, roleARN, "gosession", stscreds.FetchTokenPath("/build/token"))
creds := credentials.NewCredentials(roleProvider)
credValue, _ := roleProvider.Retrieve()
fmt.Printf("credValue.AccessKeyID: %v\n", credValue.AccessKeyID)
fmt.Printf("credValue.SecretAccessKey: %v\n", credValue.SecretAccessKey)
fmt.Printf("credValue.SessionToken: %v\n", credValue.SessionToken)
config = config.WithCredentials(creds)
nodeID := "i-00843f27cfeb0beff"
svc := ec2.New(sess, config)
request := &ec2.DescribeInstancesInput{
InstanceIds: []*string{&nodeID},
}
result, _ := svc.DescribeInstances(request)
fmt.Printf("result: %v\n", result)
}
result的值为空。然而,我已经导出了(credValue.AccessKeyID,credValue.SecretAccessKey,credValue.SessionToken)作为环境变量,aws cli给了我与描述示例相关的输出。
我尝试了各种方法,如credentials.NewStaticCredentials()
与凭据信息,但没有运气.可以一些帮助分享提示什么是出了问题,正确的做法.
2条答案
按热度按时间b1payxdu1#
使用的instance-id应该在区域中可用,否则它返回一个空map,err == nil。
0g0grzrc2#
这方面的文档很差,pod configuration guide中有一句话是关于使用支持的AWS SDK版本的(提到的环境变量是由于pod配置了服务帐户而由webhook注入的):
受支持的AWS SDK版本首先在凭据链提供程序中查找这些环境变量。
然后在列出supported SDK versions的页面上:
当为服务帐户使用IAM角色时,Pod中的容器必须使用支持通过OpenID Connect Web身份令牌文件承担IAM角色的AWS SDK版本。
这表明SDK能够检测env变量,我在查看SDK代码中的相关模块后发现了这种情况(注意我使用的是aws-go-v2):
这让我想到了以下几点:
使用
client
获取所需的任何数据-文件中的令牌将用于承担角色,临时角色凭据将用于请求。