繁体   English   中英

AWS Elastic BeansTalk Django cronjob发布请求返回403错误

[英]AWS Elastic BeansTalk Django cronjob post request returning 403 error

我正在开发一个软件功能,我必须使用Django + cron + AWS定期删除文件。 问题是我无法使其发挥作用。 什么是让它发挥作用的最佳方法? 我错过了一些AWS配置吗? 我已经配置了一个Web服务器和一个工作环境,在它们上部署了相同的应用程序版本。 任务是映射到url视图 (访问url函数执行)。 工作者环境有一条确认消息:

从cron.yaml成功加载了1个计划任务。

但是对于worker access_log也有403错误:

“POST / networks_app / delete_expired_files HTTP / 1.1”403 2629“ - ”“aws-sqsd / 2.0”

cron.yaml

version: 1
cron:
 - name: "delete_expired_files"
   url: "/networks_app/delete_expired_files"
   schedule: "10 * * * *"

urls.py上的 url映射:

urlpatterns = [
    url(r'^delete_expired_files', views.delete_expired_files, name='delete_expired_files'),
]

用于删除views.py文件的函数:

def delete_expired_files(request):
    users = DemoUser.objects.all()
    for user in users:
        documents = Document.objects.filter(owner=user.id)
        if documents:
            for doc in documents:
                now = timezone.now()
                if now >= doc.date_published + timedelta(days=doc.owner.group.valid_time):
                    doc.delete()

我的IAM角色是:

AmazonSQSFullAccess

AmazonS3FullAccess

AWSElasticBeanstalkFullAccess

AmazonDynamoDBFullAccess

如果我通过浏览器访问URL,则执行任务(删除过期的文件)。 但是,工作者环境应该访问URL并自动执行任务,而不仅仅是当我通过浏览器访问URL时。 我怎样才能使它工作?

我有一个类似的问题。 在我的情况下,我需要修改两件事来让它工作:

  1. 确保将视图设置为接受来自AWS的POST操作。 以前我只将我的设置为GET,并且AWS似乎不支持GET cron请求。

  2. 一旦它支持POST,使其免于CSRF,这样当AWS发出缺少CSRF令牌的POST请求时,Django并不担心会发生CSRF威胁 您可以使用本SO答案中描述的@csrf_exempt装饰器; 在我的情况下,我使用基于类的视图仍然稍微复杂一点,我发现了另一个关于如何在基于类的视图中包含@csrf_exempt装饰器的答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM