【问题标题】:How to upload a file to AWS S3 without access key & secret key如何在没有访问密钥和密钥的情况下将文件上传到 AWS S3
【发布时间】:2017-05-05 22:53:01
【问题描述】:

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

适用于 .NET 的 AWS 开发工具包的新版本 3 使用单独的包 每个服务。例如 Amazon S3 在 AWSSDK.S3 包中, Amazon SQS 位于 AWSSDK.SQS 中,Amazon DynamnoDB 位于 AWSSDK.DynamoDBv2。

所以我已经从 nuget 安装了 AWSSDK.S3 包,它还安装了依赖项 AWSSDK.Core。 我使用的bucket是使用IP限制的,所以我执行代码的机器可以完全访问bucket。

下面是我将文件上传到 S3 的代码。但是,当我使用new AmazonS3Client(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 ERR] 未处理的异常 Amazon.Runtime.AmazonServiceException:找不到凭据

异常 1 之 5:System.InvalidOperationException:The 应用程序的 app.config/web.config 文件不包含 凭证信息在 Amazon.Runtime.AppConfigAWSCredentials..ctor() 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 977 在 Amazon.Runtime.FallbackCredentialsFactory.c.b__6_0() 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 2098 在 Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔 fallbackToAnonymous) 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs

异常 2 of 5:System.ArgumentException:App.config 没有 包含凭据信息。添加 AWSAccessKey 和 AWSSecretKey 属性或 AWSProfileName 属性。在 Amazon.Runtime.StoredProfileAWSCredentials..ctor(字符串 profileName, 字符串配置文件位置)在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCreden 在 Amazon.Runtime.FallbackCredentialsFactory.c.b__6_1() 中 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 2099 在 Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔 fallbackToAnonymous) 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs

异常 3 of 5: System.ArgumentException: Profile '' is not found 或无法从 SDK 凭据存储中加载。验证 个人资料名称和数据正确。在 Amazon.Runtime.StoredProfileFederatedCredentials..ctor(字符串 profileName, String profilesLocation, WebProxy proxySettings) 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src 在 Amazon.Runtime.FallbackCredentialsFactory.c.b__6_2() 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 2101 在 Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔 fallbackToAnonymous) 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\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-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 856 在 Amazon.Runtime.EnvironmentVariablesAWSCredentials..ctor() 中 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 836 在 Amazon.Runtime.FallbackCredentialsFactory.c.b__6_3() 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 2102 在 Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔 fallbackToAnonymous) 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs

异常 5(共 5 个):Amazon.Runtime.AmazonServiceException:无法 到达凭证服务器 Amazon.Runtime.URIBasedRefreshingCredentialHelper.GetContents(Uri uri) 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 1194 在 Amazon.Runtime.InstanceProfileAWSCredentials.d__10.MoveNext() 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 在 Amazon.Runtime.InstanceProfileAWSCredentials.GetFirstRole() 中 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 1422 在 Amazon.Runtime.FallbackCredentialsFactory.ECSEC2CredentialsWrapper() 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 2129 在 Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(布尔 fallbackToAnonymous) 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs

在 Amazon.Runtime.FallbackCredentialsFactory.GetCredentials(Boolean fallbackToAnonymous) 在 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs 在 Amazon.Runtime.FallbackCredentialsFactory.GetCredentials() 中 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\AWSCredentials.cs:line 2136 在 Amazon.S3.AmazonS3Client..ctor(RegionEndpoint 区域)中 E:\JenkinsWorkspaces\v3-stage-release\AWSDotNetPublic\sdk\src\Services\S3\Generated_bcl45\AmazonS3Client.cs:line 80 在 Utility.Program.Dowork() 中 C:\repos\poc\Utility\Utility\Program.cs:第 133 行 Utility.Program.Main(String[] args) 在 C:\repos\poc\Utility\Utility\Program.cs:第 23 行

【问题讨论】:

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


    【解决方案1】:

    链接中为旧版 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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        为此,您的实例必须具有有权将对象放入存储桶的 IAM 角色。

        根据documentation

        使用从 应用程序的默认配置,如果不成功 从 EC2 实例上的实例配置文件服务。

        http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html阅读有关实例配置文件的更多信息

        【讨论】:

          猜你喜欢
          • 2012-03-05
          • 2014-07-10
          • 2022-08-05
          • 1970-01-01
          • 2013-08-11
          • 2022-11-22
          • 2019-02-20
          • 2023-01-25
          • 1970-01-01
          相关资源
          最近更新 更多