当前位置: 首页 > 知识库问答 >
问题:

如何在没有访问密钥的情况下将文件上载到AWS S3

程冥夜
2023-03-14

在我开始之前,我已经阅读了和同一个问题相关的帖子。但是,该帖子中的SDK版本很旧。根据AWS nugetpage,新版本3可用,每个服务都有单独的软件包。

用于.NET的AWS SDK的新版本3对每个服务使用单独的包。例如,AmazonS3在AWSSDK.S3包中,AmazonSQS在AWSSDK.SQS中,AmazonDynamoDB在AWSSDK.DynamoDBv2中。

所以我已经安装了AWSSDK. S3包nuget也安装依赖关系AWSSDK. Core。im使用的存储桶受到IP的限制,因此im执行代码的机器可以完全访问存储桶。

下面是我上传文件到S3的代码。然而,当我使用newamazons3client(RegionEndpoint.USWest2)创建AmazonS3Client的新实例时,我遇到了异常

再次注意,我得到的异常是在创建实例时,而不是在上载文件时。

 var s3Client = new AmazonS3Client(RegionEndpoint.USWest2);  //exception at this line

 var bucketName = "mybucketname";
  PutObjectRequest putRequest1 = new PutObjectRequest
  {
                BucketName = bucketName,
                Key = "MyKey/test1.pdf",
                FilePath = filePath
  };

  PutObjectResponse response1 = s3Client.PutObject(putRequest1);

然而我得到例外

[15:57:43错误]未处理的异常Amazon.Runtime.AmazonServiceException:找不到凭据

异常1/5:System.InvalidOperationException:应用程序的app.config/web.config文件在Amazon.Runtime.AppConfigAWSCredentials..ctor()中不包含凭据信息在E:\JenkinsWorkspaces\v3 stage release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs中:Amazon.Runtime.FallbackCredentialsFactory的第977行。

异常2/5:System.ArgumentException:App.config不包含凭据信息。添加AWSAccessKey和AWSSecretKey属性或AWSProfileName属性。在E:\JenkinsWorkspaces\v3 stage release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCreden在Amazon.Runtime.FallbackCredentialsFactory中的Amazon.Runtime.StoredProfileAWCredentials..ctor(字符串配置文件名,字符串配置文件位置)。

例外3的5:系统。未找到或无法从SDK凭据存储中加载“配置文件”。验证配置文件名称和数据是否正确。在亚马逊。运行时。在E:\JenkinsWorkspace\v3-阶段-发布\AWSDotNetPublic\sdk\src在Amazon. ctor(字符串概要名称,字符串概要位置,WebProxy代理设置)。运行时。Fallback凭据工厂。

异常4/5:System.InvalidOperationException:环境变量AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY/AWS_SESSION_TOKEN未使用AWS凭据设置。在Amazon.Runtime.EnvironmentVariablesAWSCredentials.FetchAWSCredentials()中,位于E:\JenkinsWorkspaces\v3 stage release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:Amazon.Runtime.EnvironmentVariablesAWSCredentials..()的第856行在E:\JenkinsWorkspaces\v3 stage release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs中:Amazon.Runtime.FallbackCredentialsFactory的第836行。

例外5/5:亚马逊。运行时。无法到达亚马逊的凭据服务器。运行时。URIBasedRerisingCreentalHelper.GetContents(Uri uri)in E:\JenkinsWorkspace\v3-阶段发布\AWSDotNetPublic\sdk\src\Core\Amazon.运行时\AWSCredentials.cs:Amazon的第1194行。运行时。InstanceProfileAWS凭据.d__10。MoveNext()在E:\JenkinsWorkspace\v3-阶段发布\AWSDotNetPublic\sdk\src\Core\Amazon中。运行时\AWSCredentials.cs:在亚马逊上线。运行时。InstanceProfileAWS凭据。GetFirstRole()在E:\JenkinsWorkspace\v3-阶段发布\AWSDotNetPublic\sdk\src\Core\Amazon中。运行时\AWSCredentials.cs:Amazon的第1422行。运行时。Fallback凭据工厂。E:\JenkinsWorkspace\v3-阶段-发布\AWSDotNetPublic\sdk\src\Core\Amazon中的ECSEC2凭据包装器()。运行时\AWSCredentials.cs:Amazon的第2129行。运行时。Fallback凭据工厂。在E:\JenkinsWorkspace\v3-阶段发布\AWSDotNetPublic\sdk\src\Core\Amazon中获取凭据(布尔回退到匿名)。运行时\AWSCredentials.cs

