Skip to content

Commit 49222ff

Browse files
committed
fix refresh creds
1 parent 601f144 commit 49222ff

File tree

2 files changed

+43
-18
lines changed

2 files changed

+43
-18
lines changed

prometrix/connect/aws_connect.py

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "prometrix"
3-
version = "0.2.6"
3+
version = "0.2.7"
44
authors = ["Avi Kotlicky <[email protected]>"]
55
readme = "README.md"
66
packages = [{include = "prometrix"}]

0 commit comments

Comments
 (0)