如何在本地测试AWS SNS?

时间:2017-03-03 11:53:26

标签: java amazon-web-services localhost

我想使用Amazon SNS service。我希望能够订阅 http rest到SNS 主题以接收通知。

但是本地我的应用程序的URL为localhost因此,我无法在本地测试应用程序行为。

我找到一篇关于使用ngrok服务器的文章,使用一些公共IP而不是本地IP。

然而,它对我来说似乎不是一个好的解决方案。

您是否有任何想法如何在本地拥有一个有效的 SNS用户?

4 个答案:

答案 0 :(得分:7)

您还可以使用ngrok公开公开本地主机。

它们的工作方式是动态创建子域并将所有请求隧道传送到所需端口上的机器。

想象一下这个场景,我在localhost:8080上运行了一个nginx。 我打开终端并运行ngrok 8080,它会占用我的终端会话并记录我的公共网址,例如'as78fh.ngrok.com'。

如果我使用另一台计算机,请打开浏览器并导航至as78fh.ngrok.com/register请求从我的localhost:8080 /通过隧道注册回到互联网。

我将它用于许多棘手的开发,例如电子邮件webhooks,github集成,当然还有亚马逊sns。

答案 1 :(得分:1)

看看GitHub中的一个虚假SNS实现,例如s12v/sns

  

假亚马逊简单通知服务(SNS)进行测试。支持:

     
      
  • 创建/列出/删除主题
  •   
  • 订阅端点
  •   
  • 发布消息
  •   
  • 订阅持久性
  •   
  • 与(假 - )SQS,文件,HTTP,RabbitMQ,Slack的集成
  •   

答案 2 :(得分:0)

我喜欢ngrok,但是您要付费使用一个固定的外部地址,如果您想免费使用它,则可以使用备用电子邮件帐户收件箱发送Email-JSON sns。然后使用IMAP库进行访问,阅读电子邮件并通过管道传输数据。

答案 3 :(得分:0)

我写了一个小型library来模仿AWS SNS,我认为它很适合您的需求。这是Java用法的示例:

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.sns.AmazonSNS;
import com.amazonaws.services.sns.AmazonSNSAsyncClientBuilder;
import io.github.gilbertojrequena.bonsai_sns.server.BonsaiSnsEnvironment;
import io.github.gilbertojrequena.bonsai_sns.server.BonsaiSnsServer;
import io.github.gilbertojrequena.bonsai_sns.server.Subscription;
import io.github.gilbertojrequena.bonsai_sns.server.Topic;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class SNSTest {

    private BonsaiSnsServer server;
    private AmazonSNS snsClient;

    @Before
    public void setup() {
        // start your app at 8080

        server = new BonsaiSnsServer.Builder()
            .withAccountId(123456789L)
            .withPort(7979)
            .withRegion("someRegion")
            .withBonsaiSnsEnvironmentDefinition(
                BonsaiSnsEnvironment.Companion.definition()
                    .withTopic(
                        Topic.Companion.definition()
                            .withName("name")
                            .withSubscription(
                                Subscription.Companion.definition()
                                    .withEndpoint("http:/localhost:8080/endpoint")
                                    .withProtocol("http")
                                    .withAttribute("a", "b")
                            )
                    )
            ).start();

        snsClient = AmazonSNSAsyncClientBuilder.standard()
            .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("accessKey", "secretKey")))
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration("http://localhost:7979", "someRegion"))
            .build();
    }

    @After
    public void shutdown() {
        server.stop();
    }

    @Test
    public void testSomething() {
        snsClient.publish("arn:aws:sns:someRegion:123456789:name", "message");
        // assertions
    }
}