2016-12-21 89 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)')) 

調整兩者的連接和讀取超時沒有按」不會影響連接響應的速度。

+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})