我有以下片段:
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 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
慕森卡
Cats萌萌
相关分类