web-dev-qa-db-ja.com

boto3使用時のS3接続タイムアウト

Boto3を使用してS3を操作しています。ネットワークの問題によりアプリケーションがS3に到達できない場合、接続は最終的にタイムアウトするまでハングします。より低い接続タイムアウトを設定したいと思います。私は this 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)'))

接続タイムアウトと読み取りタイムアウトの両方を調整しても、接続の応答速度には影響しません。

14
Python Novice

おそらく、接続を複数回再試行し、その間で指数関数的にバックオフするというboto3のデフォルトの動作に噛まれます。私は次の結果が得られました。

from botocore.client import Config
import boto3

config = Config(connect_timeout=5, retries={'max_attempts': 0})
s3 = boto3.client('s3', config=config)
15
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