Sou bastante novo no AWS e no Docker.
No meu ambiente de desenvolvimento local, quero carregar arquivos do servidor de aplicativos e colocá-los no LocalStack S3. No entanto, quando tento acessar o LocalStack S3 a partir do servidor de aplicativos, ocorre o seguinte erro.
AggregateError [ECONNREFUSED]:
at internalConnectMultiple (node:net:1139:18)
at afterConnectMultiple (node:net:1712:7) {
code: 'ECONNREFUSED',
'$metadata': { attempts: 3, totalRetryDelay: 105 },
[errors]: [
Error: connect ECONNREFUSED ::1:4566
at createConnectionError (node:net:1675:14)
at afterConnectMultiple (node:net:1705:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '::1',
port: 4566
},
Error: connect ECONNREFUSED 127.0.0.1:4566
at createConnectionError (node:net:1675:14)
at afterConnectMultiple (node:net:1705:16) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 4566
}
]
}
A configuração do docker-compose é a seguinte. Usei este link como referência.
version: '3'
services:
test-app:
build:
dockerfile: Dockerfile
context: .
args:
- VARIANT=22-bookworm
container_name: test-app
stdin_open: true
dns:
# Set the DNS server to be the LocalStack container
- 10.0.2.20
networks:
- ls
localstack:
container_name: localstack
image: localstack/localstack
ports:
- "4566:4566"
- "4510-4559:4510-4559"
environment:
- SERVICES=s3
networks:
ls:
# Set the container IP address in the 10.0.2.0/24 subnet
ipv4_address: 10.0.2.20
networks:
ls:
ipam:
config:
# Specify the subnet range for IP address allocation
- subnet: 10.0.2.0/24
O aplicativo é executado no NestJS e o S3Client é inicializado e injetado com o seguinte trecho de código:
import { S3Client } from '@aws-sdk/client-s3';
import type { Provider } from '@nestjs/common';
export const S3_CLIENT_TOKEN = 'S3Client';
export const s3ClientProvider: Provider = {
provide: S3_CLIENT_TOKEN,
useValue: new S3Client({
endpoint: 'https://localhost.localstack.cloud:4566',
region: 'ap-northeast-1',
credentials: {
accessKeyId: '',
secretAccessKey: '',
},
}),
};
O Controlador trabalha com o seguinte trecho de código:
@Post()
async uploadFile(
@AuthorizedUser() _user: User,
@UploadedFile() file: Express.Multer.File,
): Promise<void> {
const command = new PutObjectCommand({
Bucket: 'test',
Key: file.filename,
Body: await readFile(file.path),
});
const response = await this.s3Client.send(command);
return;
}
Alguém pode me ajudar com isso? Agradeço desde já :)
Eu esperava um erro de cesta inexistente em vez de um erro de rede, ou que o upload do arquivo fosse bem-sucedido.
Tentei os passos neste link, mas não obtive os resultados esperados.
Como em qualquer outro lugar no Docker, o endereço IP especial 127.0.0.1 refere-se ao "contêiner atual", e não ao seu outro contêiner. O AWS S3 oficial usa um esquema em que diferentes buckets são diferenciados pelo nome do host, e a principal função do
localhost.localstack.cloud
serviço externo é permitir que a resolução de DNS continue funcionando se você estiver usando esse sistema.No Docker, para se conectar ao localstack S3, você precisa
Então seu bloco de configuração deve ser parecido com
Com isso, você pode remover muitas das configurações do seu arquivo Compose. Você não precisa configurar manualmente o DNS do contêiner; não precisa substituir os nomes dos contêineres gerados pelo Compose; o
localstack
nome do host funciona desde que ambos os contêineres estejam na mesma rede, incluindo adefault
rede que o Compose cria automaticamente; e assim por diante. Você provavelmente pode reduzir o arquivo Compose para apenas