amazon-web-services - 带有 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 下载和上传操作成功
我做错了吗?
解决方案
在 EC2 实例上使用 IAM 角色时,您不需要指定凭证。
我看到你得到了Access Denied
这意味着你的 Go 程序能够选择 EC2 配置文件凭据,但可能是由于缺乏权限,它得到了这个错误。
阅读您的代码,您似乎想将对象写入 S3。您能否确保您已将s3:Get*
、s3:List*
、s3:PutObject
、s3:PutObjectAcl
授予您的 IAM 角色,并且 S3 存储桶策略上没有明确的拒绝?
推荐阅读
- apache-spark - 火花流:WAL 被忽略
- asp.net - 没有身份和 OWIN 的自定义授权属性
- sql - T-SQL string concatenation `'string' + str(integer)` introduces extra space character
- angular - Angular 6 本地化路由器不起作用
- python - Passing a list of values to Oracle using Python
- algorithm - 优化单元格网格上的属性值
- python-3.x - How to put images into a dynamic text in Kivy
- azure - 漂亮地显示 pyspark 数据框
- php - 为动物熊创建一个 PHP 类
- spring - 如何使用嵌入式 tomcat 运行 Spring MVC 项目?