什么相当于C#中的DefaultAWSCredentialsProviderChain

时间:2018-04-11 05:31:19

标签: c# .net amazon-web-services amazon-ec2 aws-sdk

在java中使用S3Client时,我曾经像这样初始化S3Client,它在本地机器(我设置了环境变量)以及EC2实例(我有IAM角色)中完美运行:

AWSCredentials credentials = DefaultAWSCredentialsProviderChain.getInstance().getCredentials();
AmazonS3 s3client = new AmazonS3Client(credentials);

我想在C#.net中做同样的事情。为此,我必须使用不同的方法在本地机器和EC2实例上运行它。 现在,我这样做有点像这样:

var awsCredentials = new EnvironmentVariablesAWSCredentials(); //For local
var awsCredentials2 = new InstanceProfileAWSCredentials(); //For EC2 instance 
var awsRegion = Environment.GetEnvironmentVariable("AWS_REGION");
AmazonS3Client s3Client = new AmazonS3Client(awsCredentials, RegionEndpoint.GetBySystemName(awsRegion));

我已通过官方AWS SDK for .Net's documentation

但我找不到的是,等同于Java Method

DefaultAWSCredentialsProviderChain.getInstance().getCredentials()

C#.net中是否有任何方法遵循检索凭证的层次结构并提供它?

提前致谢。

2 个答案:

答案 0 :(得分:0)

解决方案非常简单:

对所有AmazonClientsAmazonSQSClient/AmazonSNSClient/AmazonS3Client)使用空构造函数或使用不带AWSCredentials参数的构造函数。

所以代码看起来像这样:

AmazonS3Client s3Client = new AmazonS3Client();

OR

var awsRegion = Environment.GetEnvironmentVariable("AWS_REGION");
AmazonS3Client s3Client = new AmazonS3Client(RegionEndpoint.GetBySystemName(awsRegion));

空构造函数的文档读取如下:

  

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

答案 1 :(得分:0)

尽管就实例化AmazonS3Client()而言,以上答案是正确的,但如果您出于其他原因需要获取密钥,则可以使用。例如,计算AWS Signature版本4的签名。然后,您可以使用以下代码:

var instance = new Amazon.Runtime.InstanceProfileAWSCredentials();
var creds = instance.GetCredentials();
var accessKey = creds.AccessKey;
var secretKey = creds.SecretKey;

我通过查看github上的java源代码来找到此类,然后在遇到类似问题时在c#源代码中搜索相同的常量:

https://github.com/aws/aws-sdk-net/blob/dd8d1fb91763f378cec2e162c03e881cc2fd83e9/sdk/src/Core/Amazon.Runtime/Credentials/_bcl%2Bnetstandard/InstanceProfileAWSCredentials.cs

这基本上是向在称为“ Instance Metadata” 的EC2实例上本地公开的服务发出http请求,这也是Java所调用的。 因此,如果此代码在其他任何地方运行,则只会在EC2实例上获取凭据

以下是有关使用该服务的一般信息: https://blog.gruntwork.io/authenticating-to-aws-with-instance-metadata-b6d812a86b40

如果您出于OP之外的其他原因需要密钥,我将在此处保留答案,因为这是当您在带有IAM角色的EC2实例上用google搜索凭据时的最佳结果。