2016-03-06 3 views
2

Я создаю простой прокси с Flask, чтобы издеваться над вызовом describe_regions() AWS.Прокси для издевательства 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 для вызова API для AWS.

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 (и все остальные SDK SDK) подключаются к службам, использующим 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 для связи с вашей конечной точкой.