簡體   English   中英

AWS DotNet SDK 錯誤:無法從 EC2 實例元數據服務獲取 IAM 安全憑證

[英]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#代碼中設置好,配置文件是默認的。

有任何想法嗎? 感謝您的提前

我有同樣的問題,這是我在開發環境中修復它的方法

  1. 我使用適用於 Visual Studio 的 AWS 擴展創建了一個 AWS 配置文件
  2. 設置配置文件后,使用配置文件傳遞憑據,對我來說效果很好

這里需要注意的是,訪問密鑰管理器的用戶配置文件應該為 Secrets 管理器分配一個有效的安全組。

試一試告訴我,結果如何。

同樣的問題並通過刪除 $HOME/.aws/config 和憑證文件並使用 AWS CLI 重新創建來解決。

就我而言,我正在將筆記本電腦從 Windows 切換到新的 MBP。 我通過復制 .aws 目錄文件設置了我的新環境,並確認 AWS CLI 工作正常。 令人困惑的是,dotnet SDK 因相同的錯誤而失敗。

使用 AWS 提供的數據運行以下命令並按照提示操作:

aws configure

我已經多次遇到這個問題,但無法使用上述解決方案解決它。

對我有用的是使用AWS_PROFILE環境變量明確設置我的 AWS 配置文件並將其設置為我想要使用的配置文件。

今天我又遇到了這個問題,即使這樣也沒有用。 最終解決它的是設置AWS_ACCESS_KEY_IDAWS_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_IDAWS_SECRET_ACCESS_KEYAWS_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

這導致我們看到作者看到的錯誤。

概括:

  1. 如果您不使用 AWSSDK.Extensions.NETCore.Setup,請在 launch.json 或 launchSettings.json 中使用 ENV 變量指定配置文件,如果您要像作者一樣使用默認構造函數
  2. 如果需要,請記住添加 AWS SSO 包

在項目 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 工具包資源管理器

使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM