node-ts/bus

bus-sqs is throwing an error when asserting queues

valdestron opened this issue · 1 comments

Hi, I can not see how you are updating an aws sdk client with provided configuration, but seems that current aws-sdk sqs client fails to create queue with provided configuration.

//config.ts

export const sqsConfiguration: SqsTransportConfiguration = {
  queueName,
  queueUrl: `https://sqs.${env.AWS_SQS_REGION}.amazonaws.com/${env.AWS_ACCOUNT_ID}/${queueName}`,
  queueArn: `arn:aws:sqs:${env.AWS_SQS_REGION}:${env.AWS_ACCOUNT_ID}:${queueName}`,

  deadLetterQueueName: `${queueName}-DLQ`,
  deadLetterQueueArn: `arn:aws:sqs:${env.AWS_SQS_REGION}:${env.AWS_ACCOUNT_ID}:${queueName}-DLQ`,

  resolveTopicName: () => `${env.SERVICE_NAME}-${env.SERVICE_INSTANCE_ID}`,

  resolveTopicArn: (topicName: string) =>
    `arn:aws:sns:${env.AWS_SQS_REGION}:${env.AWS_ACCOUNT_ID}:${topicName}`,

  queuePolicy: `
  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Principal": "*",
        "Effect": "Allow",
        "Action": "SQS:*",
        "Resource": [
          "arn:aws:sqs:${env.AWS_SQS_REGION}:${env.AWS_ACCOUNT_ID}:${queueName}"
        ]
      }
    ]
  }
`,
};
//index.ts
import 'reflect-metadata';
import { Container } from 'inversify';
import { LoggerModule } from '@node-ts/logger-core';
import { BUS_SYMBOLS, BusModule, ApplicationBootstrap } from '@node-ts/bus-core';
import { WorkflowRegistry, BusWorkflowModule, BUS_WORKFLOW_SYMBOLS } from '@node-ts/bus-workflow';
import { BUS_SQS_SYMBOLS, BusSqsModule } from '@node-ts/bus-sqs';
import logger from './utils/logger';
import { sqsConfiguration } from './config/aws';

const container = new Container();
container.load(new LoggerModule());
container.load(new BusModule());
container.load(new BusWorkflowModule());
container.load(new BusSqsModule());

container.bind(BUS_SQS_SYMBOLS.SqsConfiguration).toConstantValue(sqsConfiguration);

const bootstrap = async () => {
  const workflows = container.get<WorkflowRegistry>(BUS_WORKFLOW_SYMBOLS.WorkflowRegistry);
  await workflows.initializeWorkflows();

  const appBootstrap = container.get<ApplicationBootstrap>(BUS_SYMBOLS.ApplicationBootstrap);
  await appBootstrap.initialize(container);
  logger.info('Workflows service is listening...');
};

bootstrap().catch(logger.error);
error
qsTransport: SQS queue could not be created { queueName: 'workflows-development-vmworkflowsid-DLQ',
  error:
   { ConfigError: Missing region in config
       at Request.VALIDATE_REGION (/Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/event_listeners.js:92:45)
       at Request.callListeners (/Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/sequential_executor.js:106:20)
       at callNextListener (/Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/sequential_executor.js:96:12)
       at /Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/event_listeners.js:86:9
       at finish (/Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/config.js:372:7)
       at /Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/config.js:390:9
       at SharedIniFileCredentials.get (/Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/credentials.js:127:7)
       at getAsyncCredentials (/Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/config.js:384:24)
       at Config.getCredentials (/Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/config.js:404:9)
       at Request.VALIDATE_CREDENTIALS (/Users/valdasmazrimas/Projects/connectus.we/node_modules/@node-ts/bus-sqs/node_modules/aws-sdk/lib/event_listeners.js:81:26)
     message: 'Missing region in config',
     code: 'ConfigError',
     time: 2019-12-02T13:01:13.355Z } }

Solved,

Seems that:


const queuePrefix = env.SERVICE_NAME;
const queueRoot = !env.SERVICE_PRODUCITON ? 'development' : '';
const queueSuffix = env.SERVICE_INSTANCE_ID;
const queueName = `${queuePrefix}-${queueRoot}-${queueSuffix}`;

process.env.AWS_REGION = env.AWS_SQS_REGION; //add these to process.env
process.env.AWS_ACCOUNT_ID = env.AWS_ACCOUNT_ID; //add these to process.env

export const sqsConfiguration: SqsTransportConfiguration = {
  queueName,
  queueUrl: `https://sqs.${env.AWS_SQS_REGION}.amazonaws.com/${env.AWS_ACCOUNT_ID}/${queueName}`,
  queueArn: `arn:aws:sqs:${env.AWS_SQS_REGION}:${env.AWS_ACCOUNT_ID}:${queueName}`,

  deadLetterQueueName: `${queueName}-DLQ`,
  deadLetterQueueArn: `arn:aws:sqs:${env.AWS_SQS_REGION}:${env.AWS_ACCOUNT_ID}:${queueName}-DLQ`,

  resolveTopicName: () => `${env.SERVICE_NAME}-${env.SERVICE_INSTANCE_ID}`,

  resolveTopicArn: (topicName: string) =>
    `arn:aws:sns:${env.AWS_SQS_REGION}:${env.AWS_ACCOUNT_ID}:${topicName}`,

  queuePolicy: `
  {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Principal": "*",
        "Effect": "Allow",
        "Action": "SQS:*",
        "Resource": [
          "arn:aws:sqs:${env.AWS_SQS_REGION}:${env.AWS_ACCOUNT_ID}:${queueName}"
        ]
      }
    ]
  }
`,
};

Anyways, I think we should be able to provided aws configuration to the container module instead of adding those to env variables.