[英]AWS DotNet SDK Error: Unable to get IAM security credentials from EC2 Instance Metadata Service
我使用此處的一個示例,以便在 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 客戶端 = new AmazonSecretsManagerClient();
添加類型為 AWSCredentials 的繼承參數
IAmazonSecretsManager 客戶端 = new AmazonSecretsManagerClient(new StoredProfileAWSCredentials());
它工作正常。
Class StoredProfileAWSCredentials 已過時,但可以正常使用。 我使用的庫在其他機器上可以正常工作,而且我無法更改它們。
我為屬於 Administrators 組且具有對 SecretsMnager 的完全訪問權限的用戶使用憑據。 區域已在c#代碼中設置好,配置文件是默認的。
有任何想法嗎? 感謝您的提前
我有同樣的問題,這是我在開發環境中修復它的方法
這里需要注意的是,訪問密鑰管理器的用戶配置文件應該為 Secrets 管理器分配一個有效的安全組。
試一試告訴我,結果如何。
同樣的問題並通過刪除 $HOME/.aws/config 和憑證文件並使用 AWS CLI 重新創建來解決。
就我而言,我正在將筆記本電腦從 Windows 切換到新的 MBP。 我通過復制 .aws 目錄文件設置了我的新環境,並確認 AWS CLI 工作正常。 令人困惑的是,dotnet SDK 因相同的錯誤而失敗。
使用 AWS 提供的數據運行以下命令並按照提示操作:
aws configure
我已經多次遇到這個問題,但無法使用上述解決方案解決它。
對我有用的是使用AWS_PROFILE
環境變量明確設置我的 AWS 配置文件並將其設置為我想要使用的配置文件。
今天我又遇到了這個問題,即使這樣也沒有用。 最終解決它的是設置AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
環境變量。
我害怕有一天我用盡了向 AWS 提供憑證的替代方法。
我有同樣的問題,並通過將 Visual Studio 中的 AWS 配置文件的名稱更改為默認值來解決它。
這個問題不完全是我的問題,但它是谷歌的第一次點擊,所以我想我會以防萬一。
發出時我得到了確切的上述錯誤
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 將使用正確的憑據。
確保您安裝了最新版本的 EC2config https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/UsingConfig_Install.html
謝謝
只需在控制面板 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 中添加環境變量。 兩者的實際值都不重要。 我已將它們都設置為空格('')。 不知道為什么它有效,但它有效。 登錄似乎確實需要更長的時間。似乎 SDK 沒有進入錯誤的流程,而是嘗試使用 env vars,失敗並且大約在 30 秒左右后根據需要登錄。
在沒有安裝 AWS CLI 或配置任何 AWS 配置文件的兩台不同的 Win10 PC 上對其進行了測試。 該問題已 100% 重新創建,並且所描述的 w/a 已修復該問題。
我遇到了同樣的問題,結果證明是因為我的credentials
文件中有AWS_ACCESS_KEY_ID
、 AWS_SECRET_ACCESS_KEY
和AWS_SESSION_TOKEN
大寫。 將鍵更改為小寫為我解決了這個問題。
由於 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
這導致我們看到作者看到的錯誤。
概括:
在項目 defaults.json 中,驗證profile
值。 就我而言,它是空"profile": ""
。 設置配置文件名稱后,能夠發布
我正在通過 IIS 將 dot net core web 應用程序部署到本地服務器,並且遇到了同樣的問題。 無論我做什么,應用程序都無法識別我通過 AWS CLI (aws configure) 配置的憑證。
我最終通過 Windows 環境變量使用我的密鑰設置 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY 並重新啟動服務器。
以下文章對了解 AWS SDK 憑據加載客戶端工廠非常有幫助https://www.stevejgordon.co.uk/credential-loading-and-the-aws-sdk-for-dotnet-deep-dive
在我的情況下,配置和憑據文件已在 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 商店。
我在使用 AWS 的 .NET core 5 中遇到了同樣的問題,我通過以下方式解決了它:
我有什么:
我在 C:\Users\.aws 中有配置和憑據文件。
在初始化 AWS 選項后的 StartUp.cs中,我添加了:
#if Debuge
options.Profile="default";
options.ProfileLocations="C:\\Users\\.aws\\credentials";
#endif
如果有人在使用 docker-compose 並收到此錯誤,我將其添加到我的 docker-compose.override.yml 文件中,並且它能夠讀取我的憑據
volumes:
- ~/.aws/:/root/.aws:ro
我遇到了同樣的問題 - Amazon.Runtime.AmazonServiceException:“無法從 EC2 實例元數據服務獲取 IAM 安全憑證。”
我正在使用 Dot Net Core 微服務,我收到了這個錯誤。
解決方案 - 我刪除了所有不同設置文件(如 appsettings.Debug.json 和 appsettings.Development.json)中提到的 AWS 憑證路徑。
此 AWS 憑證路徑應僅在文件 appsettings.json 中提及。 從所有其他文件中刪除。
將此發布在這里,因為這至少是我第二次通過自我造成的錯誤配置導致錯誤。
VS 2022
AWS Toolkit 1.38.0.0
現有答案均無效,但它們確實指出了一些配置問題。 這些配置設置中的一項或多項確實/可能導致錯誤:
使用 AWS Toolkit Explorer 定義配置文件時,請確保選擇了正確的配置文件。
就個人而言,我不再定義default
配置文件。 我對所有憑據使用命名配置文件。 這在處理多個配置文件(我至少有 10 個以上)時特別有用。
我發現在本地(或作為服務)運行 AWS 進程的最一致的方法是設置AWS_PROFILE
環境變量。 例子:
Environment.SetEnvironmentVariable( "AWS_PROFILE", "<profle_name>", EnvironmentVariableTarget.Process );
在這種特殊情況下,我使用了一個已更改的舊配置文件名稱。 換句話說,如果您使用環境變量來設置AWS_PROFILE
,請確保配置文件名稱是正確的。
使用環境變量方法時,請勿為AWS_REGION
設置環境變量。 正確定義配置文件時, AWS_PROFILE
定義區域。
正確配置后,應該不需要任何其他 AWS 環境變量。 甚至沒有空變量:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.