2017-11-11 13 views
0

このpythonスクリプトを使用して、ローカルフォルダからS3フォルダに変更または新しく作成したファイルをアップロードしています。ローカルファイルとS3の内容を確認して変更したファイルをアップロード

スクリプトが機能しません。それはちょうどバケット名を得ることに失敗した。私はpython2.7でbotoを使用しています。私はグーグルで答えは得られませんでした。

ご迷惑をおかけして申し訳ございません。

多くのありがとうございます。ここで

はここでエラー

Traceback (most recent call last): 
File "s3update.py", line 20, in <module> 
bucket = conn.get_bucket(BUCKET_NAME) 
File "/usr/lib/python2.7/site-packages/boto/s3/connection.py", line 506, in get_bucket 
return self.head_bucket(bucket_name, headers=headers) 
File "/usr/lib/python2.7/site-packages/boto/s3/connection.py", line 539, in head_bucket 
raise err 
boto.exception.S3ResponseError: S3ResponseError: 403 Forbidden 

であるあなたは、あなたのバケット名が正しく、あなたがそれにアクセスする権限を持っていることだけでなく、存在を確認する必要がありますコード

#!/usr/bin/env python 

# Compare a file on S3 to see if we have the latest version 
# If not, upload it and invalidate CloudFront 

import fnmatch 
import os 
import boto 
import pprint 
import re 
import hashlib 
from boto.s3.key import Key 

# Where source is checked out 
SOURCE_DIR = '/Downloads/local/folder' 
BUCKET_NAME = 's3bucket' 

# Connect to S3 and get bucket 
conn = boto.connect_s3() 
bucket = conn.get_bucket('s3bucket') 

# Shortcut to MD5 
def get_md5(filename): 
f = open(filename, 'rb') 
m = hashlib.md5() 
while True: 
    data = f.read(10240) 
    if len(data) == 0: 
    break 
    m.update(data) 
return m.hexdigest() 

def to_uri(filename): 
    return re.sub(SOURCE_DIR, '', f) 

# Assemble a list of all files from SOURCE_DIR 
files = [] 
for root, dirnames, filenames in os.walk(SOURCE_DIR): 
    for filename in filenames: 
    files.append(os.path.join(root, filename)) 

# Compare them to S3 checksums 
files_to_upload = [] 
for f in files: 
    uri = to_uri(f) 
    key = bucket.get_key(uri) 
    if key is None: 
    # new file, upload 
    files_to_upload.append(f) 
    else: 
    # check MD5 
    md5 = get_md5(f) 
    etag = key.etag.strip('"').strip("'") 
    if etag != md5: 
     print(f + ": " + md5 + " != " + etag) 
     files_to_upload.append(f) 

    # Upload + invalidate the ones that are different 
for f in files_to_upload: 
    uri = to_uri(f) 
    key = Key(bucket) 
    key.key = uri 
    key.set_contents_from_filename(f) 
    # CloudFront invalidation code goes here 
+0

権限を持って何かする必要がありますか? –

+0

権限はOKです。私はBoto3でバケット名を得ることができます。しかし、私はboto3でこのスクリプトを修正する方法を知らない。 –

+0

バケット作成者のみがオブジェクトを追加する完全な権限を持ちます。あなたは他のアクセスキーに許可を与える必要があります。 – mootmoot

答えて

0

です。

+0

バケットに対する編集権限があります。 FTPClient経由でバケット内にフォルダを作成できます。 –

+1

私はこの問題に直面したとき、これは私の問題を解決しました。私の問題は、AWSに指定しなければならない愚かな権限の問題でした。ここでその答えを確認してください。https://stackoverflow.com/a/10884964/3140312 – devdob

0

これは私のユーザー権限がバケット内のすべてのアクセスを許可していたのに対し、バケットレベルではファイル/オブジェクトの一覧表示などの操作を許可しなかったためです。それは、もともと読んポリシージェネレータを実行した後、バケツの権限]タブ上の私にとって

{

... 
     "Action": "s3:*", 
     "Resource": "arn:aws:s3:::py-sync-s3/*" 
     ] 
... 

そして、私はあまりにもそれを変更する必要がありました:

... 
     "Action": "s3:*", 
     "Resource": [ 
      "arn:aws:s3:::py-sync-s3", 
      "arn:aws:s3:::py-sync-s3/*" 
     ] 
... 

PY-同期-S3ビーイングバケット名。

私は行動を知っています理想的には、*これはすべての行動がテストのためだけであることを許可したくないということです。

関連する問題