1

Good day all,

i am finding a difficulty on publishing messages using node js code through an API gateway POST to SNS using the filtering policy (message attributes) which is set to service_type in SQS and SNS

so the messgae should be sent to a specific queue based on the filter i am having, my current set up is as follows

mapping template

Action=Publish##
&TopicArn=$util.urlEncode('arn:....fifo')##
&Message=$util.urlEncode($input.json('$.Message'))##
&Subject=$util.urlEncode($input.json('$.Subject'))##
&MessageAttributes.member.1.Name=service_type##
&MessageAttributes.member.1.Value.DataType=String##
&MessageAttributes.member.1.Value.StringValue=$util.escapeJavaScript($input.json('$.ServiceTypeValue'))##


URL Query String Parameters

MessageAttribute.entry.1.Name   'service_type'       
MessageAttributes.entry.1.Value.DataType    'String'         
MessageAttributes.entry.1.Value.StringValue 'order'

node js code

const axios = require('axios');

let url = `apiurl`;
//let message_attribute ={ message_attribute:'order'};
let payload = {
  message: 'First Message',
  MessageAttributes: {
    service_type: {
      DataType: 'String',
      StringValue: 'order',
      BinaryValue: null
    }
  }
};

axios
  .post(url, payload)
  .then(function (response) {
    console.log(response.data);
  })
  .catch(function (error) {
    console.log(error);
  });

your help would be much appreciated

Aws
  • 11
  • 1

1 Answers1

0

For API Gateway and SQS integration, create a response template like below (OpenAPI spec yaml),

        requestTemplates:
          application/x-www-form-urlencoded: "Action=SendMessage&MessageBody=$util.base64Encode($input.body)\
            &MessageAttribute.1.Name=type&MessageAttribute.1.Value.StringValue=xyz&MessageAttribute.1.Value.DataType=String\
            &MessageAttribute.2.Name=encoding&MessageAttribute.2.Value.StringValue=base64&MessageAttribute.2.Value.DataType=String\
            &MessageAttribute.3.Name=sourceIp&MessageAttribute.3.Value.StringValue=$context.identity.sourceIp&MessageAttribute.3.Value.DataType=String\
            &MessageAttribute.4.Name=apiTimestamp&MessageAttribute.4.Value.StringValue=$context.requestTimeEpoch&MessageAttribute.4.Value.DataType=Number"

Below is the integration with SNS(Note: replace {{topicArn}} to the ARN of SNS topic),

requestTemplates:
          application/x-www-form-urlencoded: "Action=Publish&Message=$util.base64Encode($input.body)\
            &TopicArn={{topicArn}}\
            &MessageAttributes.entry.1.Name=type&MessageAttributes.entry.1.Value.StringValue=xyz&MessageAttributes.entry.1.Value.DataType=String\
            &MessageAttributes.entry.2.Name=encoding&MessageAttributes.entry.2.Value.StringValue=base64&MessageAttributes.entry.2.Value.DataType=String\
            &MessageAttributes.entry.3.Name=sourceIp&MessageAttributes.entry.3.Value.StringValue=$context.identity.sourceIp&MessageAttributes.entry.3.Value.DataType=String\
            &MessageAttributes.entry.4.Name=apiTimestamp&MessageAttributes.entry.4.Value.StringValue=$context.requestTimeEpoch&MessageAttributes.entry.4.Value.DataType=Number"
Kane
  • 8,035
  • 7
  • 46
  • 75