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

Posted

技术标签:

【中文标题】AWS Elastic BeansTalk Django cronjob 发布请求返回 403 错误【英文标题】:AWS Elastic BeansTalk Django cronjob post request returning 403 error 【发布时间】:2016-05-14 15:31:15 【问题描述】:

我正在开发一个软件功能,我必须使用 Django + cron + AWS 定期删除文件。问题是我不能让它工作。让它发挥作用的最佳方法是什么?我是否缺少一些 AWS 配置?我已经配置了一个 web server 和一个 worker 环境,在它们上面部署了相同的应用程序版本。任务是映射到 urlview(访问执行函数的 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 中的 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】:

我遇到了类似的问题。就我而言,我需要修改 2 件事才能使其正常工作:

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

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

【讨论】:

以上是关于AWS Elastic BeansTalk Django cronjob 发布请求返回 403 错误的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk CLI 安装错误

text AWS Elastic Beanstalk

HTTPS Elastic Beanstalk (AWS) 到 Android

AWS Elastic Beanstalk 无法担任角色

AWS Elastic Beanstalk

AWS Elastic Beanstalk chown PythonPath 错误