【问题标题】:Post a Message to Elastic Beanstalk Worker Environment via SQS通过 SQS 向 Elastic Beanstalk Worker Environment 发布消息
【发布时间】:2019-01-22 16:30:07
【问题描述】:

我有一个弹性 beanstalk 上的 docker 应用程序,带有 web 服务器和工作环境。

工作环境当前通过 cron 运行计划作业。 我正在尝试将服务器连接到工作人员以实现以下目标:

  1. 客户端向服务器发送请求 (/trigger_job)
  2. 服务器通过向 SQS 队列 (/perform_job) 发送 JSON 消息将作业卸载给工作人员
  3. Worker 通过从 SQS 读取消息来执行工作

我无法找到有关 JSON 消息应该是什么样子的文档。提到了一些 HTTP 标头in the official documentation。但是没有提到在工作环境中指定所需端点的标头。

# server.py
from bottle import post, HTTPResponse


@post('/trigger_job')
def trigger_worker_job():
    # should send a JSON message to sqs to trigger the '/perform_job'
    # Need help with what the JSON message looks like
    return HTTPResponse(status=200, body={'Msg': 'Sent message'})
# worker.py
from bottle import post, HTTPResponse


@post('/perform_job')
def perform_job():
    # job is performed in the worker environment

    return HTTPResponse(status=200, body={'Msg': 'Success'})

【问题讨论】:

  • 你找到解决方案了吗?
  • 天哪也卡在这里。我想知道他们是否可以将其包裹在“body”之类的东西中:等等。

标签: amazon-web-services amazon-elastic-beanstalk


【解决方案1】:

在 Python 中,您可以从 Python 示例应用程序中看到这是如何做到的,您可以在此 aws doc step 4: Deploy a New Application Version 上找到。

您可以在 beanstalk 工作环境控制台中配置 SQS 端点。配置 > Worker > 选择一个 Worker 队列

# for example: 
environ['HTTP_X_AWS_SQSD_TASKNAME']
environ['HTTP_X_AWS_SQSD_SCHEDULED_AT']
logger.info("environ X-Aws-Sqsd-Queue %s" % environ['HTTP_X_AWS_SQSD_QUEUE'])

# regarding your message attribute. For example, the attribute name is Email, 
# you can extract it via environ['HTTP_X_AWS_SQSD_ATTR_EMAIL']). 
# Make sure that the attribute name is all capital.  
logger.info("environ X-Aws-Sqsd-Attr Email %s" % environ['HTTP_X_AWS_SQSD_ATTR_EMAIL'])

消息将在图像中包含以下信息。你可以阅读更多aws AWS Elastic Beanstalk Worker Environments

【讨论】:

    【解决方案2】:

    我从死信队列中的一些失败的cron作业中发现,有以下三个属性:

    • beanstalk.sqsd.path
    • beanstalk.sqsd.task_name
    • beanstalk.sqsd.scheduled_time

    类似于在 cron 作业中设置的属性。

    您可以在工作环境的 SQS 队列中手动创建一条新消息,并设置这些属性以匹配您希望执行的 cron 作业,尽管这很乏味,我更喜欢通过代码来这样做。

    我在 python 中使用 boto3 框架,但希望它在其他语言中是类似的过程。

    def send_elastic_beanstalk_message(name, path, message):
        client = boto3.client('sqs')
        return client.send_message(
            QueueUrl=url, 
            MessageAttributes={
                "beanstalk.sqsd.path": {
                    "DataType": "String",
                    "StringValue": path
                },
                "beanstalk.sqsd.task_name": {
                    "DataType": "String",
                    "StringValue": name
                },
                "beanstalk.sqsd.scheduled_time": {
                    "DataType": "String",
                    "StringValue": datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M:%S UTC')
                }
            }
        )
    

    这将在 SQS 队列中创建一条新消息,该消息将由工作守护进程解析并触发一个 cron 作业。

    不幸的是,解析消息时似乎没有包含消息正文,因此触发作业是我能够解决的唯一操作。

    【讨论】:

      猜你喜欢
      • 2017-07-03
      • 2018-12-13
      • 2013-01-02
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      相关资源
      最近更新 更多