import requests import logging import time from typing import Optional from .config import S3_AUTH_URL, GITHUB_TOKEN, LOG_CRED_DEBUG logger = logging.getLogger("slowquery") class AwsCreds: def __init__(self, access_key_id: str, secret_access_key: str, session_token: str, expiration: str = ""): self.access_key_id = access_key_id self.secret_access_key = secret_access_key self.session_token = session_token self.expiration = expiration def get_s3_creds_by_github_token(req_id: Optional[str] = None) -> AwsCreds: if not S3_AUTH_URL or not GITHUB_TOKEN: raise RuntimeError("missing config.json or s3.auth_url/github_token") payload = {"github_token": GITHUB_TOKEN} if LOG_CRED_DEBUG: req_prefix = GITHUB_TOKEN[:5] logger.info(f"event=auth_request_token_prefix prefix={req_prefix}") r = None elapsed_s = 0.0 for attempt in range(1, 3): start = time.time() try: r = requests.post(S3_AUTH_URL, json=payload, timeout=(30, 60)) elapsed_s = round(time.time() - start, 3) logger.info(f"event=auth_post_elapsed_s elapsed_s={elapsed_s} url={S3_AUTH_URL} attempt={attempt}") break except requests.exceptions.Timeout as e: elapsed_s = round(time.time() - start, 3) logger.error(f"event=auth_post_timeout attempt={attempt} elapsed_s={elapsed_s} url={S3_AUTH_URL} error={str(e)}") if attempt == 2: raise RuntimeError("get_s3_creds_by_github_token timeout after retry") if r is None: raise RuntimeError("get_s3_creds_by_github_token no response") if r.status_code != 200: logger.error(f"event=auth_response_status_code status_code={r.status_code} elapsed_s={elapsed_s}") raise RuntimeError(f"get_s3_creds_by_github_token failed: {r.status_code}") data = r.json() if LOG_CRED_DEBUG: resp_prefix = str(data.get("session_token", ""))[:5] logger.info(f"event=auth_response_token_prefix prefix={resp_prefix}") return AwsCreds( access_key_id=data.get("access_key_id", ""), secret_access_key=data.get("secret_access_key", ""), session_token=data.get("session_token", ""), expiration=data.get("expiration", ""), )