You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LocalStack S3生成PreSignedURL时遇InvalidAccessKeyId错误求助

问题

我通过以下方式创建LocalStack上的S3桶:

docker run -d --name localstack -p 4566:4566 -p 4565:4565 -e SERVICES=s3 localstack/localstack

aws --endpoint-url=http://localhost:4566 s3 mb s3://my_conteiner

随后在ASP.NET Core中用以下代码生成预签名URL:

public string GeneratePresignedUrlAsync(string key)
{
    var request = new GetPreSignedUrlRequest
    {
        BucketName = _options.BucketName,
        Key = key,
        Expires = DateTime.UtcNow.AddHours(_expirationTime)
    };

    return _s3Client.GetPreSignedURL(request);
}

使用的配置如下:

"AWSS3": {
"ServiceURL": "http://localhost:4566",
"AccessKey": "test",
"SecretKey": "test",
"BucketName": "my_conteiner",
"Region": "us-east-1"
}

访问生成的URL时收到错误:

<Error>
<Code>InvalidAccessKeyId</Code>
<Message>The AWS Access Key Id you provided does not exist in our records.</Message>
<AWSAccessKeyId>test</AWSAccessKeyId>
<RequestId>id</RequestId>
<HostId>id 
</HostId>
</Error>

在LocalStack终端执行aws configure list,结果显示所有凭证项均未设置。请问我在构建镜像时是否遗漏了步骤?是否需要更换密钥值?


解决方案

1. 核心原因

LocalStack默认接受任意非空的AccessKey/SecretKey(test/test完全可用),问题出在ASP.NET Core的S3客户端配置不匹配LocalStack的签名和路径规则,和镜像构建步骤无关。

2. 具体修复步骤

(1)修正S3客户端配置

初始化S3客户端时必须添加两个关键配置:强制路径样式访问、指定签名版本,适配LocalStack的特性:

var s3Config = new AmazonS3Config
{
    ServiceURL = configuration["AWSS3:ServiceURL"],
    RegionEndpoint = RegionEndpoint.GetBySystemName(configuration["AWSS3:Region"]),
    // 适配LocalStack的签名规则
    SignatureVersion = "v4",
    // LocalStack默认要求路径样式访问(而非AWS默认的虚拟主机样式)
    ForcePathStyle = true
};

var s3Client = new AmazonS3Client(
    configuration["AWSS3:AccessKey"],
    configuration["AWSS3:SecretKey"],
    s3Config);

(2)可选:跳过LocalStack签名验证

如果不想处理签名配置,可以在启动LocalStack容器时添加环境变量完全跳过签名校验:

docker run -d --name localstack -p 4566:4566 -p 4565:4565 \
-e SERVICES=s3 \
-e AWS_ACCESS_KEY_ID=test \
-e AWS_SECRET_ACCESS_KEY=test \
-e DISABLE_SIGNATURE_VALIDATION=1 \
localstack/localstack

(3)关于容器内aws configure list的说明

容器内执行该命令显示无凭证是正常的——你是通过外部aws命令带--endpoint-url参数调用LocalStack,容器内的aws cli未配置不影响外部应用的请求,无需额外处理。

3. 验证方法

生成预签名URL后,用curl测试:

curl "生成的预签名URL"

若仍报错,检查:

  • 桶名拼写是否正确(你配置的是my_conteiner)
  • 预签名URL中的端点是否指向localhost:4566
  • 客户端是否已设置ForcePathStyle = true

内容的提问来源于stack exchange,提问作者Silny ToJa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:52:30