2013-09-30 46 views
5

我一直在試圖找到一個解決方案,現在約36小時,所以希望我不會重複一個問題或問一些明顯的問題。我正在構建一個Web應用程序,該應用程序必須處理我在S3中存儲的文件,並使用「public-read」acl在S3中放回新版本。然後,不同的頁面允許您查看更新的文件。該應用程序存在於亞馬遜EC2服務器上,並連接到亞馬遜S3存儲桶。無法在S3中使用boto和django設置文件權限

我正在使用django,芹菜和博託做到這一點。我設置了一個芹菜任務,從我的一個視圖獲取一些信息,然後執行處理,然後將新文件發佈到S3。我能夠從S3獲得原始文件,成功處理它,並將其重新發布到S3。唯一不起作用的是改變該文件的權限。因此,除了當您進入查看頁面時,所有內容都可以正常工作,當嘗試訪問該文件時,出現403(禁止)錯誤。

如果我自己進入S3並更改該文件的權限以供所有人閱讀,則一切正常。我去之前,我在我的任務,幾乎工程使用的代碼是:

name = 'filename.blah' 
conn = boto.connect_s3() 
b = conn.get_bucket(settings.AWS_STORAGE_BUCKET_NAME) 
grab_from_S3(name,b) # grab file from S3 
out_name = conv(name) 
send_to_S3(out_name,b) 

其中功能有:

def grab_from_S3(file,bucket): 
    k = Key(bucket) 
    k.key = file 
    k.get_contents_to_filename(file) 

def send_to_S3(file,bucket): 
    k = Key(bucket) 
    k.key = file 
    k.set_contents_from_filename(file) 
    k.set_acl('public-read') 

和CONV(名)只是做一些轉換的東西。因此,除了文件的權限不是「公開閱讀」之外,它幾乎可以工作。我假設的所有AWS憑證和存儲桶名稱都是從環境中正確導入的,因爲它能夠將文件從S3推入或推出。

令人困惑的部分是,當我從EC2服務器上的venv打開一個python環境,或者只是安裝在它上面的python開始時,我運行上面顯示的所有命令,它工作。我可以毫無問題地更改權限。當任務運行時,它不會在芹菜日誌中拋出任何錯誤,所以我不認爲這個任務實際上正在出錯。這只是不改變它應該改變的。

的事情,我曾嘗試:

  1. 我試圖使用權限功能,如k.set_contents_from_filename(file,policy='public-read')k.make_public()b.set_acl('public-read',out_name)但這些都不工作或者其他版本。
  2. 我更改了存儲桶上的權限,表示允許每個人更改權限,但仍然無法正常工作。
  3. 我試圖桶政策改變這種下方,它並沒有影響:

    { "Version": "2008-10-17", "Id": "whatever", "Statement": [ { "Sid": "whatever", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "s3:PutObjectAcl", "s3:PutObject"], "Resource": [ "arn:aws:s3:::bucket_name", "arn:aws:s3:::bucket_name/*" ] } ] }

最後,我真的很困惑,因爲我似乎可以做到這一切在同一個EC2實例上的python環境中很好,但是沒有在該實例上運行的代碼。我搜索並搜索了,一直沒有找到任何可行的建議。另一個可能有用的信息(但可能與問題無關)是,如果我嘗試通過執行上述類似命令嘗試連接到S3,則返回錯誤:

「沒有處理程序準備好進行身份驗證1名處理員被檢查。['HmacAuthV1Handler']檢查您的憑據「

儘管它在我的任務中運行這些命令時有效(我認爲這是錯誤的訪問密鑰或祕密訪問密鑰或其他內容)。我想我在我需要的boto庫部分的Python代碼中正確導入。

我剛剛設置了這個實例,所以它可能幾乎是最新版本的boto,celery,django等我很可能忘記了一些東西,請讓我知道你是否需要更多的信息來回答這個問題,我真的不知道發生了什麼事,

感謝提前一噸

+0

那裏有很多問題8 ^)具體來說,要設置密鑰的ACL,請嘗試:k.set_contents_from_filename(file,policy ='public-read')。這允許您在寫入文件時設置ACL,而不是在單獨的操作中。 – garnaat

+0

嗨Garnaat,感謝您的建議。在「我嘗試過的東西」一節中,我提到我曾試圖做所有的變體來設置「公開閱讀」的關鍵。你建議的那個是我嘗試過的那個。這絕對是一個很好的建議,但仍然不起作用。令我困惑的是,任何變體都可以在python環境下工作。沒有任何工作來自tasks.py中的代碼。感謝您的建議! – barragan

回答

7

大約4天后,我自己解決了這個問題,整個過程中我的答案都在我的鼻子下。所以爲了其他人可能會發生這種情況,我會暴露我的愚蠢。

我對芹菜很新鮮。我沒有意識到的是,每當你改變芹菜任務時,你的工人都需要重新啓動才能看到變化。這對我來說從來都不是問題,因爲我每次開發時都會自己開始工作,但最近我開始將芹菜作爲守護進程運行。所以這是我一直在做芹菜的第一個變化。

答案是我只需要重新啓動守護程序,以便它會看到我的命令。現在一切正常。我去了,並試圖在芹菜文檔中搜索一行,或者在您進行更改時記住這樣做的入門指南,或者導入代碼但沒有看到任何明顯的內容。我發現這個通過一些其他的答案:

http://docs.celeryproject.org/en/latest/internals/reference/celery.worker.autoreload.html

其可用於開發非常有用。但我還沒有看到任何明確的線路,告訴新人芹菜,以確保他們知道需要重新啓動工人。也許這是顯而易見的,而我太新了。如果有人知道哪裏有關於它的某些信息的鏈接,這將是一個受歡迎的帖子,因爲有人可能想在將來閱讀它。對不起浪費大家時間。