【问题标题】:.NET Core worker - since enabling Docker Compose my service can't read IAM credentials from appsettings.json.NET Core worker - 由于启用 Docker Compose 我的服务无法从 appsettings.json 读取 IAM 凭据
【发布时间】:2020-04-08 23:11:10
【问题描述】:

我正在构建一个小型 .NET Core 工作器服务来读取来自 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 compose 文件

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”选项在调试中运行时,输出表明它已找到 AWS 凭证?

  Found AWS options in IConfiguration

AWSSDK:信息:在 IConfiguration 中找到 AWS 选项 AWSSDK:信息:使用 AWS SDK 的默认凭证搜索找到凭证

我不确定这个问题还包括什么,但我希望有人能提供帮助。我显然缺少一些配置或选项,以确保可以从我的 appSettings.json 文件中读取访问密钥和密钥。正如我所说,当我从 DockerFile 将它作为单个 docker 容器运行时,它运行良好。

【问题讨论】:

    标签: c# docker .net-core docker-compose appsettings


    【解决方案1】:

    我没有看到您实际指示 AWS 在哪里使用这些凭据,因此我将把它作为一个可能的问题来解决。

    首先,您的 appsettings.json 对于 aws creds 应该采用这种格式:

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

    然后尝试此解决方案(在初始化 aws 服务之前显式设置环境变量)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2022-06-21
      • 2018-05-05
      相关资源
      最近更新 更多