登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-05-01 22:06:34 112浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《如何在aws中使用web识别令牌来使用go sdk进行身份验证》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

我正在尝试编写一个示例,说明如何将 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)
}

结果的值为空。然而,我已将 (credvalue.accesskeyid、credvalue.secretaccesskey、credvalue.sessiontoken) 导出为环境变量,并且 aws cli 为我提供与描述实例相关的输出。

我尝试了各种方法,例如 credentials.newstaticcredentials() 和凭据信息,但没有运气。有人可以帮忙分享一下出了什么问题以及正确的处理方法吗?


正确答案


这方面的文档非常差。 pod configuration guide中有1句话关于使用支持的aws sdk版本(提到的环境变量是由于pod配置了服务帐户而由webhook注入的环境变量):

然后在列出 supported SDK versions 的页面上:

这表明 sdk 能够检测环境变量,我在查看 sdk 代码中的相关模块后发现确实如此(注意我使用的是 aws-go-v2):

这让我得出以下结论:

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 获取您需要的任何数据 - 文件中的令牌将用于承担角色,临时角色凭据将用于请求。

好了,本文到此结束,带大家了解了《如何在aws中使用web识别令牌来使用go sdk进行身份验证》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>