it-roy-ru.com

S3 Тайм-аут соединения при использовании boto3

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

$ 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)'))

Изменение времени ожидания соединения и чтения не влияет на скорость ответа соединения.

7
Python Novice

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

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

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

Вот как я подключаюсь к 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()
0
EM Bee