在亚马逊。运行时。Fallback凭据工厂。在E:\JenkinsWorkspace\v3-阶段发布\AWSDotNetPublic\sdk\src\Core\Amazon中获取凭据(布尔回退到匿名)。运行时\AWSCredentials.cs在亚马逊。运行时。Fallback凭据工厂。在E:\JenkinsWorkspace\v3-阶段-发布\AWSDotNetPublic\sdk\src\Core\Amazon中获取凭据()。运行时\AWSCredentials.cs:Amazon的第2136行。S3.在E:\JenkinsWorkspace\v3-阶段-发布\AWSDotNetPublic\sdk\src\Services\S3\Generated_bcl45\Amazon S3Client.cs:实用程序的第80行中的Amazon S3Client... ctor(区域endpoint区域)。程序。在C:\repos\poc\实用程序\实用程序\Program.cs中的Dowork():实用程序的第133行。程序。主(字符串[]args)在C:\repos\poc\实用程序\实用程序\Program.cs: line 23


共有3个答案

后安民
2023-03-14

为此,您的实例必须具有IAM角色,该角色具有将对象放入bucket的权限。

根据文件:

使用从应用程序的默认配置加载的凭据构造AmazonS3Client,如果不成功,则使用EC2实例上的实例配置文件服务。

在http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html详细了解实例配置文件

吴德辉
2023-03-14

要获得对任何bucket的访问权,您需要它的访问权和密钥,因为您在这里使用SDK“var s3Client=new AmazonS3Client(RegionEndpoint.USWest2);”。您只需要在配置文件中提供凭据,SDK将自动从那里获取凭据。

万俟光临
2023-03-14
匿名用户

链接中为更老的SDK指定的行为仍然有效。如果您使用访问密钥和机密的null值配置Amazon S3Client,则客户端将以匿名模式操作。

这在SDK的.NET文档中没有记录,但在S3开发者指南的.NET部分中有记录。

注意事项

您可以创建Amazon S3Client客户端,而无需提供安全凭据。使用此客户端发送的请求是匿名请求,没有签名。如果您对不公开可用的资源发送匿名请求,Amazon S3将返回错误。

您可能希望使用一个构造函数,就像接受密钥、秘密和区域的构造函数一样。

// passing null for the key and secret will make the client generate anonymous requests
var client = new AmazonS3Client(null, null, RegionEndpoint.USWest2);

// do things with the client

 类似资料:
  • 问题内容: 我试图将配置(例如URLs / etc)放入资源文件夹中,以供实用程序类使用。但是,我不想从任何地方的活动中传递上下文。我希望能够通过路径名(似乎使用assess /是为此用途设计的)来访问资源,而无需使用上下文来访问资源。 在这种特殊情况下,我希望单例实例化时在配置中使用某些东西。除了实例化期间的那一次之外,它不需要任何资源。因此,每次调用getInstance()时都必须传递Con

  • 如何在Azure密钥库中设置秘密,而不使用PowerShell。我们正在使用Azure Key Vault来安全地存储连接字符串和一些其他应用程序秘密。我们可以使用PowerShell脚本添加秘密,但我想知道是否有其他方法可以在Azure KeyVault中添加密钥,最好是使用API。我们实际上需要提供一个管理工具,应用程序管理员可以使用该工具在密钥库中添加/修改机密。

  • 我们配置了EC2实例,该实例具有对SQS和EC2的完全权限的IAM角色。有没有什么方法可以在没有AWS的任何SDK/CLI支持的情况下发送消息到队列?仅使用来自EC2实例的简单REST调用?

  • 问题内容: 我可以在没有jQuery的情况下访问数据属性吗? 使用jQuery很容易,但是如果没有jQuery,我在任何地方都看不到该怎么做。 如果我在Google上搜索“没有jQuery”,那么我得到的只是jQuery示例。 可能吗 问题答案: 在这里,我找到了这个例子: 因此,它看起来非常可行。

  • 我有一个用例,我必须读取一个ZIP文件,并将其作为模板传递给lambda的创建。现在我想从一个S3公共桶中读取zip文件。如何从公共桶中读取文件? 我正在读取的S3 bucket zip文件是https://lambda-template-code.S3.amazonaws.com/lambdatemplate.zip 上面的代码给出错误 如何读取URL文件?并在中传递 这里有人能帮我吗

  • 我正在创建一个Android应用程序,使用一个普通的谷歌驱动器帐户作为一个应用程序-养号,如上所述,以令人难以置信的简洁,这里: 使用常规Google帐户作为应用程序拥有的帐户 不幸的是,有关如何在云端硬盘上执行任何操作的所有说明都指向客户端密钥,如下所述: Google API控制台-缺少客户端机密 对于已安装的应用程序,这实际上不再存在。我设法通过构建一个实际的网页,在难以置信的痛苦中获得了O