AWS S3 的“ResourceLoader”可以很好地处理这些属性:
cloud:
aws:
s3:
endpoint: s3.amazonaws.com <-- custom endpoint added in spring cloud aws 2.3
credentials:
accessKey: XXXXXX
secretKey: XXXXXX
region:
static: us-east-1
stack:
auto: false
但是,当我在本地启动 localstack 容器并尝试将其与这些属性一起使用时(根据此发行文档:https://spring.io/blog/2021/03/17/spring-cloud-aws-2-3-is-now-available):
cloud:
aws:
s3:
endpoint: http://localhost:4566
credentials:
accessKey: test
secretKey: test
region:
static: us-east-1
stack:
auto: false
我得到这个异常:
17:12:12.130 [reactor-http-nio-2] 错误 org.springframework.boot.autoconfigure.web.reactive.error.AbstractErrorWebExceptionHandler - [23efd000-1] HTTP GET“/getresource/test”的 500 服务器错误
com.amazonaws.SdkClientException:无法执行 HTTP 请求:mybucket.localhost
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1207) ~[aws-java-sdk-core-1.11.951.jar:?]
抑制:reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
在以下站点发现错误:
|_ 检查点 ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
|_ 检查点 ⇢ HTTP GET "/getresource/test" [ExceptionHandlingWebHandler]
堆栈跟踪:
在 com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleRetryableException(AmazonHttpClient.java:1207) ~[aws-java-sdk-core-1.11.951.jar:?]
引起原因:java.net.UnknownHostException:mybucket.localhost
在 java.net.InetAddress$CachedAddresses.get(InetAddress.java:797) ~[?:?]
我可以在 S3 浏览器中查看我的 localstack 存储桶文件,否则效果很好。
这是我的 localstack 的 docker compose 配置:
version: '3.1'
services:
localstack:
image: localstack/localstack:latest
environment:
- AWS_DEFAULT_REGION=us-east-1
- AWS_ACCESS_KEY_ID=test
- AWS_SECRET_ACCESS_KEY=test
- EDGE_PORT=4566
- SERVICES=lambda,s3
ports:
- '4566-4583:4566-4583'
volumes:
- "${TEMPDIR:-/tmp/localstack}:/tmp/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
这是我读取文本文件的方式:
public class ResourceTransferManager {
@Autowired
ResourceLoader resourceLoader;
public void resourceLoadingMethod() throws IOException {
Resource resource = resourceLoader.getResource("s3://mybucket/index.txt");
InputStream inputStream = resource.getInputStream();
System.out.println("File content: " + IOUtils.toString(inputStream, StandardCharsets.UTF_8));
}}