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# 代码中正确设置,配置文件是默认的。
有什么想法吗?感谢提前
我遇到了同样的问题,这是我在我的开发环境中修复它的方法
- 我使用 Visual studio
的 AWS 扩展创建了一个 AWS 配置文件
- 设置配置文件后,使用配置文件传递凭据,对我来说效果很好
这里要注意一点,访问密钥管理器的用户配置文件应该有一个为 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_ID
和 AWS_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_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_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
这导致我们发现了作者所看到的错误。
总结:
- 如果您不使用 AWSSDK.Extensions.NETCore.Setup,请在 launch.json 或 launchSettings.json 中使用 ENV 变量指定配置文件,如果您打算像作者一样使用默认构造函数
- 记得在需要时添加 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
我使用 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# 代码中正确设置,配置文件是默认的。
有什么想法吗?感谢提前
我遇到了同样的问题,这是我在我的开发环境中修复它的方法
- 我使用 Visual studio 的 AWS 扩展创建了一个 AWS 配置文件
- 设置配置文件后,使用配置文件传递凭据,对我来说效果很好
这里要注意一点,访问密钥管理器的用户配置文件应该有一个为 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_ID
和 AWS_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_ID
、AWS_SECRET_ACCESS_KEY
和 AWS_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
这导致我们发现了作者所看到的错误。
总结:
- 如果您不使用 AWSSDK.Extensions.NETCore.Setup,请在 launch.json 或 launchSettings.json 中使用 ENV 变量指定配置文件,如果您打算像作者一样使用默认构造函数
- 记得在需要时添加 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