Giter Site home page Giter Site logo

sns's Introduction

Build Status codecov Docker Pulls

Fake SNS

Fake Amazon Simple Notification Service (SNS) for testing. Supports:

  • Create/List/Delete topics
  • Subscribe endpoint
  • Publish message
  • Subscription persistence
  • Integrations with (Fake-)SQS, File, HTTP, RabbitMQ, Slack

Usage

Docker

Based on the official java:8-jre-alpine image. Run it with the command:

docker run -d -p 9911:9911 s12v/sns

If you would like to keep the topic/subscription database in the current host folder:

docker run -d -p 9911:9911 -v "$PWD":/etc/sns s12v/sns

Using aws-cli

The image has aws-cli preinstalled. For example, create a topic:

docker exec <CONTAINER_ID> sh -c 'aws sns --endpoint-url http://localhost:9911 create-topic --name test1'

Jar

Download the latest release from https://github.com/s12v/sns/releases and run:

DB_PATH=/tmp/db.json java -jar sns-0.2.0.jar

Requires Java8.

Configuration

Configuration can be set via environment variables:

  • DB_PATH - path to subscription database file, default: db.json
  • HTTP_INTERFACE - interface to bind to, default: 0.0.0.0
  • HTTP_PORT - tcp port, default: 9911

Supported integrations

  • Amazon SQS: aws-sqs://queueName?amazonSQSEndpoint=...&accessKey=&secretKey=
  • RabbitMQ: rabbitmq://hostname[:port]/exchangeName[?options]
  • HTTP: http:hostName[:port][/resourceUri][?options]
  • File: file://tmp?fileName=sns1.txt
  • Slack: slack:@username?webhookUrl=https://hooks.slack.com/services/aaa/bbb/ccc

See camel documentation for more details.

Note: Environment variables can be used to specify URIs via {{env:ENV_NAME}}.

Example: aws-sqs://{{env:QUEUE_NAME}}?amazonSQSEndpoint={{env:SQS_ENDPOINT}}&...

Example fake SQS integration:

Tested with elasticmq. See example/docker-compose.yml and example/config/db.json

docker run -d -p 9911:9911 -v "$PWD/example/config":/etc/sns s12v/sns

Development

Unit tests

sbt test

Integration tests

It's tested with AWS Ruby and PHP SDKs. Start elasticmq for SQS integration tests with

docker run -d -p 9324:9324 s12v/elasticmq

Ruby SDK tests:

bundle install
ENDPOINT=http://localhost:9911 bundle exec cucumber

PHP SDK tests:

composer install
./bin/behat

sns's People

Contributors

agnaldo4j avatar akhilpanchal avatar ankon avatar janderson007 avatar janjaali avatar jononu avatar philgebhardt avatar s12v avatar sam-io avatar slobo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sns's Issues

Exception when starting JAR

I'm running a JAR file this way DB_PATH=~/tmp/snsdb.json java -jar ~/_my/_prog/_dev/sns-0.1.3.jar, and it seems to fail with these exceptions:

[WARN] [03/17/2017 20:47:49.820] [main] [EventStream(akka://sns)] Logger log1-Slf4jLogger did not respond within Timeout(5000 milliseconds) to InitializeLogger(bus)
error while starting up loggers
akka.ConfigurationException: Logger specified in config can't be loaded [akka.event.slf4j.Slf4jLogger] due to [akka.event.Logging$LoggerInitializationException: Logger log1-Slf4jLogger did not respond with LoggerInitialized, sent instead [TIMEOUT]]
	at akka.event.LoggingBus$$anonfun$4$$anonfun$apply$1.applyOrElse(Logging.scala:118)
	at akka.event.LoggingBus$$anonfun$4$$anonfun$apply$1.applyOrElse(Logging.scala:117)
	at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
	at scala.util.Failure$$anonfun$recover$1.apply(Try.scala:216)
	at scala.util.Try$.apply(Try.scala:192)
	at scala.util.Failure.recover(Try.scala:216)
	at akka.event.LoggingBus$$anonfun$4.apply(Logging.scala:117)
	at akka.event.LoggingBus$$anonfun$4.apply(Logging.scala:112)
	at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:683)
	at scala.collection.Iterator$class.foreach(Iterator.scala:893)
	at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
	at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
	at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
	at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:682)
	at akka.event.LoggingBus$class.startDefaultLoggers(Logging.scala:112)
	at akka.event.EventStream.startDefaultLoggers(EventStream.scala:28)
	at akka.actor.LocalActorRefProvider.init(ActorRefProvider.scala:667)
	at akka.actor.ActorSystemImpl.liftedTree2$1(ActorSystem.scala:648)
	at akka.actor.ActorSystemImpl._start$lzycompute(ActorSystem.scala:645)
	at akka.actor.ActorSystemImpl._start(ActorSystem.scala:645)
	at akka.actor.ActorSystemImpl.start(ActorSystem.scala:661)
	at akka.actor.ActorSystem$.apply(ActorSystem.scala:142)
	at akka.actor.ActorSystem$.apply(ActorSystem.scala:109)
	at me.snov.sns.Main$.delayedEndpoint$me$snov$sns$Main$1(Main.scala:21)
	at me.snov.sns.Main$delayedInit$body.apply(Main.scala:20)
	at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
	at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
	at scala.App$$anonfun$main$1.apply(App.scala:76)
	at scala.App$$anonfun$main$1.apply(App.scala:76)
	at scala.collection.immutable.List.foreach(List.scala:381)
	at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
	at scala.App$class.main(App.scala:76)
	at me.snov.sns.Main$.main(Main.scala:20)
	at me.snov.sns.Main.main(Main.scala)
