J'utilise boto3 pour fonctionner avec S3. Si mon application ne parvient pas à atteindre S3 en raison d'un problème de réseau, la connexion sera suspendue jusqu'à expiration du délai. Je souhaite définir un délai de connexion inférieur. Je suis tombé sur ce PR pour botocore qui permet de définir un délai d’attente:
$ 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')
Cela jette un ConnectTimeout, mais il faut encore trop de temps pour sortir une erreur:
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)'))
L'affinement des délais de connexion et de lecture n'a pas d'incidence sur la rapidité avec laquelle la connexion répond.
Le comportement par défaut de boto3, qui consiste à réessayer plusieurs fois des connexions et à effectuer une sauvegarde exponentielle entre les deux, vous pique probablement J'ai eu de bons résultats avec ce qui suit:
config = Config(connect_timeout=5, retries={'max_attempts': 0})
Avez-vous déjà résolu ce problème? Je soupçonne que vous avez besoin des informations d'identification pour votre connexion Boto.
Voici comment je me connecte à 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()