2016-12-21 2 views
4

Ich verwende Boto3, um mit S3 zu arbeiten. Wenn meine Anwendung aufgrund eines Netzwerkproblems nicht in der Lage ist, S3 zu erreichen, bleibt die Verbindung hängen, bis sie irgendwann abläuft. Ich möchte einen niedrigeren Verbindungstimeout festlegen. Ich kam in this PR für botocore, die einen Timeout erlaubt die Einstellung:S3 Verbindungszeitüberschreitung bei Verwendung von 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') 

Dieses eine Connect wirft, aber es dauert immer noch zu lang, um Fehler:

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 sowohl die Verbindungs- und lesen Timeouts doesn‘ • Wie schnell reagiert die Verbindung?

+0

Was ist das 'iptables' Befehl dort zu tun? Es verhindert, dass jemand Port 443 eines Servers kontaktiert. Es löscht die Pakete und macht jede HTTPS-Verbindung aus. Warum ist es da? – kichik

+1

@kichik, ich vermute, dass das ist, wie das OP ein defektes Netzwerk simuliert. – llude

Antwort

0

Haben Sie das jemals gelöst? Mein Verdacht ist, dass Sie die Anmeldeinformationen für Ihre Boto-Verbindung benötigen.

Hier ist, wie ich boto3 verbinden:

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

Übrigens ist es eine sehr schlechte Idee, die Variablen 'aws_access_key_id' und 'aws_secret_access_key' im Code zu speichern. Ich würde definitiv empfehlen, Ihre Zugangsdaten als Umgebungsvariablen oder lokal unter '~/.aws/credentials' zu speichern. Siehe den folgenden Link für Details http://boto3.readthedocs.io/en/latest/guide/configuration.html – ScottMcC

2

Sie sind wahrscheinlich von boto3 Standardverhalten von retrying Verbindungen mehrmals gebissen und backing off exponentiell dazwischen. Ich hatte gute Ergebnisse mit den folgenden:

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