AWS DotNet SDK错误:无法从EC2实例元数据服务获取IAM安全凭证

时间:2020-03-23 14:01:34

标签: .net amazon-web-services sdk credentials

我使用here中的示例,以便使用c#代码从AWS SecretsManager中检索秘密。

我已经通过AWS CLI在本地设置了凭据,并且能够使用AWS CLI命令“ aws secretsmanager list-secrets”检索机密列表。

但是c#控制台应用程序失败并出现错误:

> Unhandled exception. System.AggregateException: One or more errors occurred. (Unable to get IAM security credentials from EC2 Instance Metadata Service.)
 ---> Amazon.Runtime.AmazonServiceException: Unable to get IAM security credentials from EC2 Instance Metadata Service.
   at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.FetchCredentials()
   at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentials()
   at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentialsAsync()
   at Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.RetryHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.CallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync[T](IExecutionContext executionContext)
   at Amazon.Runtime.Internal.MetricsHandler.InvokeAsync[T](IExecutionContext executionContext)
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
   at AWSConsoleApp2.GetSecretValueFirst.GetSecret() in D:\Work\Projects\Training\AWSConsoleApp2\AWSConsoleApp2\GetSecretValueFirst.cs:line 53
   at AWSConsoleApp2.Program.Main(String[] args) in D:\Work\Projects\Training\AWSConsoleApp2\AWSConsoleApp2\Program.cs:line 11

当我更改原始构造函数调用

IAmazonSecretsManager客户端=新的AmazonSecretsManagerClient();

添加了类型为AWSCredentials的继承参数

IAmazonSecretsManager客户端= new AmazonSecretsManagerClient(new StoredProfileAWSCredentials());

它工作正常。

StoredProfileAWSCredentials类已过时,但可以使用它。我使用的库可以在其他计算机上正常运行,并且无法更改它们。

我为属于Administrators组且对SecretsMnager拥有完全访问权限的用户使用凭据。在C#代码中正确设置了地区,默认是配置文件。

有什么想法吗?感谢前进

7 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,这是我如何在开发环境中修复它

  1. 我使用适用于Visual Studio的AWS扩展创建了一个AWS配置文件
  2. 设置个人资料后,凭据将通过该个人资料传递,并且对我来说效果很好

这里需要注意的是,访问密钥管理器的用户个人资料应为“秘密”管理器分配一个有效的安全组。

尝试一下,让我知道如何进行。

答案 1 :(得分:3)

同一问题,已通过删除$ HOME / .aws / config和凭证文件并使用AWS CLI重新创建来解决。

就我而言,我是将笔记本电脑从Windows切换到新的MBP。我已经通过复制.aws目录文件来设置新环境,并确认AWS CLI可以正常工作。令人困惑的是dotnet SDK失败,出现相同的错误。

答案 2 :(得分:0)

问题不完全是我的问题,但这是google上的首个热门产品,因此我认为我会筹码以防万一。

我在发布时遇到了上述确切错误

dotnet lambda list-layers

dotnet cli似乎使用AWS_PROFILE变量,而不默认为AWS_DEFAULT_PROFILE。在我的公司中,AWS_DEFAULT_PROFILE被映射到身份提供者,因此我没有使用不同的配置文件来管理不同的访问,并且default配置文件为空。解决方法是,像这样运行命令

AWS_PROFILE=$AWS_DEFAULT_PROFILE dotnet lambda list-layers

通过这种方式,CLI将使用正确的凭据。

答案 3 :(得分:0)

运行以下命令并使用 AWS 提供的数据按照提示进行操作:

aws configure

答案 4 :(得分:0)

这个问题我遇到过很多次,但都无法使用上述解决方案来解决。

对我有用的是使用 AWS_PROFILE 环境变量明确设置我的 AWS 配置文件并将其设置为我想要使用的配置文件。

今天我再次遇到了这个问题,即使那也不起作用。最终解决它的是设置 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 环境变量。

我害怕有一天我没有其他方法可以向 AWS 提供凭证。

答案 5 :(得分:0)

确保您安装了最新版本的 EC2config https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/UsingConfig_Install.html

谢谢

答案 6 :(得分:0)

只需在控制面板 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 中添加环境变量。 两者的实际值都不重要。我已将它们都设置为空格 (' ')。 不知道为什么它有效,但它有效。登录似乎需要更长的时间。 似乎 SDK 并没有进入有问题的流程,而是尝试使用环境变量,但失败了,大约在 30 秒左右后按要求登录。

在两台未安装 AWS CLI 或配置任何 AWS 配置文件的不同 Win10 PC 上对其进行了测试。该问题已 100% 重现,并且已修复该问题。