Skip to content

Instantly share code, notes, and snippets.

@masaki925
Created November 19, 2012 14:18
Show Gist options
  • Save masaki925/4110879 to your computer and use it in GitHub Desktop.
Save masaki925/4110879 to your computer and use it in GitHub Desktop.
S3でGlacierにarchiveしたオブジェクトをrestoreするAPIを叩くスクリプト
#!/usr/bin/env ruby
require 'base64'
require 'net/http'
require 'openssl'
require 'time'
require 'digest/md5'
Net::HTTP.version_1_2
def aws_sign(secret_access_key_id, method, md5, ctype, date, bucket, path)
string_to_sign = "#{method}\n#{md5}\n#{ctype}\n#{date}\n/#{bucket}#{path}"
digest = OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, secret_access_key_id, string_to_sign)
Base64.encode64(digest).gsub("\n", '')
end
def request_restore(bucket, path_org, access_key_id, secret_access_key_id, body)
date = Time.now.rfc2822
Digest::MD5.method_defined?(:base64digest) ? ( md5 = Digest::MD5.base64digest(body) ) : ( md5 = Base64.encode64( Digest::MD5.digest(body) ).gsub("\n", '') )
ctype = 'text/xml'
path = path_org + '?restore'
signature = aws_sign(secret_access_key_id, 'POST', md5, ctype, date, bucket, path)
request = Net::HTTP::Post.new(path)
request.add_field('Date', date)
request.add_field('Authorization', "AWS #{access_key_id}:#{signature}")
request.add_field('Content-MD5', md5)
request.add_field('Content-Type', ctype)
request.body = body
uri = URI.parse("http://#{bucket}.s3.amazonaws.com")
http = Net::HTTP.new(uri.host, uri.port)
response = nil
response = http.request(request)
return response
end
def get_restore_status(bucket, path, access_key_id, secret_access_key_id)
date = Time.now.rfc2822
signature = aws_sign(secret_access_key_id, 'HEAD', '', '', date, bucket, path)
request = Net::HTTP::Head.new(path)
request.add_field('Date', date)
request.add_field('Authorization', "AWS #{access_key_id}:#{signature}")
uri = URI.parse("http://#{bucket}.s3.amazonaws.com")
http = Net::HTTP.new(uri.host, uri.port)
response = nil
response = http.request(request)
return response["x-amz-restore"]
end
BucketName = 'BUCKETNAME'
Path = '/PATH/TO/FILE'
AWSAccessKeyId = 'ACCESSKEY'
AWSSecretAccessKey = 'SECRETKEY'
#
# request restore
#
#xml = <<EOL
#<RestoreRequest>
# <Days>2</Days>
#</RestoreRequest>
#EOL
#request_restore_result = request_restore(BucketName, Path, AWSAccessKeyId, AWSSecretAccessKey, xml)
#puts request_restore_result
#
# get restore status
#
#restore_status = get_restore_status(BucketName, Path, AWSAccessKeyId, AWSSecretAccessKey)
#puts restore_status
@masaki925
Copy link
Author

Digest::MD5.base64digest はruby1.9.2 以上(?) らしく、下のバージョンで使う必要があったので少し修正した

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment