如何在C#.NET核心控制台程序中指定AWS凭据

时间:2017-11-05 18:07:45

标签: c# amazon-web-services aws-sdk

我正在尝试测试.NET核心控制台程序以向SNS发布消息。由于我试图让它在Lambda中运行时遇到问题,我想在非Lambda环境中尝试它。在Lambda中,安全性由角色覆盖,但在控制台程序中,我认为我必须以某种方式指定我的访问密钥和秘密。

我已阅读此页:http://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#net-dg-config-creds-sdk-store,但仍然完全混淆。

我在我的本地开发计算机上运行,​​而不是EC2实例。没有意图用这个去生产,只是试图测试一些代码。

我在Visual Studio 2015上,.NET Core 1.0。我用Nuget来获得以下内容:   “AWSSDK.Extensions.NETCore.Setup”:“3.3.3”,   “AWSSDK.SimpleNotificationService”:“3.3.0.23”,

根据How to set credentials on AWS SDK on NET Core?的答案,我创建了/user/.aws/credentials文件(假设凭据是文件名而不是目录名)。

但是这个问题/答案没有解决如何实际使用这个文件。我正在运行的代码如下。

    public static void Main(string[] args)
    {
        Console.WriteLine("Started");
        //var awsCredentials = new Amazon.Runtime.AWSCredentials()
        var client = new Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.EUWest2);
        //var client = new Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceClient(awsCredentials, Amazon.RegionEndpoint.EUWest2);
        //Amazon.SimpleNotificationService.Model.PublishResponse publishResp = null;
        SendMessage(client).Wait();
        Console.WriteLine("Completed call to SendMessage: Press enter to end:");
        Console.ReadLine(); 
    }

我在新客户端上遇到的错误是:

An unhandled exception of type 'Amazon.Runtime.AmazonServiceException' occurred in AWSSDK.Core.dll

Additional information: Unable to find credentials

我看到有一种方法可以将AWSCredentials对象传递给该构造函数,但我不明白如何构建它。 Amazon.Runtime.AWSCredentials是一个抽象类,所以我不能在“新”语句中使用它。

4 个答案:

答案 0 :(得分:11)

您将要构建其子类之一而不是抽象子类。您可以查看类层次结构here

对于后代,选项是:

  • AnonymousAWSCredentials - 以匿名用户身份进行身份验证。
  • BasicAWSCredentials - 您可以直接向类构造函数提供凭据。
  • EnvironmentAWSCredentials - 从正在运行的可执行文件的环境变量中提取凭据。
  • InstanceProfileAWSCredentials - 从运行可执行文件的EC2实例的实例配置文件中提取凭据。显然,这只适用于EC2。
  • SessionAWSCredentials - 与BasicAWSCredentials类似,但使用来自AWS STS的临时会话令牌的AWS会话除外。
  • RefreshingSessionAWSCredentials - 与SessionAWSCredentials类似,但在STS令牌过期时刷新。

请注意,缺少凭证对象时的默认策略包括检查环境变量,然后检查实例配置文件。

如果您希望程序从~/.aws/credentials提取凭据,则需要做一些工作。曾经有一个StoredProfileAWSCredentials类,但似乎已被删除 - 您可以通过查看this github问题找到更多信息。这在开发中非常有用,因为您不会在生产中使用~/.aws/credentials,但可能是实例配置文件 - 我建议使用默认策略并在测试或开发环境中使用Environment AWS凭据。

我采用这种方法,因为我们使用命令行工具从AWS STS获取有限的时间令牌,并将它们插入当前的shell以供下一个小时使用。

编辑:您似乎正在使用AWS Lambda。这些资源基于分配给它们的角色具有对AWS资源的联合访问权限,因此这应该使用使用实例配置文件的aws-sdk库中的默认凭据策略。所以这只是开发/测试的必要条件,在这种情况下我会再次建议使用环境变量。

答案 1 :(得分:10)

根据Dan Pantry的回答,这是一个简单的简短答案,突出显示了代码(请注意第二行中的区域枚举):

var awsCredentials = new Amazon.Runtime.BasicAWSCredentials("myaccesskey", "mysecretkey"); 
var client = new Amazon.SimpleNotificationService.AmazonSimpleNotificationSer‌​viceClient(awsCreden‌​tials, Amazon.RegionEndpoint.EUWest2);

尽可能使用角色,但在需要时可以使用。那么问题是存储访问密钥/密钥的位置;可以是环境变量,配置文件,提示用户或任何常见的嫌疑人。

答案 2 :(得分:2)

这是一个非常老的问题,现有的答案也可行,但是我真的不喜欢将访问密钥ID和秘密密钥值直接硬编码到源代码中,即使是我在本地计算机上执行的项目。一方面,我将来可能会撤消这些密钥,因此我想利用我的.aws \ credentials文件中的凭据。

要对我的.NET核心应用程序(包括控制台应用程序等)执行此操作,我首先添加两个NuGet程序包:

  • Microsoft.Extensions.Configuration.Json
  • AWSSDK.Extensions.NETCore.Setup

然后,我向我的项目中添加一个application.json文件,其中包含以下内容(请注意-您需要右键单击该文件,并将“复制到输出”设置为“如果更新则复制”或“始终” ):

{
  "AWS": {
    "Profile": "default",
    "ProfilesLocation": "C:\\Users\\my-user-profile-folder\\.aws\\credentials",
    "Region": "us-west-2"
  }
}

最后,我使用以下内容创建AWS开发工具包客户端的实例:

var builder = new ConfigurationBuilder().AddJsonFile("appsettings.Development.json", optional: false, reloadOnChange: true);
var options = builder.Build().GetAWSOptions();
var s3client = options.CreateServiceClient<IAmazonS3>();

这样,如果我更新凭据文件,就可以了。或者,如果我的代码被压缩并通过电子邮件发送给朋友或同事,我也不会不小心将其凭据发送给他们。

还有一种另一种方法来执行此操作,而无需添加很多人可能更喜欢的NuGet程序包。您可以像这样使用新的SharedCredentialsFile类和AWSCredentialsFactory(在此处使用“默认”配置文件,并假定您的凭证文件位于默认位置,与其他方法相同):

var sharedFile = new SharedCredentialsFile();
sharedFile.TryGetProfile("default", out var profile);
AWSCredentialsFactory.TryGetAWSCredentials(profile, sharedFile, out var credentials);

var s3Client = new AmazonS3Client(credentials);

注意-我不是在检查两个Try *方法在这里是否成功,您可能应该这样做。有关使用这些类的详细信息,请参见:https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#how-to-create-an-amazons3client-using-the-sharedcredentialsfile-class

答案 3 :(得分:2)

对于那些苦于个人资料名称的人,您可以在这里找到它。

您的 ~/.aws/credentials 的内容:

[YOUR_PROFILE_NAME]
aws_access_key_id = ***
aws_secret_access_key = ***
aws_security_token = ***
aws_session_expiration = ***
aws_session_token = ***

因此,在您的应用程序中,您可以像这样访问凭据:

var chain = new CredentialProfileStoreChain();
var result = chain.TryGetAWSCredentials("YOUR_PROFILE_NAME", out var credentials);

资源: