@@ -31,25 +31,43 @@ def __init__(
3131 self .region = region
3232 self .service_name = service_name
3333
34- if access_key and secret_key :
35- # Backwards compatibility: use static keys
36- self ._credentials = Credentials (access_key , secret_key , token )
37- self ._has_static_keys = True
38- self ._session = None
39- else :
40- # IRSA
41- session = boto3 .Session ()
42- creds = session .get_credentials ()
43- if not creds :
44- raise RuntimeError ("No AWS credentials found (neither static keys nor IRSA)" )
45- self ._credentials = creds
46- self ._has_static_keys = False
47- self ._session = session
34+ self ._initial_access_key = access_key
35+ self ._initial_secret_key = secret_key
36+ self ._initial_token = token
37+ self ._has_static_keys = bool (access_key and secret_key )
38+ self ._session = None
39+ self ._credentials = None
4840
4941 role_to_assume = assume_role_arn or AWS_ASSUME_ROLE
5042 self ._role_to_assume = role_to_assume
51- if role_to_assume :
52- self ._assume_role (role_to_assume )
43+
44+ self ._last_init_at = None
45+
46+ self .init_credentials ()
47+
48+ def init_credentials (self ) -> None :
49+
50+ try :
51+ if self ._has_static_keys :
52+ self ._credentials = Credentials (self ._initial_access_key , self ._initial_secret_key , self ._initial_token )
53+ self ._session = None
54+ else :
55+ # IRSA
56+ session = boto3 .Session ()
57+ creds = session .get_credentials ()
58+ if not creds :
59+ raise RuntimeError ("No AWS credentials found (neither static keys nor IRSA)" )
60+ self ._credentials = creds
61+ self ._session = session
62+
63+ role_to_assume = self ._role_to_assume
64+ if role_to_assume :
65+ self ._assume_role (role_to_assume )
66+
67+ self ._last_init_at = datetime .utcnow ()
68+ except Exception :
69+ logging .exception ("Failed to initialize credentials" )
70+ raise
5371
5472 def _assume_role (self , role_arn : str ) -> None :
5573 try :
@@ -80,6 +98,12 @@ def _assume_role(self, role_arn: str) -> None:
8098
8199 def _build_auth (self ) -> SigV4Auth :
82100 """Builds fresh SigV4 auth with current credentials (handles rotation)."""
101+ try :
102+ if self ._last_init_at is None or (datetime .utcnow () - self ._last_init_at ).total_seconds () >= 900 :
103+ logging .debug ("Fifteen minutes passed; re-initializing AWS credentials" )
104+ self .init_credentials ()
105+ except Exception :
106+ logging .exception ("Time-based credential refresh failed" )
83107 frozen = self ._credentials .get_frozen_credentials ()
84108 return SigV4Auth (frozen , self .service_name , self .region )
85109
@@ -126,7 +150,8 @@ def _request_with_refresh(self, *, method, url, data=None, params=None, headers=
126150 headers = headers ,
127151 )
128152 if resp is not None and resp .status_code in (400 , 401 , 403 ):
129- self ._refresh_credentials ()
153+ logging .warning ("Auth failure %s, re-initializing credentials" , resp .status_code )
154+ self .init_credentials ()
130155 resp = self .signed_request (
131156 method = method ,
132157 url = url ,
0 commit comments