带有IAM的EC2上的S3:错误NoCredentialProviders:链中没有有效的提供程序。已弃用

我的应用程序使用s3并在EC2上运行。 IAM是在实例上配置的,因此身份验证是无密钥的(没有访问密钥和秘密密钥)。

我可以使用aws cli上传或下载文件。但是,当我尝试使用aws-sdk-go执行下载操作时,出现以下错误:

  

accessDenied:拒绝访问
  状态码:403,请求ID:F945BDB5410E1A00,主机ID:m74jJ8z / AEzdkaJkWKdIqPEwPIYPZfWnLLfa5UpEwHwabcXOuXTPY1aw / u / 5HGralKg + ewAWEJA =

我遵循https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials/ec2rolecreds/和本期https://github.com/aws/aws-sdk-go/issues/430的官方指南,但出现了以上错误。

下面是我的代码:

s3UploadPath = config.GetString("upload assets to s3.bucket")
s3Config := aws.NewConfig()
s3Config.CredentialsChainVerboseErrors = aws.Bool(true)

session,err := session.NewSession(s3Config)
if err != nil {
    Logger.Fatal("Error initializing s3 uploader. " + err.Error())
    os.Exit(0)
}

// the upload code
uploader = s3manager.NewUploader(session)
res,err := uploader.Upload(&s3manager.UploadInput{
    Bucket: aws.String(s3UploadPath),Key:    aws.String(filename),Body:   f,})
if err != nil {
    log.Fatal("error on upload. " + err.Error())
}

// then continue with the download code

附带的屏幕截图显示通过aws cli成功完成了下载和上传操作

带有IAM的EC2上的S3:错误NoCredentialProviders:链中没有有效的提供程序。已弃用

我做错了吗?

ilovejingye 回答:带有IAM的EC2上的S3:错误NoCredentialProviders:链中没有有效的提供程序。已弃用

在EC2实例上使用IAM角色时,您无需指定凭据。

我看到您得到using System; using Microsoft.AspNetCore.Mvc; using Moq; using Moq.Protected; using MyTest; using MyTest.Controllers; using Xunit; namespace XUnitTestProject1 { public class UnitTest1 { interface IBaseAccessControllerProtectedMembers { bool HasAccess(int userId); } [Fact] public async void MyUnitTest() { // Arrange var mockController = new Mock<WeatherForecastController>(); mockController.Protected() .As<IBaseAccessControllerProtectedMembers>() .Setup(x => x.HasAccess(3)) .Returns(true); // Act var result = await mockController.Object.Get(); // Assert var actionResult = Assert.IsType<ActionResult<WeatherForecast>>(result); var returnValue = Assert.IsType<WeatherForecast>(actionResult.Value); } } } ,这意味着您的Go程序能够选择EC2配置文件凭据,但可能由于缺少权限而导致此错误。

读取代码,似乎您想将对象写入S3。您是否可以确定已将Access Denieds3:Get*s3:List*s3:PutObject分配给您的IAM角色,并且没有明确拒绝S3存储桶策略?

,

我通过做两件事设法解决了这个错误。

第一个是在会话创建过程中使用stscreds.NewCredentials(session,roleArn)作为凭据。

s3Config := aws.NewConfig()
s3Config.CredentialsChainVerboseErrors = aws.Bool(true)
s3Config.WithLogLevel(aws.LogDebugWithHTTPBody)
s3Config.Region = aws.String(region)
s3Config.WithHTTPClient(&http.Client{
    Transport: &http.Transport{
        Proxy: http.ProxyFromEnvironment,},Timeout: 10 * time.Second,})

sess,err := session.NewSession(s3Config)
if err != nil {
    log.Fatal("Error initializing session. " + err.Error())
}

sess.Config.Credentials = stscreds.NewCredentials(sess,arn)
_,err = sess.Config.Credentials.Get()
if err != nil {
    log.Fatal("Error getting role. " + err.Error())
}

第二件事是通过定义值为NO_PROXY的{​​{1}}环境变量。特定的IP是用于获取EC2元数据的AWS全局IP。

由于我的应用程序使用代理与S3服务器通信,因此我需要排除该IP。

本文链接:https://www.f2er.com/3125405.html

大家都在问