Caused by: akka.event.Logging$LoggerInitializationException: Logger log1-Slf4jLogger did not respond with LoggerInitialized, sent instead [TIMEOUT]
	at akka.event.LoggingBus$class.akka$event$LoggingBus$$addLogger(Logging.scala:187)
	at akka.event.LoggingBus$$anonfun$4$$anonfun$apply$4.apply(Logging.scala:116)
	at akka.event.LoggingBus$$anonfun$4$$anonfun$apply$4.apply(Logging.scala:115)
	at scala.util.Success$$anonfun$map$1.apply(Try.scala:237)
	at scala.util.Try$.apply(Try.scala:192)
	at scala.util.Success.map(Try.scala:237)
	at akka.event.LoggingBus$$anonfun$4.apply(Logging.scala:115)
	... 27 more
Exception in thread "main" akka.ConfigurationException: Could not start logger due to [akka.ConfigurationException: Logger specified in config can't be loaded [akka.event.slf4j.Slf4jLogger] due to [akka.event.Logging$LoggerInitializationException: Logger log1-Slf4jLogger did not respond with LoggerInitialized, sent instead [TIMEOUT]]]
	at akka.event.LoggingBus$class.startDefaultLoggers(Logging.scala:146)
	at akka.event.EventStream.startDefaultLoggers(EventStream.scala:28)
	at akka.actor.LocalActorRefProvider.init(ActorRefProvider.scala:667)
	at akka.actor.ActorSystemImpl.liftedTree2$1(ActorSystem.scala:648)
	at akka.actor.ActorSystemImpl._start$lzycompute(ActorSystem.scala:645)
	at akka.actor.ActorSystemImpl._start(ActorSystem.scala:645)
	at akka.actor.ActorSystemImpl.start(ActorSystem.scala:661)
	at akka.actor.ActorSystem$.apply(ActorSystem.scala:142)
	at akka.actor.ActorSystem$.apply(ActorSystem.scala:109)
	at me.snov.sns.Main$.delayedEndpoint$me$snov$sns$Main$1(Main.scala:21)
	at me.snov.sns.Main$delayedInit$body.apply(Main.scala:20)
	at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
	at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
	at scala.App$$anonfun$main$1.apply(App.scala:76)
	at scala.App$$anonfun$main$1.apply(App.scala:76)
	at scala.collection.immutable.List.foreach(List.scala:381)
	at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
	at scala.App$class.main(App.scala:76)
	at me.snov.sns.Main$.main(Main.scala:20)
	at me.snov.sns.Main.main(Main.scala)
20:47:50.024 [sns-akka.actor.default-dispatcher-4] INFO  akka.event.slf4j.Slf4jLogger - Slf4jLogger started

Multiple subscriptions

I'm trying to test a scenario where there are 2 sqs subscriptions for sns topic.

Config example:

{
"version": 1,
"timestamp": 1532431046709,
"subscriptions": [{
"arn": "70429848-6855-49a8-9c76-4d55984c39ff",
"topicArn": "arn:aws:sns:us-east-1:123456789012:test1",
"endpoint": "aws-sqs://foo?amazonSQSEndpoint=http://sqs:9324&accessKey=&secretKey=",
"owner": "",
"protocol": "sqs"
}, {
"arn": "4202c521-0639-4389-a8c9-0f487483c620",
"topicArn": "arn:aws:sns:us-east-1:123456789012:test1",
"endpoint": "aws-sqs://bar?amazonSQSEndpoint=http://sqs:9324&accessKey=&secretKey=",
"owner": "",
"protocol": "sqs"
}],
"topics": [{
"arn": "arn:aws:sns:us-east-1:123456789012:test1",
"name": "test1"
}]
}

Getting the following error:

11:48:25.186 [sns-akka.actor.default-dispatcher-2] ERROR akka.actor.OneForOneStrategy - InvalidParameterValue; see the SQS docs. (Service: AmazonSQS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 00000000-0000-0000-0000-000000000000)
sns_1 | akka.camel.AkkaCamelException: InvalidParameterValue; see the SQS docs. (Service: AmazonSQS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 00000000-0000-0000-0000-000000000000)
sns_1 | at akka.camel.ProducerSupport$$anonfun$produce$1.applyOrElse(Producer.scala:77) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.Actor.aroundReceive(Actor.scala:517) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.Actor.aroundReceive$(Actor.scala:515) ~[sns.jar:0.4.1]
sns_1 | at me.snov.sns.actor.ProducerActor.aroundReceive(ProducerActor.scala:14) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.ActorCell.receiveMessage(ActorCell.scala:527) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.ActorCell.invoke(ActorCell.scala:496) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.Mailbox.run(Mailbox.scala:224) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.Mailbox.exec(Mailbox.scala:234) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) ~[sns.jar:0.4.1]
sns_1 | Caused by: com.amazonaws.services.sqs.model.AmazonSQSException: InvalidParameterValue; see the SQS docs. (Service: AmazonSQS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 00000000-0000-0000-0000-000000000000)
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1639) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1304) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.services.sqs.AmazonSQSClient.doInvoke(AmazonSQSClient.java:2013) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:1989) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.services.sqs.AmazonSQSClient.executeSendMessage(AmazonSQSClient.java:1594) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.services.sqs.AmazonSQSClient.sendMessage(AmazonSQSClient.java:1571) ~[sns.jar:0.4.1]
sns_1 | at org.apache.camel.component.aws.sqs.SqsProducer.process(SqsProducer.java:62) ~[sns.jar:0.4.1]
sns_1 | at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[sns.jar:0.4.1]
sns_1 | at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) ~[sns.jar:0.4.1]
sns_1 | at akka.camel.ProducerSupport$ProducerChild.produce(Producer.scala:141) ~[sns.jar:0.4.1]
sns_1 | at akka.camel.ProducerSupport$ProducerChild$$anonfun$receive$1.applyOrElse(Producer.scala:115) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.Actor.aroundReceive(Actor.scala:517) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.Actor.aroundReceive$(Actor.scala:515) ~[sns.jar:0.4.1]
sns_1 | at akka.camel.ProducerSupport$ProducerChild.aroundReceive(Producer.scala:112) ~[sns.jar:0.4.1]
sns_1 | ... 9 common frames omitted
sns_1 | 11:48:25.190 [sns-akka.actor.default-dispatcher-2] ERROR akka.actor.OneForOneStrategy - InvalidParameterValue; see the SQS docs. (Service: AmazonSQS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 00000000-0000-0000-0000-000000000000)
sns_1 | akka.camel.AkkaCamelException: InvalidParameterValue; see the SQS docs. (Service: AmazonSQS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 00000000-0000-0000-0000-000000000000)
sns_1 | at akka.camel.ProducerSupport$$anonfun$produce$1.applyOrElse(Producer.scala:77) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.Actor.aroundReceive(Actor.scala:517) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.Actor.aroundReceive$(Actor.scala:515) ~[sns.jar:0.4.1]
sns_1 | at me.snov.sns.actor.ProducerActor.aroundReceive(ProducerActor.scala:14) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.ActorCell.receiveMessage(ActorCell.scala:527) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.ActorCell.invoke(ActorCell.scala:496) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.Mailbox.run(Mailbox.scala:224) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.Mailbox.exec(Mailbox.scala:234) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) ~[sns.jar:0.4.1]
sns_1 | at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) ~[sns.jar:0.4.1]
sns_1 | Caused by: com.amazonaws.services.sqs.model.AmazonSQSException: InvalidParameterValue; see the SQS docs. (Service: AmazonSQS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 00000000-0000-0000-0000-000000000000)
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1639) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1304) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.services.sqs.AmazonSQSClient.doInvoke(AmazonSQSClient.java:2013) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:1989) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.services.sqs.AmazonSQSClient.executeSendMessage(AmazonSQSClient.java:1594) ~[sns.jar:0.4.1]
sns_1 | at com.amazonaws.services.sqs.AmazonSQSClient.sendMessage(AmazonSQSClient.java:1571) ~[sns.jar:0.4.1]
sns_1 | at org.apache.camel.component.aws.sqs.SqsProducer.process(SqsProducer.java:62) ~[sns.jar:0.4.1]
sns_1 | at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[sns.jar:0.4.1]
sns_1 | at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) ~[sns.jar:0.4.1]
sns_1 | at akka.camel.ProducerSupport$ProducerChild.produce(Producer.scala:141) ~[sns.jar:0.4.1]
sns_1 | at akka.camel.ProducerSupport$ProducerChild$$anonfun$receive$1.applyOrElse(Producer.scala:115) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.Actor.aroundReceive(Actor.scala:517) ~[sns.jar:0.4.1]
sns_1 | at akka.actor.Actor.aroundReceive$(Actor.scala:515) ~[sns.jar:0.4.1]
sns_1 | at akka.camel.ProducerSupport$ProducerChild.aroundReceive(Producer.scala:112) ~[sns.jar:0.4.1]
sns_1 | ... 9 common frames omitted

