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

时间:2016-12-20 16:37:47

标签: amazon-web-services amazon-s3 aws-sdk

在开始之前,我已经阅读了与此问题相关的SO post。但是该帖子中的SDK版本已经过时了。 根据{{​​3}},可以使用新版本3,每个服务都有单独的包。

  

AWS SDK for .NET的新版本3使用单独的包   每项服务。例如,Amazon S3位于AWSSDK.S3包中,   Amazon SQS在AWSSDK.SQS和Amazon DynamnoDB中   AWSSDK.DynamoDBv2。

所以我从nuget安装了AWSSDK.S3个软件包,它还安装了依赖项AWSSDK.Core。 我正在使用的存储桶是使用IP限制的,所以我执行代码的机器可以完全访问存储桶。

以下是我将文件上传到S3的代码。但是,当我使用AmazonS3Client

创建new AmazonS3Client(RegionEndpoint.USWest2);的新实例时,我会遇到异常

再次注意到我在上传文件时创建实例时遇到异常。

 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 ERR]未处理的异常   Amazon.Runtime.AmazonServiceException:无法找到凭据

     

Exception 1 of 5:System.InvalidOperationException:The   应用程序的app.config / web.config文件不包含   证件信息   Amazon.Runtime.AppConfigAWSCredentials..ctor()in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   977在   Amazon.Runtime.FallbackCredentialsFactory。<> c.b__6_0()in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   2098年   Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔   fallbackToAnonymous)in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK \ SRC \核心\ Amazon.Runtime \ AWSCredentials.cs

     

异常2 of 5:System.ArgumentException:App.config不会   包含凭据信息。添加AWSAccessKey和   AWSSecretKey属性或AWSProfileName属性。在   Amazon.Runtime.StoredProfileAWSCredentials..ctor(String profileName,   String profilesLocation)in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCreden   在Amazon.Runtime.FallbackCredentialsFactory。<> c.b__6_1()in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   2099年   Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔   fallbackToAnonymous)in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK \ SRC \核心\ Amazon.Runtime \ AWSCredentials.cs

     

异常3 of 5:System.ArgumentException:Profile''没找到   或无法从SDK凭据存储区加载。验证   个人资料名称和数据是正确的。在   Amazon.Runtime.StoredProfileFederatedCredentials..ctor(字符串   profileName,String profilesLocation,WebProxy proxySettings)in   E:\ JenkinsWorkspaces \ v3-stage-release \ AWSDotNetPublic \ sdk \ src at at   Amazon.Runtime.FallbackCredentialsFactory。<> c.b__6_2()in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   2101在   Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔   fallbackToAnonymous)in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK \ SRC \核心\ Amazon.Runtime \ AWSCredentials.cs

     

异常4 of 5:System.InvalidOperationException:环境   变量AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN   没有使用AWS凭据设置。在   Amazon.Runtime.EnvironmentVariablesAWSCredentials.FetchAWSCredentials()   在   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   856在Amazon.Runtime.EnvironmentVariablesAWSCredentials..ctor()中   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   836在   Amazon.Runtime.FallbackCredentialsFactory。<> c.b__6_3()in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   2102在   Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔   fallbackToAnonymous)in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK \ SRC \核心\ Amazon.Runtime \ AWSCredentials.cs

     

异常5 of 5:Amazon.Runtime.AmazonServiceException:无法执行   到达凭证服务器   Amazon.Runtime.URIBasedRefreshingCredentialHelper.GetContents(Uri uri)   在   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   1194年   Amazon.Runtime.InstanceProfileAWSCredentials.d__10.MoveNext()   在   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   在Amazon.Runtime.InstanceProfileAWSCredentials.GetFirstRole()中   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   1422年   Amazon.Runtime.FallbackCredentialsFactory.ECSEC2CredentialsWrapper()   在   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   2129年   Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔   fallbackToAnonymous)in   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK \ SRC \核心\ Amazon.Runtime \ AWSCredentials.cs

     

在Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔   fallbackToAnonymous)in   Amazon.Runtime.FallbackCredentialsFactory.GetCredentials()中的E:\ JenkinsWorkspaces \ v3-stage-release \ AWSDotNetPublic \ sdk \ src \ Core \ Amazon.Runtime \ AWSCredentials.cs   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \核心\ Amazon.Runtime \ AWSCredentials.cs:行   2136在Amazon.S3.AmazonS3Client..ctor(RegionEndpoint region)中   E:\ JenkinsWorkspaces \ V3阶段释放\ AWSDotNetPublic \ SDK的\ src \ SERVICES \ S3 \ Generated_bcl45 \ AmazonS3Client.cs:行   80.在Utility.Program.Dowork()中   C:\ repos \ poc \ Utility \ Utility \ Program.cs:第133行at   Utility.Program.Main(String [] args)in   C:\ repos \ poc \ Utility \ Utility \ Program.cs:第23行

3 个答案:

答案 0 :(得分:2)

旧版SDK的链接中指定的行为仍然有效。如果您为访问密钥和密钥配置AmazonS3Client null值,则客户端将以匿名模式运行。

这在SDK的.NET文档中没有记录,但在S3 Developer Guide's .NET section中有记录。

  

注意

     

您可以在不提供安全凭据的情况下创建AmazonS3Client客户端。使用此客户端发送的请求是匿名请求,没有签名。如果您发送对不可公开的资源的匿名请求,则Amazon S3会返回错误。

你可能想要使用像takes a key, secret, and region那样的构造函数。

// 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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

要使其正常工作,您必须拥有一个IAM角色,该角色有权将对象放入存储桶。

根据documentation

  

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

http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html

了解有关实例个人资料的详情