通过SQS将消息发布到Elastic Beanstalk Worker环境

时间:2018-08-15 18:54:12

标签: amazon-web-services elastic-beanstalk

我在具有Web服务器和工作人员环境的Elastic beantalk上有一个docker应用程序。

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

  1. 客户端向服务器(/ trigger_job)发送请求
  2. 服务器通过将JSON消息发送到SQS队列(/ perform_job),将工作分担给工作人员
  3. 工人通过阅读来自SQS的消息来执行工作

我无法找到有关JSON消息外观的文档。 in the official documentation中提到了一些HTTP标头。但是没有提到头文件来指定工作环境中的所需端点。

server.py

#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'})

2 个答案:

答案 0 :(得分:0)

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

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

# 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

上阅读更多内容

enter image description here

答案 1 :(得分:0)

我从死信队列中某些失败的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队列中创建一条新消息,该消息将由worker守护程序解析并触发cron作业。

不幸的是,在解析邮件时似乎没有包含邮件正文,因此触发作业是我唯一能解决的动作。