Are mobile push notifications supported?

Hi,

I'm trying to create a platform application for sending mobile push notifications, but I get a default message bad. Are mobile push notifications supported?

aws sns --endpoint-url http://localhost:9911 --region foo create-platform-application --name bar --platform baz --attributes '{"qux":"norf"}'
Unable to parse response (syntax error: line 1, column 0), invalid XML received:
b'Hello, Akka'

Thanks,

Tom

Subscriptions: Message HTTP body is missing various fields

The JSON body contains some fields such as MessageId, Message, and Type, but other fields are missing.

The PHP SNS SDK requires all of these fields [1] and throws an exception if any are missing:

  • Message
  • MessageId
  • Timestamp
  • TopicArn
  • Type
  • Signature
  • SigningCertURL or SigningCertUrl
  • SignatureVersion

In my implementation I'm already skipping signing for non-production (my other sns testing tools don't sign the requests) but the fields would still need to exist for the Message object to be constructed, such as via Message::fromRawPostData method.

In my "manually trigger sns handler" testing code code, I'm using the following field values:

Field Value
MessageId guid
Signature EXAMPLE
SignatureVersion 1
SigningCertURL http://example.com
Timestamp current unix time, i.e. php gmdate('c')
TopicArn arn:aws:sns:us-west-2:123456789012:MyTopic but the actual topic would be better
Type Notification

I think I can see how to patch these other fields in, so I might have a go at it myself.

[1] https://github.com/aws/aws-php-sns-message-validator/blob/master/src/Message.php#L11

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 287: ordinal not in range(128)

Hi,

Using windows 10, docker 18.03-1, default windows charset
docker exec -it 48a842ec1d8eed260fa4bb8a6b1e91e6964ceba72dbe6f0e2730d29d3661563e /bin/sh -c
'aws sns --endpoint-url http://localhost:9911 create-topic --name test1'

==============================================
Traceback (most recent call last):
File "/usr/bin/aws", line 27, in
sys.exit(main())
File "/usr/bin/aws", line 23, in main
return awscli.clidriver.main()
File "/usr/lib/python2.7/site-packages/awscli/clidriver.py", line 59, in main
rc = driver.main()
File "/usr/lib/python2.7/site-packages/awscli/clidriver.py", line 233, in main
write_exception(e, outfile=get_stderr_text_writer())
File "/usr/lib/python2.7/site-packages/awscli/utils.py", line 194, in write_exception
outfile.write(six.text_type(ex))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 287: ordinal not in range(128)

how change python ascii charset or windows client charset ???

wins:> chcp 65001
default charset utf-8

Empty Body Sent to HTTP Subscribers

