AppEngine:使用 boto 连接到启用 SSL 的 AWS 云端点
AppEngine: connect with boto to AWS cloud end-point with SSL enabled
我正在尝试通过 Python boto
库从 AppEngine 标准环境(或从 dev_server)调用 AWS 端点。
这是一个例子:
import boto.sqs
sqs = boto.sqs.connect_to_region(constants.AWS_REGION,
aws_access_key_id = constants.AWS_KEY,
aws_secret_access_key = constants.AWS_SECRET,
is_secure = 1) # <- this option makes the difference!
queue = sqs.create_queue("my-new-queue")
这段代码在我的本地控制台上运行良好,但是当我尝试在 AppEngine 上做同样的事情时,我会看到这个错误堆栈:
File "C:\Work\xxx\app\lib\boto\connection.py", line 1192, in get_object
response = self.make_request(action, params, path, verb)
File "C:\Work\xxx\app\lib\boto\connection.py", line 1116, in make_request
return self._mexe(http_request)
File "C:\Work\xxx\app\lib\boto\connection.py", line 1030, in _mexe
raise ex
error: [Errno 13] Permission denied
这是我已经尝试过但没有成功的方法:
- 使用
boto3
代替boto
- 通过环境变量
GAE_USE_SOCKETS_HTTPLIB
禁用urlfetch
- 关闭
is_secure
。好吧,这有帮助,但仅限于某些终点。例如,STS 会拒绝大多数不安全的调用。
欢迎提出任何想法。
我发现这个问题最简单的解决方法是:
from boto.https_connection import CertValidatingHTTPSConnection
CertValidatingHTTPSConnection._protocol = "https"
此 hack 使 boto 的实现与基于 urlfetch
的 google.appengine.dist27.gae_override.httplib.HTTPConnection
兼容。
我正在尝试通过 Python boto
库从 AppEngine 标准环境(或从 dev_server)调用 AWS 端点。
这是一个例子:
import boto.sqs
sqs = boto.sqs.connect_to_region(constants.AWS_REGION,
aws_access_key_id = constants.AWS_KEY,
aws_secret_access_key = constants.AWS_SECRET,
is_secure = 1) # <- this option makes the difference!
queue = sqs.create_queue("my-new-queue")
这段代码在我的本地控制台上运行良好,但是当我尝试在 AppEngine 上做同样的事情时,我会看到这个错误堆栈:
File "C:\Work\xxx\app\lib\boto\connection.py", line 1192, in get_object
response = self.make_request(action, params, path, verb)
File "C:\Work\xxx\app\lib\boto\connection.py", line 1116, in make_request
return self._mexe(http_request)
File "C:\Work\xxx\app\lib\boto\connection.py", line 1030, in _mexe
raise ex
error: [Errno 13] Permission denied
这是我已经尝试过但没有成功的方法:
- 使用
boto3
代替boto
- 通过环境变量
GAE_USE_SOCKETS_HTTPLIB
禁用urlfetch
- 关闭
is_secure
。好吧,这有帮助,但仅限于某些终点。例如,STS 会拒绝大多数不安全的调用。
欢迎提出任何想法。
我发现这个问题最简单的解决方法是:
from boto.https_connection import CertValidatingHTTPSConnection
CertValidatingHTTPSConnection._protocol = "https"
此 hack 使 boto 的实现与基于 urlfetch
的 google.appengine.dist27.gae_override.httplib.HTTPConnection
兼容。