AWS DotNet SDK Error: Unable to get IAM security credentials from EC2 Instance Metadata Service

AWS DotNet SDK Error: Unable to get IAM security credentials from EC2 Instance Metadata Service

我使用 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 client = new AmazonSecretsManagerClient();

添加了 AWSCredentials 类型的继承参数

IAmazonSecretsManager client = new AmazonSecretsManagerClient(new StoredProfileAWSCredentials());

它工作正常。

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

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

有什么想法吗?感谢提前

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

  1. 我使用 Visual studio
  2. 的 AWS 扩展创建了一个 AWS 配置文件
  3. 设置配置文件后,使用配置文件传递凭据,对我来说效果很好

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

试一试让我知道结果如何。

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

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

这个问题不完全是我的问题,但它是 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 将使用正确的凭据。

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

aws configure

我已经 运行 多次遇到这个问题,但无法使用上述解决方案解决它。

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

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

我害怕有一天我 运行 无法通过其他方式向 AWS 提供凭证。

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

谢谢

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

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

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

我正在通过 IIS 将点网核心 Web 应用程序部署到本地服务器,但遇到了完全相同的问题。无论我做什么,应用程序都无法识别我通过 AWS CLI (aws configure) 配置的凭据。

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

下面这篇文章对理解AWS SDK凭证加载Client Factory很有帮助 https://www.stevejgordon.co.uk/credential-loading-and-the-aws-sdk-for-dotnet-deep-dive

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

由于 AWS SDK 凭据配置引起了很多麻烦,我将介绍一些上下文。首先,如果您使用的是 dotnet 核心,请使用 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”的最后一步有一个回退 returns 这个:

DefaultInstanceProfileAWSCredentials.Instance

这导致我们发现了作者所看到的错误。

总结:

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

在我的例子中,配置和凭据文件已在 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 商店。

在项目 defaults.json 中,验证 profile 值。在我的例子中它是空的 "profile": ""。设置个人资料名称后,能够发布

我在使用 AWS 的 .NET Core 5 中遇到了同样的问题,我通过以下方式解决了它:

我有什么:

我在 C:\Users\.aws 中有配置和凭证文件。

StartUp.cs 初始化 AWS 选项后我添加了:

#if Debuge
   options.Profile="default";
   options.ProfileLocations="C:\Users\.aws\credentials";
#endif