Sending messages to http subscribers do not work. A POST request is made to the endpoint, but no data is sent in the body. However, the content-length header is set the expected value as if a message was sent. I got the same result for two different http servers: netcat and server.js (nodejs express wrapper). Additionally, I confirmed messages sent to the same topic but different types of subscribers (i.e. file protocol) does work as expected.

command sent

aws sns --endpoint-url http://localhost:9911 publish --topic-arn arn:aws:sns:us-east-1:1465414804035:test-topic --message "test"

verbose logging of received msg from sns

POST /message HTTP/1.1
MessageExchangeId: 9a874dc5-3dc5-477f-90d2-4c4dd6e77c35
x-amz-sns-message-id: 9a874dc5-3dc5-477f-90d2-4c4dd6e77c35
x-amz-sns-message-type: Notification
x-amz-sns-subscription-arn: 6df4ed2b-a650-4f7c-910a-1a89c7cae5a6
x-amz-sns-topic-arn: arn:aws:sns:us-east-1:1465414804035:test-topic
User-Agent: Jakarta Commons-HttpClient/3.1
Host: subscriber:8010
Content-Length: 91

# no body data?

environment setup

./docker-compose.yml

version: "3.4"
services:
  sns:
    image: s12v/sns
    environment:
    - SUBSCRIBER_HTTP=subscriber:8010
    ports:
    - 9911:9911
    volumes:
    - ./sns:/etc/sns
  subscriber:
    image: subfuzion/netcat
    ports:
    - 8010:8010
    command: "-vl 8010"

./sns/db.json

{
    "version": 1,
    "timestamp": 1465414804110,
    "subscriptions": [
        {
            "arn": "6df4ed2b-a650-4f7c-910a-1a89c7cae5a6",
            "topicArn": "arn:aws:sns:us-east-1:1465414804035:test-topic",
            "endpoint": "http:{{env:SUBSCRIBER_HTTP}}/message",
            "owner": "",
            "protocol": "http"
        }
    ],
    "topics": [
        {
            "arn": "arn:aws:sns:us-east-1:1465414804035:test-topic",
            "name": "tms-session-api-events"
        }
    ]
}

Use a consistent account id for topic ARN

Would you be open to accepting a PR to support this? We have some static configurations across our development team and would like the topics to be created with a consistent ARN. Right now it's using timestamp for the account id, which is obviously not consistent.

I was thinking it could pull an environment variable or fall back to the timestamp if the environment variable isn't set.

Let me know what you think.

Ability to filter subscriptions

Is it possible to filter subscriptions i.e. messages with "cluster:c1" would only go to the c1 queue? Currently I have the subscriptions created in db.json but this seems too coarse for our needs.

Thanks.

Region: Not able to change the region.

I am trying to set different region other than us-east-1 using"aws configuration" using below command:

AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: us-east-2
Default output format [None]:

It's happening because of hardcoded topic in https://github.com/s12v/sns/blob/a15a2bbec5a97071d0682f5ff1dd2123cdd18bfd/src/main/scala/me/snov/sns/actor/SubscribeActor.scala

val topic = Topic(s"arn:aws:sns:us-east-1:123456789012:$name", name)

Is there other way to change the region?

License

I'm unable to find any licensing for the code, is there an intended one or could one be added?

SNS errors when publishing to a FIFO queue

With the following config for sqs

include classpath("application.conf")

node-address {
  host = sqs
}

queues {
  queue1 {
    fifo = true
  }
}

And the following config for sns

{
  "version": 1,
  "timestamp": 1465414804110,
  "subscriptions": [
    {
      "arn": "e9126059-9eab-4b37-8194-e0d64dfb2045",
      "topicArn": "arn:aws:sns:us-east-1:1465414804035:test1",
      "endpoint": "aws-sqs://queue1?amazonSQSEndpoint=http://sqs:9324&accessKey=&secretKey=",
      "owner": "",
      "protocol": "sqs"
    },
  "topics": [
    {
      "arn": "arn:aws:sns:us-east-1:1465414804035:test1",
      "name": "test1"
    }
  ]
}

When I publish a message
AWS_DEFAULT_REGION=us-west-2 AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar aws sns --endpoint-url http://localhost:9911 publish --topic-arn arn:aws:sns:us-west-2:1465414804035:test1 --message 'TEST'

I receive the following errors (which are unhelpful). The exact same configuration with the fifo=true commented out works as expected. I'm not sure which parameter value is the issue as it's not giving me sufficient details

sns_1                       | akka.camel.AkkaCamelException: InvalidParameterValue; see the SQS docs. (Service: AmazonSQS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 00000000-0000-0000-0000-000000000000)
sns_1                       |   at akka.camel.ProducerSupport$$anonfun$produce$1.applyOrElse(Producer.scala:77) ~[sns.jar:0.4.1]
sns_1                       |   at akka.actor.Actor.aroundReceive(Actor.scala:517) ~[sns.jar:0.4.1]
sns_1                       |   at akka.actor.Actor.aroundReceive$(Actor.scala:515) ~[sns.jar:0.4.1]
sns_1                       |   at me.snov.sns.actor.ProducerActor.aroundReceive(ProducerActor.scala:14) ~[sns.jar:0.4.1]
sns_1                       |   at akka.actor.ActorCell.receiveMessage(ActorCell.scala:527) ~[sns.jar:0.4.1]
sns_1                       |   at akka.actor.ActorCell.invoke(ActorCell.scala:496) ~[sns.jar:0.4.1]
sns_1                       |   at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) ~[sns.jar:0.4.1]
sns_1                       |   at akka.dispatch.Mailbox.run(Mailbox.scala:224) ~[sns.jar:0.4.1]
sns_1                       |   at akka.dispatch.Mailbox.exec(Mailbox.scala:234) ~[sns.jar:0.4.1]
sns_1                       |   at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) ~[sns.jar:0.4.1]
sns_1                       |   at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) ~[sns.jar:0.4.1]
sns_1                       |   at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) ~[sns.jar:0.4.1]
sns_1                       |   at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) ~[sns.jar:0.4.1]
sns_1                       | Caused by: com.amazonaws.services.sqs.model.AmazonSQSException: InvalidParameterValue; see the SQS docs. (Service: AmazonSQS; Status Code: 400; Error Code: InvalidParameterValue; Request ID: 00000000-0000-0000-0000-000000000000)
sns_1                       |   at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1639) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1304) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.services.sqs.AmazonSQSClient.doInvoke(AmazonSQSClient.java:2013) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.services.sqs.AmazonSQSClient.invoke(AmazonSQSClient.java:1989) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.services.sqs.AmazonSQSClient.executeSendMessage(AmazonSQSClient.java:1594) ~[sns.jar:0.4.1]
sns_1                       |   at com.amazonaws.services.sqs.AmazonSQSClient.sendMessage(AmazonSQSClient.java:1571) ~[sns.jar:0.4.1]
sns_1                       |   at org.apache.camel.component.aws.sqs.SqsProducer.process(SqsProducer.java:62) ~[sns.jar:0.4.1]
sns_1                       |   at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[sns.jar:0.4.1]
sns_1                       |   at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) ~[sns.jar:0.4.1]
sns_1                       |   at akka.camel.ProducerSupport$ProducerChild.produce(Producer.scala:141) ~[sns.jar:0.4.1]
sns_1                       |   at akka.camel.ProducerSupport$ProducerChild$$anonfun$receive$1.applyOrElse(Producer.scala:115) ~[sns.jar:0.4.1]
sns_1                       |   at akka.actor.Actor.aroundReceive(Actor.scala:517) ~[sns.jar:0.4.1]
sns_1                       |   at akka.actor.Actor.aroundReceive$(Actor.scala:515) ~[sns.jar:0.4.1]
sns_1                       |   at akka.camel.ProducerSupport$ProducerChild.aroundReceive(Producer.scala:112) ~[sns.jar:0.4.1]
sns_1                       |   ... 9 common frames omitted

