AWS弹性Beanstalk Django计划任务post请求返回403错误

6
我正在处理一个软件功能,在其中我必须使用 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 中的 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个回答

3

我遇到了类似的问题。在我的情况下,我需要修改两个东西才能使它正常工作:

  1. 确保视图设置为接受来自AWS的POST请求。 之前我的设置仅支持GET请求,而AWS似乎不支持GET定时任务请求。

  2. 一旦支持POST,请使其免于CSRF攻击,这样Django就不会担心AWS发送的POST请求缺少CSRF令牌导致存在CSRF威胁。您可以使用在这个SO答案中描述的@csrf_exempt装饰器;在我的情况下,由于我使用的是基于类的视图,因此稍微有些复杂,我找到了这个其他SO答案,介绍了如何在基于类的视图上包含@csrf_exempt装饰器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接