aliyun-sdk 0.1.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
##
|