如何在aws中使用web标识令牌来使用go sdk进行身份验证

ss2ws0br  于 2023-04-18  发布在  Go
关注(0)|答案(2)|浏览(109)

我正在尝试编写一个示例,说明如何将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()与凭据信息,但没有运气.可以一些帮助分享提示什么是出了问题,正确的做法.

b1payxdu

b1payxdu1#

使用的instance-id应该在区域中可用,否则它返回一个空map,err == nil。

0g0grzrc

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):

  • config/env_config.go
  • config/resolve_credentials.go

这让我想到了以下几点:

import (
  "github.com/aws/aws-sdk-go-v2/config"
  "github.com/aws/aws-sdk-go-v2/service/ec2"
)

cfg, _ := config.LoadDefaultConfig(context.Background(), config.WithRegion("us-west-1))

client := ec2.NewFromConfig(&cfg)

使用client获取所需的任何数据-文件中的令牌将用于承担角色,临时角色凭据将用于请求。

相关问题