gpt4 book ai didi

amazon-web-services - 使用AWS开发工具包Go从Fargate任务中的角色加载AWS凭证的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-01 21:09:19 27 4
gpt4 key购买 nike

我有以下片段:

awsCredentials := credentials.NewChainCredentials(
[]credentials.Provider{
&ec2rolecreds.EC2RoleProvider{
Client: ec2metadata.New(newSession, aws.NewConfig()),
},
&credentials.SharedCredentialsProvider{},
&credentials.EnvProvider{},
})
只要代码在EC2实例上运行或通过变量传递访问/ secret key (用于本地测试),该方法就可以正常工作。
但是,此代码在ECS + Fargate上运行时失败,因为 NoCredentialProviders: no valid providers in chain。检查了正在运行的容器的环境变量,它具有预期的 AWS_CONTAINER_CREDENTIALS_RELATIVE_URI,因此 credentials.EnvProvider应该读取它。
因此,我的问题是,读取这些凭据的正确方法是什么?因为我面临的问题不是缺少权限(这表明策略/角色错误),但是该代码无法获取凭据。
更新
我将其范围缩小到 ec2rolescreds的使用。
使用以下简单示例:
package main

import (
"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相同的错误

最佳答案

因此,可以使用Config对象配置 session 。
通读该对象的规范,它对凭据说:

// 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,则默认凭据将同时检查 EnvProviderRemoteCredProvider
通过覆盖默认的链凭证,它无法在 RemoteCredProvider中查找凭证,后者是处理环境变量 AWS_CONTAINER_CREDENTIALS_FULL_URI的提供程序。

关于amazon-web-services - 使用AWS开发工具包Go从Fargate任务中的角色加载AWS凭证的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64045744/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com