簡體   English   中英

.NET 核心工作者 - 因為啟用 Docker 撰寫我的服務無法從 appsettings.json 讀取 IAM 憑證

[英].NET Core worker - since enabling Docker Compose my service can't read IAM credentials from appsettings.json

我正在構建一個小型 .NET 核心工作人員服務來讀取來自 AWS SQS 隊列的消息。 為此,它需要采用訪問和密鑰形式的 IAM 憑證。 我最初將這個項目作為 docker 容器運行,並且運行良好。 我想啟用多次運行此容器的能力,因此同一服務的多個實例。 我在 Visual Studio 中啟用了 Docker Compose 並將基礎 docker compose YAML 文件添加到項目中。 現在,當我嘗試在調試中運行解決方案時,出現以下錯誤:

An exception of type 'Amazon.Runtime.AmazonServiceException' occurred in System.Private.CoreLib.dll but was not handled in user code: 'Unable to get IAM security credentials from EC2 Instance Metadata Service.'

我假設這是因為不知何故現在解決方案無法從我的 appSettings.json 讀取訪問密鑰和密鑰,但我不確定如何解決這個問題。

這是我的 DockerFile

FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["WorkerServiceDocker.csproj", ""]
RUN dotnet restore "./WorkerServiceDocker.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "WorkerServiceDocker.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WorkerServiceDocker.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
RUN mkdir -p /app/logging
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WorkerServiceDocker.dll"]

這是由 Visual Studio 創建的 docker 撰寫文件

version: '3.4'

services:
  workerservicedocker:
    image: ${DOCKER_REGISTRY-}workerservicedocker
    build:
      context: .
      dockerfile: Dockerfile

失敗的方法是:

public async void TriggerMessageGetAsync(string queueUrl, int pollingTime)
{
    var _messages = await GetMessagesAsync(queueUrl, pollingTime);
    if (_messages.Count == 0)
    {
        _logger.LogInformation($"No messages found.");
    }
    else
    {
        foreach (var message in _messages)
        {
            _logger.LogInformation($"Message {message.MessageId} received OK");
        }
    }
}

我的配置是從 Program.cs 中的 appSettings.json 加載的

public class Program
{
    public static void Main(string[] args)
    {
        Session.InstanceGuid = Guid.NewGuid().ToString();

        File.Create("init.log").Close();
        var logWriter = new StreamWriter("init.log");
        logWriter.WriteLine("Assembly Path: " + Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
        logWriter.WriteLine($"Session Guid: {Session.InstanceGuid}");
        logWriter.WriteLine($"Container DateTime: {DateTime.Now}");
        logWriter.Dispose(); 
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
                services.AddSingleton<ILogger, Logger>(); // Using my own basic wrapper around NLog for the moment, pumped to CloudWatch.
                services.AddAWSService<IAmazonSQS>();
            });
}

當我使用“Docker Compose”選項在調試中運行時,output 表明它已找到 AWS 憑證?

  Found AWS options in IConfiguration

AWSSDK:信息:在 IConfiguration 中找到 AWS 選項 AWSSDK:信息:使用 AWS 開發工具包的默認憑證搜索找到憑證

我不確定這個問題還包括什么,但我希望有人能提供幫助。 我顯然缺少一些配置或選項,以確保可以從我的 appSettings.json 文件中讀取訪問密鑰和密鑰。 正如我所說,當我從我的 DockerFile 將它作為單個 docker 容器運行時,它運行良好。

我沒有看到您實際指示 AWS 在哪里使用這些憑證,因此我將把它作為一個可能的問題來解決。

首先,您的 appsettings.json 對於 aws 憑據應該采用以下格式:

"AWS": {        
    "AccessKey": "abc",         
    "SecretKey": "xyz",         
    "Region": "ksjs"    
},

然后嘗試此解決方案(在初始化 aws 服務之前顯式設置環境變量)

https://github.com/aws/aws-sdk-net/issues/499#issuecomment-276142625

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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