. NET Основной работник - с момента включения Docker Создать, что мой сервис не может читать учетные данные IAM из настроек приложения. json - PullRequest
0 голосов
/ 09 апреля 2020

Я создаю небольшую. NET Базовую рабочую службу для чтения сообщений из AWS очереди SQS. Для этого требуются учетные данные IAM в форме доступа и секретного ключа. Первоначально я выполнял этот проект как docker контейнер, и он работал нормально. Я хотел включить возможность запуска этого контейнера несколько раз, поэтому несколько экземпляров одного и того же сервиса. Я включил Docker Compose в Visual Studio, и он добавил базовый 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"]

Вот файл docker compose, созданный Visual Studio

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");
        }
    }
}

И моя конфигурация загружается из appSettings. json в Program.cs

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', вывод показывает, что она нашел AWS учетные данные?

  Found AWS options in IConfiguration

AWSSDK: Информация: найдено AWS параметров в IConfiguration AWSSDK: Информация: Найдены учетные данные с помощью поиска учетных данных AWS SDK по умолчанию

Я не уверен, что еще включить с этим вопросом, но я надеюсь, что кто-то может помочь. Я явно пропускаю некоторые настройки или опции, которые гарантируют, что доступ и секретный ключ могут быть прочитаны из моего файла appSettings. json. Как я уже сказал, это работало нормально, когда я запускал его как один docker контейнер из моего DockerFile.

...