首页 > 解决方案 > 为什么我在尝试使用 Boto 连接到大使背后的 ElasticMQ 服务时收到 SQSError: 404?

问题描述

我有一个 elasticmq docker 容器,它使用 Kubernetes 部署为服务。此外,该服务通过大使的方式向外部用户公开。

这是该服务的 yaml 文件。

  ---
  kind: Service
  apiVersion: v1
  metadata:
    name: elasticmq
    annotations:
      getambassador.io/config: |
        ---
        apiVersion: ambassador/v1
        kind:  Mapping
        name:  elasticmq
        prefix: /
        host: elasticmq.localhost.com
        service: elasticmq:9324
  spec:
    selector:
      app: elasticmq
    ports:
    - port: 9324
      protocol: TCP
  ---
  kind: Deployment
  apiVersion: apps/v1
  metadata:
    name: elasticmq
    labels:
      app: elasticmq
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: elasticmq
    template:
      metadata:
        labels:
          app: elasticmq
      spec:
        containers:
        - name: elasticmq
          image: elasticmq
          imagePullPolicy: IfNotPresent
          ports:
          - containerPort: 9324
          livenessProbe:
            exec:
              command:
              - /bin/bash
              - -c
              - nc -zv localhost 9324 -w 1
            initialDelaySeconds: 60
            periodSeconds: 5
          volumeMounts:
            - name: elastimq-conf-volume
              mountPath: /elasticmq/elasticmq.conf
        volumes:
          - name: elastimq-conf-volume
            hostPath:
              path: /path/elasticmq.conf

现在我可以通过 curl 来检查 elasticmq 容器是否正常,并且 Ambassador 工作正常:

$ curl  elasticmq.localhost.com?Action=ListQueues&Version=2012-11-05
[1] 10355
<ListQueuesResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
<ListQueuesResult>

</ListQueuesResult>
<ResponseMetadata>
<RequestId>00000000-0000-0000-0000-000000000000</RequestId>
</ResponseMetadata>
</ListQueuesResponse>[1]+  Done

另一方面,当我尝试使用 Boto3 做同样的事情时,我得到一个SQSError: 404 not found.

这是我的 Python 脚本:

import boto.sqs.connection
conn = boto.sqs.connection
c = conn.SQSConnection(proxy_port=80, proxy='elasticmq.localhost.com', is_secure=False, aws_access_key_id='x', aws_secret_access_key='x'
c.get_all_queues('')

我认为它与 elasticmq.conf 中指定的外部主机有关,所以我将其更改为:

include classpath("application.conf")

// What is the outside visible address of this ElasticMQ node (used by rest-sqs)
node-address {
    protocol = http
    host = elasticmq.localhost.com
    port = 80
    context-path = ""
}

rest-sqs {
    enabled = true
    bind-port = 9324
    bind-hostname = "0.0.0.0"
    // Possible values: relaxed, strict
    sqs-limits = relaxed
}

我认为更改 elasticmq conf 会起作用,但事实并非如此。我怎样才能让它工作?

标签: python-3.xnetworkingkubernetesbotoelastic-mq

解决方案


推荐阅读