【问题标题】:AWS SQS to receive message from outside of AWSAWS SQS 从 AWS 外部接收消息
【发布时间】:2017-05-29 01:27:22
【问题描述】:

我的公司有一个以 JSON 格式发送实时消息的消息系统,它不是基于 AWS 构建的,并且不会与 AWS 建立任何 VPN 连接。

我们的团队正在尝试使用 AWS SQS 接收这些消息,然后让 DynamoDB 将 JSON 消息处理到 TSV,然后加载到 RDS。

但是,根据常见问题解答,SQS 只能接收来自 AWS 内部的消息。 https://aws.amazon.com/sqs/faqs/

问:谁可以对消息队列执行操作?

只有 AWS 账户所有者(或账户所有者授权的 AWS 账户才能对 Amazon SQS 消息队列执行操作。

为了使用 SQS,我能想到的一种方法是创建一个面向公众的 EC2 实例,它接收消息并传递给 SQS。

我的问题是:

  1. 我的想法正确吗?
  2. 如果正确,您能否分享有关如何在此 EC2 实例上构建任何应用程序以实现该功能的任何详细信息(我没有应用程序开发经验,非常感谢您的见解!)
  3. AWS 中是否有任何更简单/更好的选项可以实现在我的用例中接收消息的目标?

【问题讨论】:

    标签: message-queue messaging amazon-sqs


    【解决方案1】:
    1. 我的想法正确吗?

    不,不是。

    您误解了常见问题解答中的信息(诚然有些不清楚)。

    SQS 可从 Internet 上的任何位置访问和使用。它唯一暴露的接口是 HTTP(S)。事实上,从 EC2 内部,SQS 是不可访问的,除非 EC2 实例实际上具有对 Internet 的出站访问权限。

    文档中的重点不是您需要“内部”AWS 才能使用队列,而是您需要拥有一组授权的 AWS 凭证才能使用队列使用队列。¹

    如果您有 AWS 账户,则您有凭证,并且可以使用 SQS。不要求您从“内部”AWS 访问队列。

    选择离您的服务器最近的endpoint(以获得最低延迟),您应该会发现它是开放且可从任何地方访问的。


    ¹可以将队列配置为在创建后允许匿名访问。 (不要这样做,我只是说有可能。)FAQ 的这一部分似乎是指操作的子集,例如创建队列。

    【讨论】:

    • 嗨,迈克尔,感谢您的回复。我应该在我的描述中说得更清楚。据我了解,如果公司的队列消息系统具有 AWS 凭证,或者如果它在 EC2 上具有有权访问 SQS 的角色,它可以向 SQS 发送消息。但是,我遇到的问题是该公司的队列消息传递系统是通用的,它在广播消息时不使用任何 AWS 凭证。我还尝试过 POSTMAN 在没有 AWS 凭证的情况下向 SQS 端点发送消息,但也失败了。所以我想知道这个用例是否有任何解决方法。如有错误请指正,谢谢。
    • 这是一个不同的问题。 (可能)比凭据更大的问题是您必须以 SQS API 所期望的格式说话。在您的情况下,一个相当简单的解决方法 - 我怀疑 - 将是 AWS API Gateway,它可以代理和重写 AWS 服务(如 SQS)的传入 HTTPS 请求。那是你要的吗?通过 HTTPS 接受消息并将它们放入队列中?
    • 嗨,Michael,我查看了 AWS API Gateway,这似乎很合适。是的,通过 HTTPS 接受消息并将它们放入 SQS 是我想要的。您能否告知需要任何开发工作才能使其正常工作?非常感谢。
    • 只是配置,我相信...请求和响应集成映射。
    • 最终目标是提供实时(或尽可能接近实时)的消息接收和转换服务。例如,让一个服务接受来自公司消息系统的消息,让另一个服务(或者可能是同一个服务)将接收到的 JSON 格式的消息转换为 TSV 格式,并将其加载到 RDS 中。所有这些都是实时的,而不是批处理。
    【解决方案2】:

    只要通过 accesskey&secret key 或 IAM 角色获得适当的权限,您就可以从任何地方访问 sqs。

    SQS 并不特定于 vpc

    【讨论】:

      【解决方案3】:

      很明显,您尝试这样做:

      从您的公司消息系统中获取消息,将其发送到 SQS。

      使用你的方法并没有错(使用 EC2 作为桥梁)。但是,您不需要 EC2 来连接到 SQS。

      只要您提供正确的凭据,就可以使用 AWS API(例如 Python boto3 等)从 Internet 访问所有 AWS 服务。因此,只要您能够与上述服务建立连接,您就可以将“中间件”放在任何地方。

      因此,您可以选择更多。例如从您的消息系统触发;使用 AWS Lambda 等。

      【讨论】:

        【解决方案4】:

        感谢您与我分享信息和您的见解!

        我已经测试了以下解决方案,它适用于我的用例:

        1. 在 AWS API Gateway 中创建了一个端点,该端点能够接收来自公司消息系统的消息,该系统不携带 AWS 凭证

        2. 创建了一个由 API Gateway 触发的 Lambda 函数,所以一旦有消息到达,Lambda 会消化 JSON 消息并将其转换为 TSV,然后加载到 RDS 中

        【讨论】:

          【解决方案5】:

          我无法从外部服务写入 SQS。我找到了一些部分解释,但卡在角色创建上。

          我发现的替代方法是使用 AWS 服务Lambda + API Gateway 写信给SQS

          本教程非常有帮助,详细解释了所有步骤: https://startupnextdoor.com/adding-to-sqs-queue-using-aws-lambda-and-a-serverless-api-endpoint/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-02-10
            • 1970-01-01
            • 1970-01-01
            • 2019-04-24
            • 2021-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多