"TopicArn is required" when sending SMS message

When I try to publish an SMS message, I get an error 400 with "TopicArn is required", which is not actually the case with the SNS API (sending an individual SMS just requires a PhoneNumber).

Docker SNS is not able to publish message to another docker instance via docker link

I have a very basic docker-compose configuration, with 2 nodes. nodejs docker is linked via docker link as well as dependency

  • fake-sns
  • nodejs (as a subscriber)

The following are the api calls I'm using to test.

Create new topic

aws sns --endpoint-url http://socialcrm.dev:9911 create-topic --name mrt_rules_
{
    "TopicArn": "arn:aws:sns:us-east-1:1485239739350:mrt_rules"
}

Export ARN into env

ARN=arn:aws:sns:us-east-1:1485239739350:mrt_rules ; export ARN

Subscribe nodejs to topic

aws sns --endpoint-url http://socialcrm.dev:9911 subscribe --topic-arn $ARN --protocol http --notification-endpoint http:mrt_rules:8080/sns
{
    "SubscriptionArn": "89540363-acaf-47f6-945b-e86bc03b94d1"
}

Post new message

aws sns --endpoint-url http://socialcrm.dev:9911 publish --topic-arn $ARN --message "New message"
{
    "MessageId": "c6e10fb4-6891-4522-bf2e-e4906091d783"
}

And I get the following errors in Akka (with debug turned on)

06:50:18.125 [sns-akka.actor.default-dispatcher-20] DEBUG akka.io.TcpListener - New connection accepted
06:50:18.132 [sns-akka.actor.default-dispatcher-14] WARN  akka.actor.ActorSystemImpl - Illegal request header: Illegal 'authorization' header: Invalid input '/', expected tchar, OWS, listSep or 'EOI' (line 1, column 49): AWS4-HMAC-SHA256 Credential=AKIAJRU7EX22W6MFQFAA/20170124/ap-southeast-2/sns/aws4_request, SignedHeaders=host;x-amz-date, Signature=a41a998abb3a6c7c25ec4cfd8b9b16aa12888e3497c4a620440b472dc74db3e5
                                                ^
