2016-12-21 16 views
4

Я использую boto3 для работы с S3. Если мое приложение не может достичь S3 из-за сетевой проблемы, соединение будет зависать до тех пор, пока оно не закончится. Я хотел бы установить более низкий тайм-аут соединения. Я наткнулся на this PR для botocore, что позволяет установить тайм-аут:S3 Тайм-аут соединения при использовании boto3

$ sudo iptables -A OUTPUT -p tcp --dport 443 -j DROP 

from botocore.client import Config 
import boto3 

config = Config(connect_timeout=5, read_timeout=5) 

s3 = boto3.client('s3', config=config) 

s3.head_bucket(Bucket='my-s3-bucket') 

Это бросает ConnectTimeout, но она по-прежнему занимает слишком много времени, чтобы без ошибок:

ConnectTimeout: HTTPSConnectionPool(host='my-s3-bucket.s3.amazonaws.com', port=443): Max retries exceeded with url:/(Caused by ConnectTimeoutError(<botocore.awsrequest.AWSHTTPSConnection object at 0x2ad5dd0>, 'Connection to my-s3-bucket.s3.amazonaws.com timed out. (connect timeout=5)')) 

Tweaking как подключить и читать таймаут Безразлично» t влияет на скорость соединения.

+0

Что это за команда 'iptables'? Это не позволяет никому связаться с портом 443 любого сервера. Он отбрасывает пакеты и отключает время соединения HTTPS. Почему он там? – kichik

+1

@kichik, я подозреваю, что OP имитирует неисправную сеть. – llude

ответ

0

Вы когда-нибудь поняли это? Мое подозрение в том, что вам нужны учетные данные для вашего соединения boto.

Вот как я подключаюсь к boto3:

import boto3 
from botocore.exceptions import ClientError 
import re 
from io import BytesIO 
import gzip 
import datetime 
import dateutil.parser as dparser 
from datetime import datetime 
import tarfile 
import requests 
import sys 
from awsglue.transforms import * 
from awsglue.utils import getResolvedOptions 
from pyspark.context import SparkContext 
from awsglue.context import GlueContext 
from awsglue.job import Job 

## Needed glue stuff 
sc = SparkContext() 
glueContext = GlueContext(sc) 
spark = glueContext.spark_session 
job = Job(glueContext) 

## 
## currently this will run for everything that is in the staging directory   of omniture 

# set needed parms 
myProfileName = 'MyDataLake' 
dhiBucket = 'data-lake' 
#create boto3 session 
try:  
    session = boto3.Session(aws_access_key_id='aaaaaaaaaaaa', aws_secret_access_key='abcdefghijklmnopqrstuvwxyz', region_name='us-east- 1')aws_session_token=None, region_name=None, botocore_session=None 
s3 = session.resource('s3') #establish connection to s3 
except Exception as conne: 
    print ("Unable to connect: " + str(conne)) 
    errtxt = requests.post("https://errorcapturesite", data= {'message':'Unable to connect to : ' + myProfileName,  'notify':True,'color':'red'}) 
    print(errtxt.text) 
    exit() 
+1

Кстати, это очень плохая идея хранить ваши переменные 'aws_access_key_id' и' aws_secret_access_key' в коде. Определенно рекомендую хранить ваши учетные данные в качестве переменных среды или локально в '~/.aws/credentials'. См. Следующую ссылку: http://boto3.readthedocs.io/en/latest/guide/configuration.html. – ScottMcC

2

Вы, вероятно, укушенным поведением по умолчанию boto3 о связи повторно сделать несколько раз и экспоненциально отступая между ними. У меня были хорошие результаты со следующим:

config = Config(connect_timeout=5, retries={'max_attempts': 0})