亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 AWS SDK Go 從 Fargate 任務中的角色加載 AWS 憑證的正確方法是什么?

使用 AWS SDK Go 從 Fargate 任務中的角色加載 AWS 憑證的正確方法是什么?

Go
慕妹3146593 2022-07-04 10:39:21
我有以下片段:awsCredentials := credentials.NewChainCredentials(    []credentials.Provider{        &ec2rolecreds.EC2RoleProvider{            Client: ec2metadata.New(newSession, aws.NewConfig()),        },        &credentials.SharedCredentialsProvider{},        &credentials.EnvProvider{},    })只要代碼在 EC2 實例上運行或訪問/密鑰通過變量傳遞(用于本地測試),它就可以正常工作。但是,此代碼在 ECS+Fargate 上運行時會失敗,因為NoCredentialProviders: no valid providers in chain. 檢查正在運行的容器的環境變量,它有預期的AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,所以credentials.EnvProvider應該閱讀它。所以,我的問題是,閱讀這些憑證的正確方法是什么?因為我面臨的問題不是缺少權限(這將表明策略/角色中的錯誤),而是該代碼無法獲取憑據。更新我已將其范圍縮小到使用ec2rolescreds.使用這個簡單的例子:package mainimport (    "fmt"    "log"    "github.com/aws/aws-sdk-go/aws"    "github.com/aws/aws-sdk-go/aws/credentials"    "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"    "github.com/aws/aws-sdk-go/aws/ec2metadata"    "github.com/aws/aws-sdk-go/aws/session"    "github.com/aws/aws-sdk-go/service/s3")func main() {    newSession, err := session.NewSession()    if err != nil {        log.Fatal(err)    }    awsCredentials := credentials.NewChainCredentials(        []credentials.Provider{            &ec2rolecreds.EC2RoleProvider{                Client: ec2metadata.New(newSession, aws.NewConfig()),            },            &credentials.SharedCredentialsProvider{},            &credentials.EnvProvider{},        })    sess, err := session.NewSession(&aws.Config{        Region:      aws.String("us-east-1"),        Credentials: awsCredentials},    )    if err != nil {        log.Fatal(err)    }    // Create S3 service client    svc := s3.New(sess)    result, err := svc.ListBuckets(nil)    if err != nil {        log.Fatal(err)    }    fmt.Println("Buckets:")    for _, b := range result.Buckets {        fmt.Printf("* %s created on %s\n",            aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))    }}如果我刪除ec2rolescreds,則本地和 ECS+Fargate 中的一切都正常。但是,如果我按原樣運行此代碼,我會得到相同的錯誤NoCredentialProviders: no valid providers in chain
查看完整描述

2 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

因此,可以使用 Config 對象來配置會話。


通讀該對象的規格,它對憑據說:


// The credentials object to use when signing requests. Defaults to a

// chain of credential providers to search for credentials in environment

// variables, shared credential file, and EC2 Instance Roles.

Credentials *credentials.Credentials

默認值已經是我的代碼片段所做的,所以我刪除了所有awsCredentials塊,現在它在任何地方都可以正常工作。在本地,EC2、Fargate...


更新


為了擴大答案,刪除awsCredentials使這項工作的原因是,如果您檢查 SDK 的代碼,https://github.com/aws/aws-sdk-go/blob/master/aws/defaults/defaults.go #L107,默認憑據同時檢查EnvProvider和RemoteCredProvider。


通過覆蓋默認鏈憑據,它無法在 中查找憑據RemoteCredProvider,這是處理環境變量的提供程序AWS_CONTAINER_CREDENTIALS_FULL_URI。


查看完整回答
反對 回復 2022-07-04
?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

解決方案是使用會話而不是憑據來初始化客戶端,即:


conf := aws.NewConfig().WithRegion("us-east-1")

sess := session.Must(session.NewSession(conf))


svc := s3.New(sess)

// others:

//   svc := sqs.New(sess)

//   svc := dynamodb.New(sess)

//   ... 

因為,正如@Ay0 指出的那樣,默認憑證鏈已經包含EnvProvider和RemoteCredProvider。


如果您仍然需要憑據,您可以使用:


creds := stscreds.NewCredentials(sess, "myRoleARN")

正如文檔指出的那樣。請注意,角色的策略必須sts:AssumeRole啟用操作。有關更多信息,這里是stscreds.NewCredentials(...)文檔


查看完整回答
反對 回復 2022-07-04
  • 2 回答
  • 0 關注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號