【问题标题】:Net Core 2.0 AmazonServiceException: Unable to find credentialsNet Core 2.0 AmazonServiceException:找不到凭证
【发布时间】:2019-04-10 02:42:30
【问题描述】:

我有以下代码:

public void ConfigureServices(IServiceCollection services)
{
    // AWS Options
    var awsOptions = Configuration.GetAWSOptions();
    services.AddDefaultAWSOptions(awsOptions);

    var client = awsOptions.CreateServiceClient<IAmazonDynamoDB>();
    var dynamoDbOptions = new DynamoDbOptions();
    ConfigurationBinder.Bind(Configuration.GetSection("DynamoDbTables"), dynamoDbOptions);

    services.AddScoped<IDynamoDbManager<MyModel>>(provider => new DynamoDbManager<MyModel>(client, dynamoDbOptions.MyModel));
}

public class DynamoDbManager<T> : DynamoDBContext, IDynamoDbManager<T> where T : class
{
    private DynamoDBOperationConfig _config;

    public DynamoDbManager(IAmazonDynamoDB client, string tableName) : base(client)
    {
        _config = new DynamoDBOperationConfig()
        {
            OverrideTableName = tableName
        };
    }       
}

我的 Appsettings.json 为:

{
    "AWS": {
        "Region": "us-east-1",
        "AwsId": "xxx",
        "AwsPassword": "xxx"
    },
    "DynamoDbTables": {
        "MyModel": "MyTable"
    }
}

当我运行我的代码时,我收到了错误:

AmazonServiceException: Unable to find credentials

3 个中的第 1 个例外: Amazon.Runtime.AmazonClientException:无法在 CredentialProfileStoreChain 中找到“默认”配置文件。在 E:\JenkinsWorkspaces\v3-trebuchet-release\AWSDotNetPublic\sdk\src\Core\Amazon.Runtime\Credentials\FallbackCredentialsFactory.cs:line 72 中的 Amazon.Runtime.FallbackCredentialsFactory.GetAWSCredentials(ICredentialProfileSource 源)

例外 2 之 3: System.InvalidOperationException:环境变量 AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY/AWS_SESSION_TOKEN 未使用 AWS 凭证设置。

3 个中的第 3 个例外: System.Net.Http.HttpRequestException:发送请求时出错。 ---> System.Net.Http.WinHttpException: 操作超时 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

我尝试了很多方法,但没有成功。

我试过了:

将配置文件设置为: Amazon.Runtime.AmazonServiceException: Unable to find credentials

还尝试设置环境变量:

https://github.com/aws/aws-sdk-net/issues/499

但仍然无法克服这个错误。

【问题讨论】:

  • 您是否尝试过使用调试器或添加一些 Console.WriteLine 语句来证明您的设置正确?例如,Configuration.GetSection("DynamoDbTables") 应该是 awsOptions.something 吗?

标签: c# amazon-web-services asp.net-core amazon-dynamodb aws-sdk


【解决方案1】:

因此,当我们使用 AWS 开发工具包时,我们需要设置并提供 AWS 访问密钥和秘密密钥。从我所遇到的情况来看,它并没有直接从应用程序设置中读取。所以我发现下面是您可以设置这些凭据的两种工作方法。

方法一 - 使用凭证文件

您可以创建一个凭据文件并将您的凭据存储在那里。下面是文件的格式。

[default]
aws_access_key_id = your id goes here
aws_secret_access_key = your password goes here

在上述文件中,“default”是您的个人资料的名称。

创建上述文件后,您需要在 Appsettings.json 文件中指定相同的内容为:

"AWS": {
    "Profile": "default",
    "ProfilesLocation": "C:\\filelocation\\awscredentials",
    "Region": "us-east-1",
   }

方法二 - 设置和读取环境变量

我们可以在我们的startup.cs文件中设置环境变量如下:

Environment.SetEnvironmentVariable("AWS_ACCESS_KEY_ID", Configuration["AWS:AwsId"]);
Environment.SetEnvironmentVariable("AWS_SECRET_ACCESS_KEY", Configuration["AWS:AwsPassword"]);
Environment.SetEnvironmentVariable("AWS_REGION", Configuration["AWS:Region"]); 

并从我们的 appSettings.json 文件中读取这些变量:

AWS": {
        "Region": "us-east-1",
        "AwsId": "xxxx",
        "AwsPassword": "xxxx"
      }

【讨论】:

  • 我不确定使用 AwsId 和 AwsPassword 的想法来自哪里(它们没有被记录为可行的选项),但是有许多记录在案的方法来提供凭据。您的方法 #1 适用于本地开发人员机器。请注意,如果您将凭证文件存储在默认位置(主目录下的 .aws/),则不需要提供 ProfilesLocation,并且您应该将凭证文件存储在那里(优先于其他位置),因为它提供了其他优势(所有其他 AWS 工具和 SDK 将能够无缝检索凭证)。
  • @jarmod 没错,我应该改用 AccessKey 和 SecretKey。我不记得在哪里,但我已经看到了 ID 和密码,所以我在这里使用了它。我们在 uat 和生产环境中动态更新 appsettings 键值,所以是的,我们没有使用方法 1,一直在使用方法 2。
  • 您不能直接在 appsettings.json 中向 SDK 提供凭据,无论您如何称呼它们(例如 AwsId 或 AccessKey)。您只能提供与存储在 ~/.aws/credentials 中的凭证相关的配置文件名称(和可选位置)。当涉及到 UAT 和生产时,假设它部署在 EC2 或 ECS 上,为什么你首先要提供这样的凭证?您应该使用 IAM 角色和实例配置文件。
  • 我知道我们不能直接在 appsettings 中提供这些。我的意思是用 AWS 所称的 AccessKey 和 SecretKey 来称呼它们。我不知道为此必须阅读 IAM 角色和实例配置文件。此外,正如我所提到的,我们正在使用 Octopus 部署,我们在其中定义所有应用程序变量,即密钥对值。我们在这里定义 UAT 和 Prod 变量。
  • 您可以通过环境变量成功使用 IAM 用户凭证,但也有一些缺点。一个问题是凭证是长期存在的。通常最好使用最少的 IAM 角色启动您的计算资源。然后,该实例上的应用程序可以通过您正在使用的 AWS 开发工具包自动检索凭证并且凭证是临时的并自动轮换。这是一种更好的安全实践。Octopus 几乎肯定会支持 IAM 角色(和实例配置文件)——它们是平台的基础。祝你的项目好运。
猜你喜欢
  • 2017-08-13
  • 2017-01-31
  • 1970-01-01
  • 2018-07-26
  • 2018-11-23
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多