AWSをいじるために、botoライブラリを使ってPythonスクリプトを作っていた時に、Proxy環境下で嵌ったのでメモしておく。
なお、ベストプラクティスにはならない、バッドノウハウに近いのでご注意ください。
#環境
・Linux(RHEL6.5)
・Python3.3.6
・AWS SDK for Python(boto2.34.0)
・HTTP Proxy環境下
#事象
Proxy経由だと、APIをCallする際に以下の様なエラーが出る。
# python3
>>> import boto.ec2
>>> conn = boto.ec2.connect_to_region(‘ap-northeast-1’)
>>> conn.get_only_instances(instance_ids=[‘i-0de8dc14’])
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
File “/opt/python3.3.6/lib/python3.3/site-packages/boto/ec2/connection.py”, line 623, in get_only_instances
next_token=next_token)
File “/opt/python3.3.6/lib/python3.3/site-packages/boto/ec2/connection.py”, line 682, in get_all_reservations
[(‘item’, Reservation)], verb=‘POST’)
File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 1166, in get_list
response = self.make_request(action, params, path, verb)
File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 1112, in make_request
return self._mexe(http_request)
File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 913, in _mexe
self.is_secure)
File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 705, in get_http_connection
return self.new_http_connection(host, port, is_secure)
File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 747, in new_http_connection
connection = self.proxy_ssl(host, is_secure and 443 or 80)
File “/opt/python3.3.6/lib/python3.3/site-packages/boto/connection.py”, line 796, in proxy_ssl
sock.sendall(“CONNECT %s HTTP/1.0\r\n” % host)
TypeError: ‘str’ does not support the buffer interface
#暫定対処
SSL通信が上手く通過出来てなかったように見えるので、
connectionを張る際に、is_secure=False
を付けることで接続できた。
ただし、その設定値名の通り非SSL通信となりそうなので、利用シーンは気をつけたほうが良いかも。
>>> conn = boto.ec2.connect_to_region(‘ap-northeast-1’,is_secure=False)
>>> conn.get_only_instances(instance_ids=[‘i-0de8dc14’])
>>> [Instance:i-0de8dc14]
#botoのconfig
botoライブラリには実行時にいくつかの設定を読みこませられるそうです。
/etc/boto.cfg
- for site-wide settings that all users on this machine > will use~/.boto
- for user-specific settings~/.aws/credentials
- for credentials shared between SDKs
Proxyに関しては、以下のように記述すれば良さそう。
~/.boto
[Boto]
proxy = myproxy.com
proxy_port = 8080
ですが、私の環境ではこれがなぜか上手く読み込めてなさそうだったので、暫定対処としてハードコーディングに至りました。
この辺り、ノウハウある方はぜひコメント頂ければと思います。