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

时间:2016-02-04 20:21:47

标签: python django amazon-web-services cron amazon-elastic-beanstalk

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

  

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

但是工作人员 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 的网址映射:

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 个答案:

答案 0 :(得分:3)

我有类似的问题。就我而言,我需要修改两件事来让它起作用:

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

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