06:50:18.142 [sns-akka.actor.default-dispatcher-15] DEBUG me.snov.sns.actor.SubscribeActor - Sending message c6e10fb4-6891-4522-bf2e-e4906091d783 to http:mrt_rules:8080/sns
06:50:18.143 [sns-akka.actor.default-dispatcher-15] DEBUG me.snov.sns.actor.SubscribeActor - Sending message c6e10fb4-6891-4522-bf2e-e4906091d783 to http:172.18.0.4:8080/sns
06:50:18.147 [sns-akka.actor.default-dispatcher-17] DEBUG akka.actor.ActorSystemImpl - akka-http-sns: Response for
  Request : HttpRequest(HttpMethod(POST),http://socialcrm.dev:9911/,List(Host: socialcrm.dev:9911, Accept-Encoding: identity, X-Amz-Date: 20170124T065018Z, authorization: AWS4-HMAC-SHA256 Credential=AKIAJRU7EX22W6MFQFAA/20170124/ap-southeast-2/sns/aws4_request, SignedHeaders=host;x-amz-date, Signature=a41a998abb3a6c7c25ec4cfd8b9b16aa12888e3497c4a620440b472dc74db3e5, User-Agent: aws-cli/1.10.25 Python/2.7.10 Darwin/16.3.0 botocore/1.5.2, Timeout-Access: <function1>),HttpEntity.Strict(application/x-www-form-urlencoded; charset=UTF-8,Action=Publish&Message=New+message&Version=2010-03-31&TopicArn=arn%3Aaws%3Asns%3Aus-east-1%3A1485239739350%3Amrt_rules),HttpProtocol(HTTP/1.1))
  Response: Complete(HttpResponse(200 OK,List(),HttpEntity.Strict(text/xml; charset=UTF-8,<PublishResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/"><PublishResult><MessageId>c6e10fb4-6891-4522-bf2e-e4906091d783</MessageId></PublishResult><ResponseMetadata><RequestId>a21f6deb-2f4a-4ca5-bc27-95c70ca6dd17</RequestId></ResponseMetadata></PublishResponse>),HttpProtocol(HTTP/1.1)))
Jan 24, 2017 6:50:18 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (java.net.ConnectException) caught when processing request: **Connection refused (Connection refused)**
Jan 24, 2017 6:50:18 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
Jan 24, 2017 6:50:18 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (java.net.ConnectException) caught when processing request: **Connection refused (Connection refused)**
Jan 24, 2017 6:50:18 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
Jan 24, 2017 6:50:18 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: I/O exception (java.net.ConnectException) caught when processing request: **Connection refused (Connection refused)**
Jan 24, 2017 6:50:18 AM org.apache.commons.httpclient.HttpMethodDirector executeWithRetry
INFO: Retrying request
06:50:18.250 [sns-akka.actor.default-dispatcher-20] ERROR akka.actor.OneForOneStrategy - Connection refused (Connection refused)
akka.camel.AkkaCamelException: Connection refused (Connection refused)
	at akka.camel.ProducerSupport$$anonfun$produce$1.applyOrElse(Producer.scala:73) ~[sns.jar:0.1.3]
	at akka.actor.Actor$class.aroundReceive(Actor.scala:484) ~[sns.jar:0.1.3]
	at me.snov.sns.actor.ProducerActor.aroundReceive(ProducerActor.scala:10) ~[sns.jar:0.1.3]
	at akka.actor.ActorCell.receiveMessage(ActorCell.scala:526) [sns.jar:0.1.3]
	at akka.actor.ActorCell.invoke(ActorCell.scala:495) [sns.jar:0.1.3]
	at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) [sns.jar:0.1.3]
	at akka.dispatch.Mailbox.run(Mailbox.scala:224) [sns.jar:0.1.3]
	at akka.dispatch.Mailbox.exec(Mailbox.scala:234) [sns.jar:0.1.3]
	at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [sns.jar:0.1.3]
	at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [sns.jar:0.1.3]
	at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [sns.jar:0.1.3]
	at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [sns.jar:0.1.3]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
	at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_111-internal]
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_111-internal]
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_111-internal]
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_111-internal]
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_111-internal]
	at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_111-internal]
	at java.net.Socket.connect(Socket.java:538) ~[na:1.8.0_111-internal]
	at java.net.Socket.<init>(Socket.java:434) ~[na:1.8.0_111-internal]
	at java.net.Socket.<init>(Socket.java:286) ~[na:1.8.0_111-internal]
	at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:80) ~[sns.jar:0.1.3]
	at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:122) ~[sns.jar:0.1.3]
	at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) ~[sns.jar:0.1.3]
	at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361) ~[sns.jar:0.1.3]
	at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) ~[sns.jar:0.1.3]
	at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) ~[sns.jar:0.1.3]
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) ~[sns.jar:0.1.3]
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323) ~[sns.jar:0.1.3]
	at org.apache.camel.component.http.HttpProducer.executeMethod(HttpProducer.java:253) ~[sns.jar:0.1.3]
	at org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:148) ~[sns.jar:0.1.3]
	at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) ~[sns.jar:0.1.3]
	at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) ~[sns.jar:0.1.3]
	at akka.camel.ProducerSupport$ProducerChild.produce(Producer.scala:137) ~[sns.jar:0.1.3]
	at akka.camel.ProducerSupport$ProducerChild$$anonfun$receive$1.applyOrElse(Producer.scala:111) ~[sns.jar:0.1.3]
	at akka.actor.Actor$class.aroundReceive(Actor.scala:484) ~[sns.jar:0.1.3]
	at akka.camel.ProducerSupport$ProducerChild.aroundReceive(Producer.scala:108) ~[sns.jar:0.1.3]
	... 9 common frames omitted

I have manually subscribed the nodejs's IP, and it published message fine, I have also subscribed google.com to it, and it published fine. It seems Akka is unable to resolve the DNS of the docker link for nodejs.

Docker image does not run on M1 MacBooks

The s12v/sns images from DockerHub are only for linux/amd64 and do not work on the new M1 MacBooks. Those require the linux/arm64 architecture.

I can build the image locally, but it would be nice to have it on DockerHub.

Open Feignclient integration with Netflix Ribbon not working in springboot

FeingClient Server

@RestController
public class FeinApiCall {

@Autowired
CustomFeignClient customFeignClient;


@GetMapping("/getinfothroughfeign")
public String getFeignLoad() {
    String result =customFeignClient.getInstance();
    return result;
}

}

@SpringBootApplication
@EnableFeignClients
@RibbonClient(name = "testServer", configuration = CustomIClientfiguration.class)
public class FeignLoadBalancingApplication {

public static void main(String[] args) {
    SpringApplication.run(FeignLoadBalancingApplication.class, args);
}

}

@FeignClient(name ="testServer")
public interface CustomFeignClient {
@RequestMapping(method = RequestMethod.GET, value = "/getPort")
String getInstance();
}

