Openstack SWIFT S3 上的代理服务器格式错误请求

Openstack SWIFT proxy-server malformed request on S3

我正在尝试使用 Devstack(使用 devstack 配置文件中的 stable/newton 分支 - local.conf)为开发人员设置 S3 测试平台。虽然我能够使用 CLI(openstack 容器/对象,swift)浏览容器和对象,但我无法使用 s3curl 访问容器。在日志中(完整日志可在下面的 link 中获得)我在请求处理的最后阶段看到两个不同的 URL:

------------“openstack容器列表”命令,在本地发出

proxy-server: Using identity: {'service_roles': [], 'roles': [u'admin'],
'project_domain': (u'default', u'Default'), 'auth_version': 3,
'user': (u'eac0298a83e44b12b2c08aa98e9b1c9a', u'admin'),
'user_domain': (u'default', u'Default'),
'tenant': (u'2d7365b17c8147e9aead99f870125d31', u'admin')}
(txn: txda7984e9e1f04b7792920-005811ca49)
[ ... ]
proxy-server: de.vs.ta.ck de.vs.ta.ck 27/Oct/2016/09/35/05 GET
/v1/AUTH_2d7365b17c8147e9aead99f870125d31%3Fformat%3Djson HTTP/1.0
200 - osc-lib keystoneauth1/2.14.0 python-requests/2.11.1 CPython/2.7.12
a5ef5769d7ef... - 42 - txda7984e9e1f04b7792920-005811ca49 - 0.0881
- - 1477560905.352745056 1477560905.440839052 -

您在上面的请求中看到正确的URL。

------------ S3 会话使用来自 re.mo.te.host

的 s3curl
proxy-server: Using identity: {'service_roles': [], 'roles': [u'admin'],
'project_domain': (u'default', u'Default'), 'auth_version': 3,
'user': (u'eac0298a83e44b12b2c08aa98e9b1c9a', u'admin'),
'user_domain': (u'default', u'Default'),
'tenant': (u'2d7365b17c8147e9aead99f870125d31', u'admin')}
(txn: tx61f057911f3e475eb1962-005811c95a)
[ ... ]
proxy-server: re.mo.te.host re.mo.te.host 27/Oct/2016/09/31/07 GET / HTTP/1.0
200 - curl/7.43.0 - - 219 - tx61f057911f3e475eb1962-005811c95a - 0.2074
- - 1477560666.966339111 1477560667.173743010 -
上面的

URL 格式不正确,当然 return 什么也不会。代理服务器似乎有问题 - 具有相同的信息,它为不同类型的访问产生不同的请求 URLs(swift 客户端访问与远程 S3 访问)。

对于 S3 访问,我创建了 EC2 凭据:

/opt# openstack credential create --type ec2 --project admin admin '{"access" : "admin", "secret" : "adm1n0"}'
blob       :: {"access" : "admin", "secret" : "adm1n0"}
id         :: 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
project_id :: 2d7365b17c8147e9aead99f870125d31
type       :: ec2
user_id    :: eac0298a83e44b12b2c08aa98e9b1c9a

当然,还有为 admin/admin 创建的容器和对象:

/opt# openstack object list c0
+----------+
| Name     |
+----------+
| list.txt |
+----------+

所以,实际上,keystone / swift /swift3 集成没问题,问题出在访问对象存储上。关于哪里出了问题以及如何继续进行的任何想法? proxy-server 的完整日志,以及 proxy-server.conf 可在以下 link:

https://drive.google.com/drive/folders/0Bw0rWy6Euivqdi1lT3pnUElHUmc?usp=sharing

谢谢!

要设置完整 URL 的日志记录,请在代理中使用 "force_swift_request_proxy_log = true"-server.conf (https://github.com/openstack/swift3/blob/1.11/etc/proxy-server.conf-sample#L110-L118)

在任何情况下,问题在于容器的命名不正确 - 我使用的名称太短(例如 c0)。默认情况下,Swift使用非美东地区的命名要求,所以名称"c0"似乎无效;看起来桶名称太短了。来自 S3 的文档 (http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html#bucketnamingrules) -

The rules for DNS-compliant bucket names are:

  • Bucket names must be at least 3 and no more than 63 characters long.
  • ...

尝试将 dns_compliant_bucket_names 选项设置为 False 或使用更长的(>3 个字符)作为容器名称。

感谢 SWIFT 团队在这个问题上的帮助。