aliyun-sdk 0.1.8 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +28 -4
- data/examples/aliyun/oss/bucket.rb +1 -1
- data/examples/aliyun/oss/object.rb +1 -1
- data/examples/aliyun/oss/resumable_download.rb +1 -1
- data/examples/aliyun/oss/resumable_upload.rb +1 -1
- data/examples/aliyun/oss/streaming.rb +1 -1
- data/examples/aliyun/oss/using_sts.rb +48 -0
- data/examples/aliyun/sts/assume_role.rb +59 -0
- data/lib/aliyun/common.rb +6 -0
- data/lib/aliyun/common/exception.rb +18 -0
- data/lib/aliyun/{oss → common}/logging.rb +3 -3
- data/lib/aliyun/common/struct.rb +56 -0
- data/lib/aliyun/oss.rb +1 -2
- data/lib/aliyun/oss/bucket.rb +1 -1
- data/lib/aliyun/oss/client.rb +2 -2
- data/lib/aliyun/oss/config.rb +3 -2
- data/lib/aliyun/oss/download.rb +3 -0
- data/lib/aliyun/oss/exception.rb +2 -14
- data/lib/aliyun/oss/http.rb +3 -1
- data/lib/aliyun/oss/multipart.rb +2 -4
- data/lib/aliyun/oss/object.rb +1 -1
- data/lib/aliyun/oss/protocol.rb +1 -1
- data/lib/aliyun/oss/struct.rb +5 -54
- data/lib/aliyun/oss/upload.rb +3 -0
- data/lib/aliyun/oss/util.rb +1 -1
- data/lib/aliyun/sts.rb +9 -0
- data/lib/aliyun/sts/client.rb +38 -0
- data/lib/aliyun/sts/config.rb +21 -0
- data/lib/aliyun/sts/exception.rb +53 -0
- data/lib/aliyun/sts/protocol.rb +130 -0
- data/lib/aliyun/sts/struct.rb +64 -0
- data/lib/aliyun/sts/util.rb +48 -0
- data/lib/aliyun/{oss/version.rb → version.rb} +1 -3
- data/spec/aliyun/oss/client/client_spec.rb +21 -1
- data/spec/aliyun/sts/client_spec.rb +150 -0
- data/spec/aliyun/sts/util_spec.rb +39 -0
- metadata +21 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f79884482b39489cdabb7123b28bb1dae2bb547
|
4
|
+
data.tar.gz: e7a09b6bc276c0f8651f6ead88be61e8fa7d70cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3021afacd2b718ec6cc01e898fed4b0d3c909f1576d0744c84ad45c608b325f7ec047650b23c75176e1e7a27277afec31064f58d742998e359ffb9bcd31efa31
|
7
|
+
data.tar.gz: 91fca099332c548efc4d6fc0ae111aa4e7ffda04afdda041807d9da156e5ef5eecf002c2258dc5f086104ba4878cb956bac38b77ff0740ba73746bc02f486e1b
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -54,7 +54,7 @@ AccessKeySecret,在使用Aliyun OSS SDK时需要提供您的这两个信息。
|
|
54
54
|
|
55
55
|
其中`endpoint`是OSS服务的地址,根据节点区域不同,这个地址可能不一样,例如
|
56
56
|
杭州节点的地址是:`http://oss-cn-hangzhou.aliyuncs.com`,其他节点的地址见:
|
57
|
-
[节点列表][
|
57
|
+
[节点列表][region-list]
|
58
58
|
|
59
59
|
`access_key_id`和`access_key_secret`是您的服务凭证,在官网的“管理控制
|
60
60
|
台”上面可以查看。**请妥善保管您的AccessKeySecret,泄露之后可能影响您的
|
@@ -65,7 +65,7 @@ AccessKeySecret,在使用Aliyun OSS SDK时需要提供您的这两个信息。
|
|
65
65
|
OSS支持自定义域名绑定,允许用户将自己的域名指向阿里云OSS的服务地址
|
66
66
|
(CNAME),这样用户迁移到OSS上时应用内资源的路径可以不用修改。绑定的域
|
67
67
|
名指向OSS的一个bucket。绑定域名的操作只能在OSS控制台进行。更多关于自定
|
68
|
-
义域名绑定的内容请到官网了解:[OSS自定义域名绑定][
|
68
|
+
义域名绑定的内容请到官网了解:[OSS自定义域名绑定][custom-domain]
|
69
69
|
|
70
70
|
用户绑定了域名后,使用SDK时指定的endpoint可以使用标准的OSS服务地址,也
|
71
71
|
可以使用用户绑定的域名:
|
@@ -84,6 +84,28 @@ OSS支持自定义域名绑定,允许用户将自己的域名指向阿里云OS
|
|
84
84
|
3. 在{Aliyun::OSS::Client#get_bucket}时仍需要指定bucket名字,并且要与
|
85
85
|
域名所绑定的bucket名字相同
|
86
86
|
|
87
|
+
#### 使用STS创建Client
|
88
|
+
|
89
|
+
OSS支持用户使用STS进行访问,更多有关STS的内容,请参考 [阿里云STS][aliyun-sts]。
|
90
|
+
在使用STS之前需要先向STS申请一个临时token,
|
91
|
+
aliyun-sdk中包含了STS的SDK,使用时只需要`require 'aliyun/sts'`即可:
|
92
|
+
|
93
|
+
require 'aliyun/sts'
|
94
|
+
sts = Aliyun::STS::Client.new(
|
95
|
+
access_key_id: 'access_key_id',
|
96
|
+
access_key_secret: 'access_key_secret')
|
97
|
+
|
98
|
+
token = sts.assume_role('role-arn', 'my-app')
|
99
|
+
|
100
|
+
client = Aliyun::OSS::Client.new(
|
101
|
+
:endpoint => 'http://img.my-domain.com',
|
102
|
+
:access_key_id => token.access_key_id,
|
103
|
+
:access_key_secret => token.access_key_secret,
|
104
|
+
:sts_token => token.sts_token)
|
105
|
+
|
106
|
+
注意使用STS时必须指定`:sts_token`参数。用户还可以通过`STS::Client`申请
|
107
|
+
带Policy的token,细节请参考[API文档][sdk-api]。
|
108
|
+
|
87
109
|
### 列出当前所有的Bucket
|
88
110
|
|
89
111
|
buckets = client.list_buckets
|
@@ -360,5 +382,7 @@ SDK采用rspec进行测试,如果要对SDK进行修改,请确保没有break
|
|
360
382
|
- 阿里云官网文档:http://help.aliyun.com/product/8314910_oss.html
|
361
383
|
|
362
384
|
|
363
|
-
[
|
364
|
-
[
|
385
|
+
[region-list]: https://help.aliyun.com/document_detail/oss/user_guide/endpoint_region.html
|
386
|
+
[custom-domain]: https://help.aliyun.com/document_detail/oss/user_guide/oss_concept/oss_cname.html
|
387
|
+
[aliyun-sts]: https://help.aliyun.com/document_detail/ram/intro/concepts.html
|
388
|
+
[sdk-api]: http://www.rubydoc.info/gems/aliyun-sdk/
|
@@ -5,7 +5,7 @@ require 'yaml'
|
|
5
5
|
require 'aliyun/oss'
|
6
6
|
|
7
7
|
# 初始化OSS client
|
8
|
-
Aliyun::
|
8
|
+
Aliyun::Common::Logging.set_log_level(Logger::DEBUG)
|
9
9
|
conf_file = '~/.oss.yml'
|
10
10
|
conf = YAML.load(File.read(File.expand_path(conf_file)))
|
11
11
|
client = Aliyun::OSS::Client.new(
|
@@ -5,7 +5,7 @@ require 'yaml'
|
|
5
5
|
require 'aliyun/oss'
|
6
6
|
|
7
7
|
# 初始化OSS client
|
8
|
-
Aliyun::
|
8
|
+
Aliyun::Common::Logging.set_log_level(Logger::DEBUG)
|
9
9
|
conf_file = '~/.oss.yml'
|
10
10
|
conf = YAML.load(File.read(File.expand_path(conf_file)))
|
11
11
|
bucket = Aliyun::OSS::Client.new(
|
@@ -5,7 +5,7 @@ require 'yaml'
|
|
5
5
|
require 'aliyun/oss'
|
6
6
|
|
7
7
|
# 初始化OSS Bucket
|
8
|
-
Aliyun::
|
8
|
+
Aliyun::Common::Logging.set_log_level(Logger::DEBUG)
|
9
9
|
conf_file = '~/.oss.yml'
|
10
10
|
conf = YAML.load(File.read(File.expand_path(conf_file)))
|
11
11
|
bucket = Aliyun::OSS::Client.new(
|
@@ -5,7 +5,7 @@ require 'yaml'
|
|
5
5
|
require 'aliyun/oss'
|
6
6
|
|
7
7
|
# 初始化OSS Bucket
|
8
|
-
Aliyun::
|
8
|
+
Aliyun::Common::Logging.set_log_level(Logger::DEBUG)
|
9
9
|
conf_file = '~/.oss.yml'
|
10
10
|
conf = YAML.load(File.read(File.expand_path(conf_file)))
|
11
11
|
bucket = Aliyun::OSS::Client.new(
|
@@ -23,7 +23,7 @@ require 'aliyun/oss'
|
|
23
23
|
# 和下载。
|
24
24
|
|
25
25
|
# 初始化OSS client
|
26
|
-
Aliyun::
|
26
|
+
Aliyun::Common::Logging.set_log_level(Logger::DEBUG)
|
27
27
|
conf_file = '~/.oss.yml'
|
28
28
|
conf = YAML.load(File.read(File.expand_path(conf_file)))
|
29
29
|
bucket = Aliyun::OSS::Client.new(
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.expand_path("../../../../lib", __FILE__))
|
4
|
+
require 'yaml'
|
5
|
+
require 'aliyun/sts'
|
6
|
+
require 'aliyun/oss'
|
7
|
+
|
8
|
+
# 初始化OSS client
|
9
|
+
Aliyun::Common::Logging.set_log_level(Logger::DEBUG)
|
10
|
+
conf_file = '~/.sts.yml'
|
11
|
+
conf = YAML.load(File.read(File.expand_path(conf_file)))
|
12
|
+
|
13
|
+
# 辅助打印函数
|
14
|
+
def demo(msg)
|
15
|
+
puts "######### #{msg} ########"
|
16
|
+
puts
|
17
|
+
yield
|
18
|
+
puts "-------------------------"
|
19
|
+
puts
|
20
|
+
end
|
21
|
+
|
22
|
+
demo "Using STS" do
|
23
|
+
sts = Aliyun::STS::Client.new(
|
24
|
+
:access_key_id => conf['access_key_id'],
|
25
|
+
:access_key_secret => conf['access_key_secret'])
|
26
|
+
|
27
|
+
token = sts.assume_role(
|
28
|
+
'acs:ram::52352:role/aliyunosstokengeneratorrole', 'app-1')
|
29
|
+
|
30
|
+
client = Aliyun::OSS::Client.new(
|
31
|
+
:endpoint => 'http://oss-cn-hangzhou.aliyuncs.com',
|
32
|
+
:sts_token => token.security_token,
|
33
|
+
:access_key_id => token.access_key_id,
|
34
|
+
:access_key_secret => token.access_key_secret)
|
35
|
+
|
36
|
+
unless client.bucket_exists?('bucket-for-sts-test')
|
37
|
+
client.create_bucket('bucket-for-sts-test')
|
38
|
+
end
|
39
|
+
|
40
|
+
bucket = client.get_bucket('bucket-for-sts-test')
|
41
|
+
|
42
|
+
bucket.put_object('hello') { |s| s << 'hello' }
|
43
|
+
bucket.put_object('world') { |s| s << 'world' }
|
44
|
+
|
45
|
+
bucket.list_objects.take(10).each do |obj|
|
46
|
+
puts "Object: #{obj.key}, size: #{obj.size}"
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.expand_path("../../../../lib", __FILE__))
|
4
|
+
require 'yaml'
|
5
|
+
require 'aliyun/sts'
|
6
|
+
|
7
|
+
Aliyun::Common::Logging.set_log_level(Logger::DEBUG)
|
8
|
+
conf_file = '~/.sts.yml'
|
9
|
+
conf = YAML.load(File.read(File.expand_path(conf_file)))
|
10
|
+
client = Aliyun::STS::Client.new(
|
11
|
+
:access_key_id => conf['access_key_id'],
|
12
|
+
:access_key_secret => conf['access_key_secret'])
|
13
|
+
|
14
|
+
# 辅助打印函数
|
15
|
+
def demo(msg)
|
16
|
+
puts "######### #{msg} ########"
|
17
|
+
puts
|
18
|
+
yield
|
19
|
+
puts "-------------------------"
|
20
|
+
puts
|
21
|
+
end
|
22
|
+
|
23
|
+
token = client.assume_role(
|
24
|
+
'acs:ram::52352:role/aliyunosstokengeneratorrole', 'app-1')
|
25
|
+
|
26
|
+
demo "Assume role" do
|
27
|
+
begin
|
28
|
+
token = client.assume_role(
|
29
|
+
'acs:ram::52352:role/aliyunosstokengeneratorrole', 'app-1')
|
30
|
+
|
31
|
+
puts "Credentials for session: #{token.session_name}"
|
32
|
+
puts "access key id: #{token.access_key_id}"
|
33
|
+
puts "access key secret: #{token.access_key_secret}"
|
34
|
+
puts "security token: #{token.security_token}"
|
35
|
+
puts "expiration at: #{token.expiration}"
|
36
|
+
rescue => e
|
37
|
+
puts "AssumeRole failed: #{e.message}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
demo "Assume role with policy" do
|
42
|
+
begin
|
43
|
+
policy = Aliyun::STS::Policy.new
|
44
|
+
policy.allow(
|
45
|
+
['oss:Get*', 'oss:PutObject'],
|
46
|
+
['acs:oss:*:*:my-bucket', 'acs:oss:*:*:my-bucket/*'])
|
47
|
+
|
48
|
+
token = client.assume_role(
|
49
|
+
'acs:ram::52352:role/aliyunosstokengeneratorrole', 'app-2', policy, 900)
|
50
|
+
|
51
|
+
puts "Credentials for session: #{token.session_name}"
|
52
|
+
puts "access key id: #{token.access_key_id}"
|
53
|
+
puts "access key secret: #{token.access_key_secret}"
|
54
|
+
puts "security token: #{token.security_token}"
|
55
|
+
puts "expiration at: #{token.expiration}"
|
56
|
+
rescue => e
|
57
|
+
puts "AssumeRole failed: #{e.message}"
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Aliyun
|
4
|
+
module Common
|
5
|
+
|
6
|
+
##
|
7
|
+
# Base exception class
|
8
|
+
#
|
9
|
+
class Exception < RuntimeError
|
10
|
+
attr_reader :message
|
11
|
+
|
12
|
+
def initialize(message)
|
13
|
+
@message = message
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end # Common
|
18
|
+
end # Aliyun
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'logger'
|
4
4
|
|
5
5
|
module Aliyun
|
6
|
-
module
|
6
|
+
module Common
|
7
7
|
##
|
8
8
|
# Logging support
|
9
9
|
# @example
|
@@ -11,7 +11,7 @@ module Aliyun
|
|
11
11
|
# logger.info(xxx)
|
12
12
|
module Logging
|
13
13
|
|
14
|
-
DEFAULT_LOG_FILE = "./
|
14
|
+
DEFAULT_LOG_FILE = "./aliyun_sdk.log"
|
15
15
|
MAX_NUM_LOG = 100
|
16
16
|
ROTATE_SIZE = 10 * 1024 * 1024
|
17
17
|
|
@@ -42,5 +42,5 @@ module Aliyun
|
|
42
42
|
end
|
43
43
|
|
44
44
|
end # logging
|
45
|
-
end #
|
45
|
+
end # Common
|
46
46
|
end # Aliyun
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Aliyun
|
4
|
+
module Common
|
5
|
+
|
6
|
+
# Common structs used. It provides a 'attrs' helper method for
|
7
|
+
# subclass to define its attributes. 'attrs' is based on
|
8
|
+
# attr_reader and provide additional functionalities for classes
|
9
|
+
# that inherits Struct::Base :
|
10
|
+
# * the constuctor is provided to accept options and set the
|
11
|
+
# corresponding attibute automatically
|
12
|
+
# * the #to_s method is rewrite to concatenate the defined
|
13
|
+
# attributes keys and values
|
14
|
+
# @example
|
15
|
+
# class X < Struct::Base
|
16
|
+
# attrs :foo, :bar
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# x.new(:foo => 'hello', :bar => 'world')
|
20
|
+
# x.foo # == "hello"
|
21
|
+
# x.bar # == "world"
|
22
|
+
# x.to_s # == "foo: hello, bar: world"
|
23
|
+
module Struct
|
24
|
+
class Base
|
25
|
+
module AttrHelper
|
26
|
+
def attrs(*s)
|
27
|
+
define_method(:attrs) {s}
|
28
|
+
attr_reader(*s)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
extend AttrHelper
|
33
|
+
|
34
|
+
def initialize(opts = {})
|
35
|
+
extra_keys = opts.keys - attrs
|
36
|
+
unless extra_keys.empty?
|
37
|
+
fail Common::Exception,
|
38
|
+
"Unexpected extra keys: #{extra_keys.join(', ')}"
|
39
|
+
end
|
40
|
+
|
41
|
+
attrs.each do |attr|
|
42
|
+
instance_variable_set("@#{attr}", opts[attr])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def to_s
|
47
|
+
attrs.map do |attr|
|
48
|
+
v = instance_variable_get("@#{attr}")
|
49
|
+
"#{attr.to_s}: #{v}"
|
50
|
+
end.join(", ")
|
51
|
+
end
|
52
|
+
end # Base
|
53
|
+
end # Struct
|
54
|
+
|
55
|
+
end # Common
|
56
|
+
end # Aliyun
|
data/lib/aliyun/oss.rb
CHANGED
data/lib/aliyun/oss/bucket.rb
CHANGED
data/lib/aliyun/oss/client.rb
CHANGED
@@ -18,8 +18,6 @@ module Aliyun
|
|
18
18
|
# bucket = client.get_bucket('my-bucket')
|
19
19
|
class Client
|
20
20
|
|
21
|
-
include Logging
|
22
|
-
|
23
21
|
# 构造OSS client,用于操作buckets。
|
24
22
|
# @param opts [Hash] 构造Client时的参数选项
|
25
23
|
# @option opts [String] :endpoint [必填]OSS服务的地址,可以是以
|
@@ -30,6 +28,8 @@ module Aliyun
|
|
30
28
|
# KEY SECRET,如果不填则会尝试匿名访问
|
31
29
|
# @option opts [Boolean] :cname [可选] 指定endpoint是否是用户绑
|
32
30
|
# 定的域名
|
31
|
+
# @option opts [Boolean] :sts_token [可选] 指定STS的
|
32
|
+
# SecurityToken,如果指定,则使用STS授权访问
|
33
33
|
# @option opts [Fixnum] :open_timeout [可选] 指定建立连接的超时
|
34
34
|
# 时间,默认为10秒
|
35
35
|
# @option opts [Fixnum] :read_timeout [可选] 指定等待响应的超时
|
data/lib/aliyun/oss/config.rb
CHANGED
@@ -7,9 +7,10 @@ module Aliyun
|
|
7
7
|
# A place to store various configurations: credentials, api
|
8
8
|
# timeout, retry mechanism, etc
|
9
9
|
#
|
10
|
-
class Config < Struct::Base
|
10
|
+
class Config < Common::Struct::Base
|
11
11
|
|
12
|
-
attrs :endpoint, :cname, :
|
12
|
+
attrs :endpoint, :cname, :sts_token,
|
13
|
+
:access_key_id, :access_key_secret,
|
13
14
|
:open_timeout, :read_timeout
|
14
15
|
|
15
16
|
def initialize(opts = {})
|
data/lib/aliyun/oss/download.rb
CHANGED
data/lib/aliyun/oss/exception.rb
CHANGED
@@ -5,20 +5,13 @@ require 'nokogiri'
|
|
5
5
|
module Aliyun
|
6
6
|
module OSS
|
7
7
|
|
8
|
-
##
|
9
|
-
# Base exception class
|
10
|
-
#
|
11
|
-
class Exception < RuntimeError
|
12
|
-
end
|
13
|
-
|
14
8
|
##
|
15
9
|
# ServerError represents exceptions from the OSS
|
16
10
|
# service. i.e. Client receives a HTTP response whose status is
|
17
11
|
# NOT OK. #message provides the error message and #to_s gives
|
18
12
|
# detailed information probably including the OSS request id.
|
19
13
|
#
|
20
|
-
class ServerError < Exception
|
21
|
-
include Logging
|
14
|
+
class ServerError < Common::Exception
|
22
15
|
|
23
16
|
attr_reader :http_code, :error_code, :message, :request_id
|
24
17
|
|
@@ -65,12 +58,7 @@ module Aliyun
|
|
65
58
|
# ClientError represents client exceptions caused mostly by
|
66
59
|
# invalid parameters.
|
67
60
|
#
|
68
|
-
class ClientError < Exception
|
69
|
-
attr_reader :message
|
70
|
-
|
71
|
-
def initialize(message)
|
72
|
-
@message = message
|
73
|
-
end
|
61
|
+
class ClientError < Common::Exception
|
74
62
|
end # ClientError
|
75
63
|
|
76
64
|
##
|