Este módulo está pensado para ser utilizado en NestJS Starter, o cualquier proyecto que utilice una configuración centralizada, siguiendo la misma arquitectura del starter.
- 🥳 Demo
- 📝 Requerimientos básicos
- 🛠️ Instalar dependencia
- ⚙️ Configuración
- 👨💻 Uso
- 📄 Changelog
- 📜 License MIT
- NestJS Starter
- Node.js v20.18.0 or higher (Download)
- YARN v1.22.19 or higher
- NPM v10.9.0 or higher
- NestJS v10.4.7 or higher (Documentación)
npm install -S @tresdoce-nestjs-toolkit/aws-sqs
yarn add @tresdoce-nestjs-toolkit/aws-sqs
Agregar los datos de la configuración de AWS Simple Queue Service en configuration.ts
utilizando el key sqs que obtenga los datos desde las variables de entorno.
//./src/config/configuration.ts
import { Typings } from '@tresdoce-nestjs-toolkit/paas';
import { registerAs } from '@nestjs/config';
export default registerAs('config', (): Typings.AppConfig => {
return {
//...
sqs: {
region: process.env.AWS_REGION,
endpoint: process.env.AWS_SQS_ENDPOINT,
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
},
queues: [
{
name: process.env.AWS_SQS_QUEUE_NAME_1,
url: process.env.AWS_SQS_QUEUE_URL_1,
},
{
name: process.env.AWS_SQS_QUEUE_NAME_2,
url: process.env.AWS_SQS_QUEUE_URL_2,
},
//...
],
},
//...
};
});
💬 Para ver en detalle todas las propiedades de la configuración, hace clic acá.
region
: Es la region de la cuenta de AWS.
- Type:
String
- Values:
us-east-1
endpoint
: Es el contexto de AWS y se utiliza para especificar la URL del servicio al que se quiere conectar.
- Type:
String
- Values:
https://sqs.us-east-1.amazonaws.com | http://localhost:4566
Credenciales de la cuenta de AWS
accessKeyId
: Es el Access Key ID de aws.
- Type:
String
- Default:
test
secretAccessKey
: Es el Secret Access Key de aws.
- Type:
String
- Default:
test
queues
: Es la lista de las colas creadas en AWS SQS, cada item requiere del nombre y la url de la cola.
- Type:
Array
Importar el AwsSqsModule
en el archivo app.module.ts
, y el módulo se encargará de obtener la configuración y realizar la connexion automáticamente.
//./src/app.module.ts
import { AwsSqsModule } from '@tresdoce-nestjs-toolkit/aws-sqs';
@Module({
//...
imports: [
//...
AwsSqsModule,
//...
],
//...
})
export class AppModule {}
También es posible configurar el módulo de manera sincrónica y asincrónica utilizando los métodos register, registerAsync, forRoot y forRootAsync.
El AwsSqsService
es el núcleo de la integración con AWS SQS. Este servicio proporciona los métodos necesarios para
enviar, recibir y eliminar mensajes de las colas de SQS, asegurando una gestión eficiente de los mismos.
Envía un mensaje a la cola especificada. Si el cuerpo es un objeto, se serializa como JSON.
Parameters | Description | Required |
---|---|---|
queueName | Nombre de la cola | true |
messageBody | Mensaje (puede ser un objeto o string) | true |
delaySeconds | Retraso en segundos | false |
messageAttributes | Atributos adicionales | false |
groupId | ID del grupo para colas FIFO | false |
deduplicationId | ID de deduplicación para FIFO | false |
import { AwsSqsService } from '@tresdoce-nestjs-toolkit/aws-sqs';
@Injectable()
export class OrdersService {
constructor(private awsSqsService: AwsSqsService) {}
//...
async sendOrder(): Promise<void> {
await this.awsSqsService.sendMessage({
queueName: 'orders',
messageBody: { orderId: 123, product: 'Laptop' },
delaySeconds: 5,
});
}
//...
}
Recibe mensajes de la cola especificada. Devuelve los mensajes recibidos o un array vacío si no hay mensajes.
Parameters | Description | Required |
---|---|---|
queueName | Nombre de la cola | true |
maxNumberOfMessages | Número máximo de mensajes a recibir. | true |
waitTimeSeconds | Tiempo de espera para recibir mensajes. | false |
import { AwsSqsService } from '@tresdoce-nestjs-toolkit/aws-sqs';
@Controller()
export class OrdersController {
constructor(private awsSqsService: AwsSqsService) {}
//...
@Get('receive-order')
async receiveOrder(): Promise<any> {
const messages = await this.sqsService.receiveMessage('orders', 5, 10);
if (messages.length > 0) {
messages.forEach((msg) => console.log('Received message:', msg.Body));
return messages;
} else {
console.log('No messages available.');
return { message: 'No messages available' };
}
}
//...
}
Elimina un mensaje utilizando su ReceiptHandle`.
Parameters | Description | Required |
---|---|---|
queueName | Nombre de la cola | true |
receiptHandle | Handle del mensaje | true |
import { AwsSqsService } from '@tresdoce-nestjs-toolkit/aws-sqs';
@Controller()
export class OrdersController {
constructor(private awsSqsService: AwsSqsService) {}
//...
@Get('receive-order')
async receiveOrder(): Promise<any> {
const messages = await this.awsSqsService.receiveMessage('orders');
await this.awsSqsService.deleteMessage('orders', messages[0].ReceiptHandle!);
console.log('Message deleted');
}
//...
}
Utilizar el decorador @AwsSqsMessageHandler(<QueueName>)
a nivel endpoint para poder obtener los mensajes de la cola y automatizar procesos.
import { AwsSqsMessageHandler } from '@tresdoce-nestjs-toolkit/aws-sqs';
export class Orders {
//...
@AwsSqsMessageHandler('orders')
async handleOrderMessage(message: any) {
console.log(`Received message: ${JSON.stringify(message)}`);
// Resto del código para procesar el mensaje
}
//...
}
LocalStack es una excelente herramienta para probar servicios de AWS en un entorno local. A continuación, encontrarás una breve guía sobre cómo usar AWS SQS en LocalStack con ejemplos prácticos de comandos.
Asegúrate de tener configurada la CLI de AWS y de usar el endpoint local para conectarte a LocalStack.
Para las credenciales de AWS usa como valor test, para la region usa us-east-1 y para la output json.
aws configure --profile localstack
aws --endpoint-url=http://localhost:4566 sqs create-queue --queue-name orders
aws --endpoint-url=http://localhost:4566 sqs list-queues
aws --endpoint-url=http://localhost:4566 sqs send-message --queue-url http://localhost:4566/000000000000/orders --message-body "Order 123: Laptop"
aws --endpoint-url=http://localhost:4566 sqs receive-message --queue-url http://localhost:4566/000000000000/orders
{
"Messages": [
{
"MessageId": "12345",
"ReceiptHandle": "abc123",
"Body": "Order 123: Laptop"
}
]
}
aws --endpoint-url=http://localhost:4566 sqs delete-message --queue-url http://localhost:4566/000000000000/orders --receipt-handle <receipt-handle>
Reemplaza con el valor real devuelto al recibir el mensaje.
aws --endpoint-url=http://localhost:4566 sqs delete-message --queue-url http://localhost:4566/000000000000/orders --receipt-handle abc123
aws --endpoint-url=http://localhost:4566 sqs delete-queue --queue-url http://localhost:4566/000000000000/orders
Usa este método cuando tienes la configuración del módulo lista al momento de inicializar la aplicación.
import { AwsSqsModule } from '@tresdoce-nestjs-toolkit/aws-sqs';
@Module({
//...
imports: [
//...
AwsSqsModule.register({
region: 'us-east-1',
endpoint: 'https://sqs.us-east-1.amazonaws.com',
credentials: {
accessKeyId: 'test',
secretAccessKey: 'test',
},
queues: [
{ name: 'orders', url: 'https://sqs.us-east-1.amazonaws.com/123456789/orders' },
{
name: 'notifications',
url: 'https://sqs.us-east-1.amazonaws.com/123456789/notifications',
},
],
}),
//...
],
//...
})
export class AppModule {}
- Se utiliza cuando toda la configuración es conocida de antemano.
- Los parámetros como region, endpoint, credentials y las colas se pasan directamente en el momento de la configuración.
Usa este método si necesitas cargar configuraciones de forma asíncrona, por ejemplo, desde un servicio de configuración.
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AwsSqsModule } from '@tresdoce-nestjs-toolkit/aws-sqs';
@Module({
//...
imports: [
//...
AwsSqsModule.registerAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => configService.get('config.sqs'),
inject: [ConfigService],
}),
//...
],
//...
})
export class AppModule {}
- Ideal para entornos complejos donde los valores se cargan de un servicio como
ConfigService
. - El uso de
useFactory
permite inicializar la configuración de manera asíncrona.
Este método hace que el módulo esté disponible en toda la aplicación sin necesidad de importarlo explícitamente en cada módulo.
import { AwsSqsModule } from '@tresdoce-nestjs-toolkit/aws-sqs';
@Module({
//...
imports: [
//...
AwsSqsModule.forRoot({
region: 'us-east-1',
endpoint: 'https://sqs.us-east-1.amazonaws.com',
credentials: {
accessKeyId: 'test',
secretAccessKey: 'test',
},
queues: [
{ name: 'orders', url: 'https://sqs.us-east-1.amazonaws.com/123456789/orders' },
{
name: 'notifications',
url: 'https://sqs.us-east-1.amazonaws.com/123456789/notifications',
},
],
}),
//...
],
//...
})
export class AppModule {}
- Este método expone el módulo de manera global para que no sea necesario importarlo en cada módulo donde se necesite.
- Útil para aplicaciones con múltiples módulos que requieren acceso a AWS SQS.
Usa este método si deseas que el módulo sea global, pero necesitas cargar la configuración de manera asíncrona.
import { ConfigModule, ConfigService } from '@nestjs/config';
import { AwsSqsModule } from '@tresdoce-nestjs-toolkit/aws-sqs';
@Module({
//...
imports: [
//...
AwsSqsModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => configService.get('config.sqs'),
inject: [ConfigService],
}),
//...
],
//...
})
export class AppModule {}
- Global y Asíncrona: El módulo estará disponible en toda la aplicación y cargará la configuración de forma asíncrona.
- Recomendado cuando la configuración depende de variables de entorno o servicios externos.
Todos los cambios notables de este paquete se documentarán en el archivo Changelog.