在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中是否有任何方法遵循检索凭证的层次结构并提供它?
提前致谢。
答案 0 :(得分:0)
解决方案非常简单:
对所有AmazonClients
(AmazonSQSClient/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#源代码中搜索相同的常量:
这基本上是向在称为“ Instance Metadata” 的EC2实例上本地公开的服务发出http请求,这也是Java所调用的。 因此,如果此代码在其他任何地方运行,则只会在EC2实例上获取凭据。
以下是有关使用该服务的一般信息: https://blog.gruntwork.io/authenticating-to-aws-with-instance-metadata-b6d812a86b40
如果您出于OP之外的其他原因需要密钥,我将在此处保留答案,因为这是当您在带有IAM角色的EC2实例上用google搜索凭据时的最佳结果。