2016-12-21 19 views
4

私はS3で動作するのにboto3を使用しています。私のアプリケーションがネットワークの問題のためにS3に達することができないなら、最終的にタイムアウトするまで接続はハングします。私はより低い接続タイムアウトを設定したいと思います。私は、タイムアウト設定できますbotocoreためthis PRに出くわした:これはのconnecttimeoutをスロー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: 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)')) 

「doesnの接続と読みの両方のタイムアウトを微調整します接続がどれくらい速く応答するかに影響します。

+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}) 
関連する問題