@configuration
public class CustomIClientfiguration {

public static final int DEFAULT_CONNECT_TIMEOUT = 1000;
public static final int DEFAULT_READ_TIMEOUT = 1000;

@Autowired
IClientConfig ribbonClientConfig;

@Bean
public IClientConfig ribbonClientConfig() {
    System.err.println("CustomIClientfiguration overiding");
    DefaultClientConfigImpl config = new DefaultClientConfigImpl();
    config.loadProperties("testServer");
    config.set(CommonClientConfigKey.ConnectTimeout, DEFAULT_CONNECT_TIMEOUT);
    config.set(CommonClientConfigKey.ReadTimeout, DEFAULT_READ_TIMEOUT);
    return config;
}

@Bean
public IPing ribbonPing(IClientConfig config) {
    return new PingUrl();
}

@Bean
public IRule ribbonRule(IClientConfig config) {
    
    return new AvailabilityFilteringRule();
}

}

application.properties of feignclient server#

server.port=9098

testServer.ribbon.eureka.enabled=true
testServer.ribbon.listOfServers=localhost:2289
testServer.ribbon.ServerListRefreshInterval=15000

testserver files

@RestController
public class TestController {

@Autowired
ApplicationContext context;

@Value("${server.port}")
private String portNumber;

@GetMapping("/getPort")
public String getString()
{
    return "Port number "+this.portNumber;
}

@GetMapping("/")
public String ping()
{
    
    return "welcome";
}

}

application.properties of testServer#
server.port=2289
spring.application.name=testServer
management.endpoints.web.exposure.include=*
management.endpoint.health.enabled=true

Error
Receiver class org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient does not define or inherit an implementation of the resolved method 'abstract org.springframework.cloud.client.ServiceInstance choose(java.lang.String, org.springframework.cloud.client.loadbalancer.Request)' of interface org.springframework.cloud.client.loadbalancer.ServiceInstanceChooser. java.lang.AbstractMethodError: Receiver class org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient does not define or inherit an implementation of the resolved method 'abstract org.springframework.cloud.client.ServiceInstance choose(java.lang.String, org.springframework.cloud.client.loadbalancer.Request)' of interface org.springframework.cloud.client.loadbalancer.ServiceInstanceChooser. at org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient.execute(FeignBlockingLoadBalancerClient.java:88) at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:119) at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89) at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) at jdk.proxy3/jdk.proxy3.$Proxy83.getInstance(Unknown Source) at com.FeignLoadBalancing.api.FeinApiCall.getFeignLoad(FeinApiCall.java:19) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1064) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)

SNS not writing to SQS

I have 2 docker containers running SNS / SQS using the ElasticMQ example. When I write to the topic it writes correctly out to the log file but doesn't send message to SQS.

I get the following WARN in the logs

10:04:40.528 [sns-akka.actor.default-dispatcher-3] WARN  akka.actor.ActorSystemImpl - Illegal header: Illegal 'authorization' header: Invalid input '/', expected tchar, OWS, listSep or 'EOI' (line 1, column 38): AWS4-HMAC-SHA256 Credential=ACCESSKEY/20180830/us-east-1/sns/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date, Signature=e732dbb0746280abdbb0b2d3e7c7f7628c2d9926f1dc1a86b1b5f31a4f72a414
                                     ^
10:04:40.608 [sns-akka.actor.default-dispatcher-3] WARN  o.a.c.component.aws.sqs.SqsProducer - Cannot put the message header key=MessageExchangeId, value=9594974f-d2c7-4d30-bbb8-2ad55991600e into Sqs MessageAttribute
10:04:40.609 [sns-akka.actor.default-dispatcher-3] WARN  o.a.c.component.aws.sqs.SqsProducer - Cannot put the message header key=x-amz-sns-message-id, value=9594974f-d2c7-4d30-bbb8-2ad55991600e into Sqs MessageAttribute

Start-up log

10:04:38.285 [sns-akka.actor.default-dispatcher-3] INFO  akka.event.slf4j.Slf4jLogger - Slf4jLogger started
10:04:38.461 [sns-akka.actor.default-dispatcher-3] INFO  me.snov.sns.Main$ - SNS v0.4.1 is starting
10:04:38.501 [sns-akka.actor.default-dispatcher-3] INFO  me.snov.sns.Main$ - Loaded DB
10:04:38.513 [sns-akka.actor.default-dispatcher-5] INFO  me.snov.sns.actor.SubscribeActor - Loaded configuration
10:04:39.009 [sns-akka.actor.default-dispatcher-3] INFO  o.a.c.i.c.DefaultTypeConverter - Loaded 202 type converters
10:04:39.010 [sns-akka.actor.default-dispatcher-3] INFO  o.a.camel.impl.DefaultCamelContext - Apache Camel 0.4.1 (CamelContext: sns) is starting
10:04:39.011 [sns-akka.actor.default-dispatcher-3] INFO  o.a.camel.impl.DefaultCamelContext - StreamCaching is enabled on CamelContext: sns
10:04:39.011 [sns-akka.actor.default-dispatcher-3] INFO  o.a.c.m.DefaultManagementStrategy - JMX is disabled
10:04:39.026 [sns-akka.actor.default-dispatcher-3] INFO  o.a.c.i.DefaultStreamCachingStrategy - StreamCaching in use with spool directory: /tmp/camel/camel-tmp-b35ce329-c557-4e09-8960-c2a80ad3f203 and rules: [Spool > 128K body size]
10:04:39.027 [sns-akka.actor.default-dispatcher-3] INFO  o.a.camel.impl.DefaultCamelContext - Total 0 routes, of which 0 are started.
10:04:39.028 [sns-akka.actor.default-dispatcher-3] INFO  o.a.camel.impl.DefaultCamelContext - Apache Camel 0.4.1 (CamelContext: sns) started in 0.017 seconds
10:04:39.157 [sns-akka.actor.default-dispatcher-4] INFO  o.a.camel.util.CamelContextHelper - No existing PropertiesComponent has been configured, creating a new default PropertiesComponent with name: properties
10:04:40.194 [sns-akka.actor.default-dispatcher-2] WARN  akka.actor.ActorSystemImpl - Illegal header: Illegal 'authorization' header: Invalid input '/', expected tchar, OWS, listSep or 'EOI' (line 1, column 49): AWS4-HMAC-SHA256 Credential=AKIAJTVBYXZ67QPY6RNA/20180830/us-east-1/sns/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date, Signature=6912ca33ab71531efb8958eb907d20c54e28b5ec365480b2b3cde29fd2424d94
                                                ^

