docker 上使用 .NET S3 SDK 的 Localstack 抛出 "The AWS Access Key Id you provided does not exist in our records."

Localstack on docker with .NET S3 SDK throws "The AWS Access Key Id you provided does not exist in our records."

我正在尝试为本地 S3 实例设置 localstack。尝试执行任何操作时出现错误:

AmazonS3Exception: The AWS Access Key Id you provided does not exist in our records.

docker-compose 是:

version: '3.4'

services:
  myapp.api:
    image: ${DOCKER_REGISTRY-}myapp/api
    container_name: "myapp-api"
    build:
      context: .
      dockerfile: MyApp.Api/MyApp.Api/Dockerfile
    ports:
      - "8080:80"
    environment:
      - AWS_ACCESS_KEY_ID=root
      - AWS_SECRET_ACCESS_KEY=pass
  myapp.s3:
    image: localstack/localstack:latest
    container_name: "myapp-localstack"
    ports:
      - "14566:4566"
    environment: 
      - SERVICES=s3
      - DEFAULT_REGION=eu-west-2
      - AWS_REGION=us-west-2
      - DEBUG=1
    user: root

MyApp 是整个解决方案的名称,MyApp.Api 是一个 ASP.NET Core 3.1 项目。没有自定义网络,所有容器 运行 在由 docker-compose.

创建的默认网络上

与 S3 交互的代码如下所示:

[ApiController]
[Route("[controller]")]
public class TestS3Controller : ControllerBase
{
    [HttpGet]
    [Route("")]
    public async Task<IActionResult> GetAsync()
    {
        using var client = new AmazonS3Client(new AmazonS3Config
        {
            ServiceURL = "https://myapp.s3:4566",
            RegionEndpoint = RegionEndpoint.EUWest2,
            ForcePathStyle = true
        });
        
        var bucket = await client.PutBucketAsync(new PutBucketRequest
        {
            BucketName = "myapp-test-bucket",
            BucketRegion = S3Region.EUW2
        }).ConfigureAwait(false);

        ... // snip
    }
}

AWSSDK.S3版本为3.3.113.2。等待 PutBucketAsync 任务会引发上述异常。我能找到的所有资源都告诉我访问密钥 ID 和密钥可以是任何东西,只要它们不为空即可,但它似乎是假的。

此外,我已经从 amazon/dynamodb-local:latest 图像中 运行 安装了一个容器,它需要环境变量中定义的 root/pass 凭据,并且它们正常工作。我可以确认凭据 已加载,这是因为本地 DynamoDB 可以正常工作,并且手动实例化 EnvironmentAWSCredentials 会产生 root/pass。从 myapp.api 中删除环境变量会引发与无法获取任何凭据的 AWSSKD 相关的不同异常(我没有定义 .aws 配置文件)。

MyApp 的 Dockerfile 是由 Visual Studio 为 ASP.NET Core 生成的标准文件,用于构建项目并启动 MyApp.Api.dll 作为入口点。

感谢任何允许我在本地使用 S3 存储桶的解决方案,只要它有效,我真的不关心清洁度,因为它仅用于本地开发。

在 localstack 代码库中有几个 github 问题线程的讨论。

使用

ForcePathStyle = true

参考文献:

https://github.com/localstack/localstack/issues/2092

https://github.com/localstack/localstack/issues/942#issuecomment-427327889