【问题标题】:AWS DotNet SDK Error: Unable to get IAM security credentials from EC2 Instance Metadata ServiceAWS DotNet SDK 错误:无法从 EC2 实例元数据服务获取 IAM 安全凭证
【发布时间】:2020-03-23 14:01:34
【问题描述】:

我使用来自 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 客户端 = 新 AmazonSecretsManagerClient(new StoredProfileAWSCredentials());

效果很好。

Class StoredProfileAWSCredentials 已过时,但可以使用它。我使用在其他机器上正常工作的库,我无法更改它们。

我使用属于 Administrators 组并具有 SecretsMnager 完全访问权限的用户的凭据。 C#代码中已正确设置区域,配置文件为默认值。

有什么想法吗?感谢提前

【问题讨论】:

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


    【解决方案1】:

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

    1. 我使用适用于 Visual Studio 的 AWS 扩展创建了一个 AWS 配置文件
    2. 设置配置文件后,凭据将使用配置文件传递,它对我来说工作正常

    这里要注意一点,访问密钥管理器的用户配置文件应该为 Secrets manager 分配一个有效的安全组。

    试试吧,告诉我结果如何。

    【讨论】:

    • 谢谢。它有帮助。我有由 AWS CLI 创建的包含所需数据的配置文件,但 SDK 显然无法读取它
    • 这里需要注意的是,访问密钥管理器的用户配置文件应该有一个为Secrets manager分配的有效安全组。什么?
    【解决方案2】:

    同样的问题并通过删除 $HOME/.aws/config 和凭证文件并使用 AWS CLI 重新创建得到解决。

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

    【讨论】:

    • 和你一样,在将 .aws 文件夹复制到新笔记本电脑后,我在 Visual Studio 项目中遇到此错误。我删除了该文件夹,使用aws configure 重新创建了默认部分的文件夹和文件,我手动复制了我的其他部分(即除默认之外的配置文件)并且它有效。
    【解决方案3】:

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

    aws configure
    

    【讨论】:

      【解决方案4】:

      我已经多次遇到此问题,但无法使用上述解决方案解决。

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

      今天我又遇到了这个问题,即使这样也没有用。最终解决它的是设置 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 环境变量。

      我害怕有一天我会用尽其他方法来向 AWS 提供凭据。

      【讨论】:

      • 谢谢!!在 Visual Studio 2019 项目属性(在“调试”选项卡中)提供 AWS_PROFILE 环境变量立即有助于使用我的自定义配置文件进行身份验证。我的示例应用是 .NET Core 3.1。 AWS CLI 配置文件存储在 Windows 10 上的 %USERPROFILE%\.aws\credentials 文件中)。以前,我尝试使用代码Amazon.AWSConfigs.AWSProfileName = "Client200"; 设置配置文件失败,导致上述异常。
      【解决方案5】:

      我遇到了同样的问题,并通过将 Visual Studio 中的 AWS 配置文件的名称更改为默认名称来解决它。

      【讨论】:

        【解决方案6】:

        这个问题并不完全是我的问题,但它是谷歌上的第一个问题,所以我想我会以防万一。

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

        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 将使用正确的凭据。

        【讨论】:

          【解决方案7】:

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

          谢谢

          【讨论】:

          • 我安装了 EC2Launch 并运行了我的服务,它从 SecretsManager 返回了密钥。但只有一次。后来它再次抛出相同的异常
          【解决方案8】:

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

          在两台没有安装 AWS CLI 或配置任何 AWS 配置文件的不同 Win10 PC 上对其进行了测试。该问题已 100% 重新创建,并且所描述的 w/a 已修复它。

          【讨论】:

            【解决方案9】:

            在项目 defaults.json 中,验证 profile 值。就我而言,它是空的"profile": ""。设置配置文件名称后,可以发布

            【讨论】:

              【解决方案10】:

              我正在通过 IIS 将 dot net core web 应用程序部署到本地服务器,并且遇到了同样的问题。无论我做什么,应用程序都不会识别我通过 AWS CLI (aws configure) 配置的凭证。

              我最终通过 Windows 环境变量使用我的密钥设置 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 并重新启动服务器。

              以下文章对了解 AWS 开发工具包凭证加载客户端工厂非常有帮助 https://www.stevejgordon.co.uk/credential-loading-and-the-aws-sdk-for-dotnet-deep-dive

              【讨论】:

                【解决方案11】:

                我遇到了同样的问题,原来是因为我的 credentials 文件中有 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN 大写。将键更改为小写为我解决了这个问题。

                【讨论】:

                  【解决方案12】:

                  由于 AWS 开发工具包凭证配置引起了很多麻烦,我将介绍一些上下文。首先,如果您使用的是 dotnet core,请使用 AWSSDK.Extensions.NETCore.Setup 包 (https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-netcore.html),它将尊重您的 appsettings.json。

                  {
                    "AWS": {
                      "Region": "eu-west-1",
                      "Profile": "theprofileyouwantouse"
                    }
                  }
                  

                  csproj:

                    <ItemGroup>
                      <PackageReference Include="AWSSDK.Extensions.NETCore.Setup" Version="3.7.1" />
                      <PackageReference Include="AWSSDK.SecurityToken" Version="3.7.1.71" />
                    </ItemGroup>
                  

                  例子:

                  var config = host.Services.GetService<IConfiguration>();
                  var options = config.GetAWSOptions();
                  using var client = options.CreateServiceClient<IAmazonSecurityTokenService>();
                  var result = await client.GetCallerIdentityAsync(new Amazon.SecurityToken.Model.GetCallerIdentityRequest { });
                  

                  这将尝试在 ~/AppData/Local/AWSToolkit 中获取加密凭证,然后根据您的共享配置文件 (~/.aws/config)。截至 2021 年 11 月,它不再使用版本 1 共享凭证文件 (~/.aws/credentials) 中的 aws_access_key_id、aws_secret_access_key、aws_session_token*

                  接下来,如果您承担的角色是 AWS SSO,您的 csproj 文件中需要以下包:

                      <PackageReference Include="AWSSDK.SSO" Version="3.7.0.94" />
                      <PackageReference Include="AWSSDK.SSOOIDC" Version="3.7.0.94" />
                  

                  *如果您碰巧将您的凭据反向添加到您的共享凭据文件 (~/.aws/credentials) 作为 [profile myprofile] 而不仅仅是 [myprofile] SDK 将不会像您预期的那样运行,因此请删除它。如果您的凭据文件没问题,那么您不必触摸它,但请记住,如果在该文件中找到缓存的凭据,SDK 将不会使用它。

                  现在,作者没有使用 AWSSDK.Extensions.NETCore.Setup 包,这意味着我们得到的凭证解析路径略有不同。最重要的是:不尊重 appsettings.json,这意味着您必须指定要以不同方式使用的配置文件,例如使用 AWS_PROFILE 环境变量。

                  其次,我们直接登陆 FallbackCredentialsFactory.cs,它在解析凭据时执行此操作:

                              CredentialsGenerators = new List<CredentialsGenerator>
                              {
                  #if BCL
                                  () => new AppConfigAWSCredentials(),            // Test explicit keys/profile name first.
                  #endif
                                  () => AssumeRoleWithWebIdentityCredentials.FromEnvironmentVariables(),
                                  // Attempt to load the default profile.  It could be Basic, Session, AssumeRole, or SAML.
                                  () => GetAWSCredentials(credentialProfileChain),
                                  () => new EnvironmentVariablesAWSCredentials(), // Look for credentials set in environment vars.
                                  () => ECSEC2CredentialsWrapper(proxy),      // either get ECS credentials or instance profile credentials
                              };
                  
                  

                  现在解析凭据“ECSEC2”的最后一步有一个回退,它返回:

                  DefaultInstanceProfileAWSCredentials.Instance

                  这导致了作者看到的错误。

                  总结:

                  1. 如果您不使用 AWSSDK.Extensions.NETCore.Setup,请在 launch.json 或 launchSettings.json 中使用 ENV 变量指定配置文件(如果您要使用作者这样的默认构造函数)
                  2. 如果需要,请记住添加 AWS SSO 包

                  【讨论】:

                    【解决方案13】:

                    在我的情况下,配置和凭据文件已在 C:/Users//.aws 文件夹中正确设置,因此默认情况下应该可以找到它们。但是,在之前的项目中,我在 C:/Users//AppData/Local/AWSToolkit 中设置了不同的凭证(不再有效),在 AWS 文档中称为 AWS SDK Store。始终首先检查 SDK 存储,然后回退到默认用户凭据文件。请参阅以下内容: https://aws.amazon.com/blogs/developer/referencing-credentials-using-profiles/。在我的案例中,最简单的解决方案就是删除 AWSToolkit 文件夹中的文件。作为替代方案,我可以正确设置 SDK 商店。

                    【讨论】:

                      猜你喜欢
                      • 2021-01-11
                      • 1970-01-01
                      • 1970-01-01
                      • 2018-11-22
                      • 2017-04-22
                      • 1970-01-01
                      • 2022-01-15
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多