Conf.json

{
  "version": 1,
  "timestamp": 1465414804110,
  "subscriptions": [
    {
      "arn": "e9126059-9eab-4b37-8194-e0d64dfb2045",
      "topicArn": "arn:aws:sns:us-east-1:123456789012:job-success",
      "endpoint": "aws-sqs://job-success?amazonSQSEndpoint={{env:SQS_ENDPOINT}}&accessKey=&secretKey=",
      "owner": "",
      "protocol": "sqs"
    },
    {
      "arn": "e9126059-9eab-4b37-8194-e0d64dfb2041",
      "topicArn": "arn:aws:sns:us-east-1:123456789012:job-error",
      "endpoint": "aws-sqs://job-error?amazonSQSEndpoint={{env:SQS_ENDPOINT}}&accessKey=&secretKey=",
      "owner": "",
      "protocol": "sqs"
    },
    {
      "arn": "6df4ed2b-a650-4f7c-910a-1a89c7cae5a6",
      "topicArn": "arn:aws:sns:us-east-1:123456789012:job-success",
      "endpoint": "file://tmp?fileName=sns.log",
      "owner": "",
      "protocol": "file"
    }
  ],
  "topics": [
    {
      "arn": "arn:aws:sns:us-east-1:123456789012:job-success",
      "name": "job-success"
    },
    {
      "arn": "arn:aws:sns:us-east-1:123456789012:job-error",
      "name": "job-error"
    }
  ]
}

db.json

include classpath("application.conf")

// node-address.host = "*" means the server will take "Host" header of incoming
// requests to generate queue URLs.
node-address {
    protocol = http
    host = "*"
    port = 9324
    context-path = ""
}

queues {
  job-success {}
  job-error {}
}

Unable to publish to created topic

When I try to publish to the topic I just created I'm getting a An error occurred (NotFound) when calling the Publish operation: Topic not found error.

Reproduction case:

Start the sns/sqs servers using docker-compose:
cd examples
docker-compose up

Publish to the existing test1 topic
AWS_DEFAULT_REGION=us-east-1 AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar aws sns --endpoint-url http://localhost:9911 list-topics

{
    "Topics": [
        {
            "TopicArn": "arn:aws:sns:us-east-1:1465414804035:test1"
        }
    ]
}

AWS_DEFAULT_REGION=us-east-1 AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar aws sns --endpoint-url http://localhost:9911 publish --topic-arn arn:aws:sns:us-east-1:1465414804035:test1 --message 'TEST'

{
    "MessageId": "bcbded98-610f-4921-930b-286571588609"
}

This is all as expected - however when I create a new topic and publish to it I get
AWS_DEFAULT_REGION=us-east-1 AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar aws sns --endpoint-url http://localhost:9911 create-topic --name new

{
    "TopicArn": "arn:aws:sns:us-east-1:123456789012:new"
}

AWS_DEFAULT_REGION=us-east-1 AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar aws sns --endpoint-url http://localhost:9911 list-topics

{
    "Topics": [
        {
            "TopicArn": "arn:aws:sns:us-east-1:1465414804035:test1"
        }, 
        {
            "TopicArn": "arn:aws:sns:us-east-1:123456789012:new"
        }
    ]
}

AWS_DEFAULT_REGION=us-east-1 AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar aws sns --endpoint-url http://localhost:9911 publish --topic-arn arn:aws:sns:us-east-1:123456789012:new --message 'TEST'

An error occurred (NotFound) when calling the Publish operation: Topic not found: arn:aws:sns:us-east-1:123456789012:new

Am I doing something wrong here? Is this happening because I don't have any subscriptions for this topic?

Ubuntu 14.04, docker 17.09.1-ce, compose 1.18.0, aws cli 1.14.38

Subscriptions with SQS protocol don't work in accordance with AWS API spec.

When making subscription from SNS to SQS (protocol='sqs', endpoint=queue ARN), the error occurs:

ERROR a.c.i.Registry$RegistryLogStrategy - Actor[akka://sns/user/$a#1061847866] failed to activate
org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: arn://aws:sqs:elasticmq:000000000000:testqueue due to: No component found with scheme: arn
	at org.apache.camel.impl.DefaultCamelContext.getEndpoint(DefaultCamelContext.java:594) ~[sns-0.1.3.jar:0.1.3]
	at akka.camel.internal.ProducerRegistrar$$anonfun$receive$3.applyOrElse(CamelSupervisor.scala:164) ~[sns-0.1.3.jar:0.1.3]
...

Also it's not clear how one can set SQS endpoint URL - e.g. to localhost when using elasticMQ.

Can you elaborate on elasticMQ integration?

Publish to "TargetArn"

Under special circumstances, applications may publish messages to the SNS via a TargetArn instead of a TopicArn. Since AWS-SNS support to publish messages to the TopicArn or the TargetArn it may be useful to support both.

flood with "Illegal header: Illegal authorization header: Invalid input '/'"

Hello!
I'm trying to mock sns, but my services send aws credentials to docker, and that's why docker floods with warnings:

sns-mock | 09:15:35.383 [sns-akka.actor.default-dispatcher-13] WARN akka.actor.ActorSystemImpl - Illegal header: Illegal 'authorization' header: Invalid input '/', expected tchar, OWS, listSep or 'EOI' (line 1, column 49): AWS4-HMAC-SHA256 Credential=......

can i disable these warnings somehow?
Thanks !

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.