5

Tôi đang làm việc trên một chức năng phần mềm mà tôi phải xóa các tập tin định kỳ bằng cách sử dụng Django + cron + AWS. Vấn đề là tôi không thể làm cho nó hoạt động được. Cách tốt nhất để làm cho nó hoạt động là gì? Tôi có thiếu một số cấu hình AWS? Tôi đã định cấu hình một máy chủ web và một công nhân môi trường, đã triển khai cùng một phiên bản ứng dụng trên chúng. Nhiệm vụ là chế độ xem được ánh xạ thành một địa chỉ url (truy cập url mà hàm được thực hiện). Có một thông báo xác nhận về môi trường công nhân:AWS Elastic BeansTalk Django cronjob yêu cầu bài trả lại lỗi 403

Đã nạp thành công 1 tác vụ theo lịch từ cron.yaml.

Nhưng cũng là một lỗi 403 trên người lao động access_log:

"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 * * * *" 

lập bản đồ url tại urls.py:

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

chức năng để xóa các tập tin tại 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 vai trò của tôi là:

AmazonSQSFullAccess

.210

AmazonS3FullAccess

AWSElasticBeanstalkFullAccess

AmazonDynamoDBFullAccess

Nếu tôi truy cập vào url thông qua trình duyệt, nhiệm vụ được thực hiện (các tập tin đã hết hạn được xóa). Tuy nhiên, môi trường công nhân được cho là truy cập vào url và thực hiện nhiệm vụ tự động và không chỉ khi tôi truy cập url thông qua trình duyệt. Làm thế nào tôi có thể làm cho nó hoạt động?

Trả lời

2

Tôi gặp sự cố tương tự. Trong trường hợp của tôi, tôi cần phải sửa đổi 2 điều để làm cho nó làm việc:

  1. Đảm bảo xem được thiết lập để chấp nhận một hành động POST từ AWS. Trước đây tôi đã thiết lập của tôi là GET chỉ, và có vẻ như AWS không hỗ trợ các yêu cầu GET cron.

  2. Sau khi hỗ trợ POST, hãy miễn dịch CSRF, do đó Django không sợ rằng có một mối đe dọa CSRF diễn ra khi AWS thực hiện yêu cầu POST thiếu mã thông báo CSRF.Bạn có thể sử dụng trang trí @csrf_exempt được mô tả tại this SO answer; trong trường hợp của tôi, nó vẫn còn phức tạp hơn một chút khi sử dụng chế độ xem dựa trên lớp học và tôi đã tìm thấy điều này other SO answer về cách bao gồm trang trí @csrf_exempt trên chế độ xem dựa trên lớp học.

Các vấn đề liên quan