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
我正在尝试为本地 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