Skip to content

Instantly share code, notes, and snippets.

@yuta-imai
Created December 15, 2014 03:06
Show Gist options
  • Save yuta-imai/9cc3538f5b775c06cde9 to your computer and use it in GitHub Desktop.
Save yuta-imai/9cc3538f5b775c06cde9 to your computer and use it in GitHub Desktop.
A code snippet for file upload for Amazon S3. The script uses DynamoDB to manage a list of uploaded files.
#!/usr/bin/env python
import re
import sys
import time
import boto.dynamodb2
import boto.s3
import boto.s3.bucket
import boto.s3.key
filename = sys.argv[1]
region = sys.argv[2]
bucketName = sys.argv[3]
prefix = sys.argv[4]
table = sys.argv[5]
p = re.compile(r'(logs.+\.log$)')
key = p.search(filename).group()
# ファイルをロックする(既にアップロード済みだったらロックできない)
if lock_key(key):
# ロックできたらあとはアップロード
s3 = boto.s3.connect_to_region(region)
s3bucket = boto.s3.bucket.Bucket(connection=s3,name=bucketName)
s3key = boto.s3.key.Key(bucket=s3bucket,name=prefix + key)
s3key.set_contents_from_filename(filename)
# このへんの出力をCloudWatch Logsにアップロードしておけばログ管理ともさようなら
print 'Uploaded %s.' % (s3key.name)
else:
 # このへんの出力をCloudWatch Logsにアップロードしておけばログ管理ともさようなら
print '%s seems to be uploaded already.' % (s3key.name)
def lock_key(key):
ddb = boto.dynamodb2.connect_to_region(region)
try:
ddb.put_item(
table,
{'key' : { 'S' : key}, 'status': {'S': 'uploaded'}},
expected = {
'key' : { "Exists" : False }
}
)
return True
except:
return False
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment