使用Amazon SQS和S3事件的芹菜

时间:2015-05-07 13:33:54

标签: amazon-s3 celery amazon-sqs

我想使用Celery来消费亚马逊在SQS上提供的S3事件。但是,S3 message formatwhat Celery expects不匹配。

如何以最小的黑客消费这些消息?我应该编写自定义序列化程序吗?我应该放弃并使用boto或boto3制作自定义桥接器吗?

作为旁注,我还想将Celery连接到另一个代理(RabbitMQ)以获取其余的应用程序消息,如果这很重要的话。

4 个答案:

答案 0 :(得分:3)

您需要创建一个侦听S3通知的服务,然后运行相应的芹菜任务。

您有多种选择 - 通过SQS,SNS或AWS Lambda发送S3通知。

事实上,最简单的选择可能是根本不使用Celery,只需编写一些代码即可在AWS Lambda中运行。我还没有使用过这项服务(Lambda是相对较新的),但看起来这意味着你没有必要这样做。经营监督服务或芹菜工人。

答案 1 :(得分:2)

对于我的特定用例,最简单的方法是创建一个桥接工作器来轮询SQS并使用默认代理向Celery提供任务。

不难做到(尽管boto和SQS可能会使用更多文档),而Celery不太适合同时连接两个不同的代理,因此感觉这是最好的方法。

答案 2 :(得分:1)

配置AWS S3事件以调用AWS Lambda函数。应编写该函数以将S3事件消息转换为Celery消息格式,然后将Celery消息发布到SQS。芹菜会收到SQS的消息。

S3赛事 - > Lambda - > SQS - >芹菜

答案 3 :(得分:1)

Amazon S3发送以发布事件的通知消息为JSON格式。 因此,您可以将芹菜配置为序列化json。 以下是我的配置文件(使用django)的摘录。

# AWS Credentials
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')

# Celery
BROKER_URL = "sqs://%s:%s@" % (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_DEFAULT_QUEUE = '<queue_name>'
CELERY_RESULT_BACKEND = None # Disabling the results backend

BROKER_TRANSPORT_OPTIONS = {
    'region': 'us-west-2',
    'polling_interval': 20,
}