2016-03-06 62 views
2

我正在用Flask製作一個簡單的代理來模擬AWS的調用describe_regions()。代理模擬ec2.describe_regions()(AWS)

燒瓶服務器去下面的代碼:

from __future__ import unicode_literals 

from flask import Flask 
from flask import Response 
from flask import stream_with_context 
# from httpretty import HTTPretty, register_uri 
import httpretty 
import requests 
from flask import request 
import time 


RESPONSE = u"""<DescribeRegionsResponse xmlns="http://ec2.amazonaws.com/doc/2015-10-01/"> 
    <requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId> 
    <regionInfo> 
     <item> 
     <regionName>us-east-1</regionName> 
     <regionEndpoint>ec2.us-east-1.amazonaws.com</regionEndpoint> 
     </item> 
     <item> 
     <regionName>eu-west-1</regionName> 
     <regionEndpoint>ec2.eu-west-1amazonaws.com</regionEndpoint> 
     </item> 
    </regionInfo> 
</DescribeRegionsResponse>""" 


app = Flask(__name__) 

@app.route('/<path:url>', methods=['GET', 'PUT', 'POST', 'DELETE', 'HEAD', 'PATCH', 'OPTIONS', 'CONNECT']) 
def home(url): 
    return Response(RESPONSE, mimetype='text/xml') 

if __name__ == '__main__': 
    app.run(debug=True) 

然後,我有以下代碼來測試它。我使用Boto3來調用AWS的API。

from boto3.session import Session 
import os 

credentials = { 
    'aws_access_key_id': 'sadasdasda', 
    'aws_secret_access_key': 'dasdasdasd' 
} 

os.environ["HTTP_PROXY"] = 'http://localhost:5000/' 
os.environ["HTTPS_PROXY"] = 'http://localhost:5000/' 

session_boto3 = Session(**credentials) 
ec2 = session_boto3.client('ec2', 'eu-west-1', verify=False) 
regions = ec2.describe_regions() 
print regions 

的問題是:在瓶服務器獲取上訪,但響應不喜歡Boto3,我得到以下回溯錯誤:

Traceback (most recent call last): 
    File "/pruebas_mock/prueba.py", line 82, in <module> 
    regions = ec2.describe_regions() 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/client.py", line 228, in _api_call 
    return self._make_api_call(operation_name, kwargs) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/client.py", line 475, in _make_api_call 
    operation_model, request_dict) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/endpoint.py", line 117, in make_request 
    return self._send_request(request_dict, operation_model) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/endpoint.py", line 146, in _send_request 
    success_response, exception): 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/endpoint.py", line 219, in _needs_retry 
    caught_exception=caught_exception) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/hooks.py", line 226, in emit 
    return self._emit(event_name, kwargs) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/hooks.py", line 209, in _emit 
    response = handler(**kwargs) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/retryhandler.py", line 183, in __call__ 
    if self._checker(attempts, response, caught_exception): 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/retryhandler.py", line 250, in __call__ 
    caught_exception) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/retryhandler.py", line 273, in _should_retry 
    return self._checker(attempt_number, response, caught_exception) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/retryhandler.py", line 313, in __call__ 
    caught_exception) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/retryhandler.py", line 222, in __call__ 
    return self._check_caught_exception(attempt_number, caught_exception) 
    File "/mock_aws/local/lib/python2.7/site-packages/botocore/retryhandler.py", line 355, in _check_caught_exception 
    raise caught_exception 
botocore.vendored.requests.exceptions.SSLError: [Errno 1] _ssl.c:510: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 

我應該怎麼做與瓶響應?

謝謝。

回答

1

默認情況下,boto3(以及所有其他AWS開發工具包)將使用SSL連接到服務。您的代理瓶服務器似乎沒有使用SSL,以便您可以使用SSL在你的代理,或者告訴boto3不使用SSL代理服務器:

ec2 = session_boto3.client('ec2', 'eu-west-1', use_ssl=False, verify=False) 

verify參數告訴boto3不要嘗試驗證SSL證書,但它仍會嘗試通過SSL進行連接。 use_ssl=False告訴它使用普通的HTTP與您的端點通話。