我正在尝试测试.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是一个抽象类,所以我不能在“新”语句中使用它。
答案 0 :(得分:11)
您将要构建其子类之一而不是抽象子类。您可以查看类层次结构here。
对于后代,选项是:
请注意,缺少凭证对象时的默认策略包括检查环境变量,然后检查实例配置文件。
如果您希望程序从~/.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.AmazonSimpleNotificationServiceClient(awsCredentials, Amazon.RegionEndpoint.EUWest2);
尽可能使用角色,但在需要时可以使用。那么问题是存储访问密钥/密钥的位置;可以是环境变量,配置文件,提示用户或任何常见的嫌疑人。
答案 2 :(得分:2)
这是一个非常老的问题,现有的答案也可行,但是我真的不喜欢将访问密钥ID和秘密密钥值直接硬编码到源代码中,即使是我在本地计算机上执行的项目。一方面,我将来可能会撤消这些密钥,因此我想利用我的.aws \ credentials文件中的凭据。
要对我的.NET核心应用程序(包括控制台应用程序等)执行此操作,我首先添加两个NuGet程序包:
然后,我向我的项目中添加一个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);
资源: