Мы запускаем службу API с использованием FastAPI (с uvicorn) в среде Kubernetes.
В этой настройке мы используем boto3 для получения учетных данных AWS через AWS, принимающую роль для нескольких учетных записей. Лямбда-вызовы.
Эти учетные данные управляются как глобальные переменные, которые могут использоваться всеми входящим запросами.
Однако существует опасность дублирования выполнения кода. получение учетных данных может произойти по истечении срока их действия.
Должны ли мы написать код для получения учетных данных только из одного потока с использованием threading.Lock()?
Я мне очень интересно узнать какие-нибудь хорошие шаблоны для решения этой ситуации.
#Current Code
Код: Выделить всё
def _get_aws_credentials(role, sesson):
global aws_creds
if aws_creds and aws_creds["Expiration"] > datetime.now(timezone.utc):
return aws_creds
if cached_creds := get_cached_creds():
return cached_creds
client_sts = boto3.client(
"sts", region_name=REGION_NAME, endpoint_url=f"https://sts.{REGION_NAME}.amazonaws.com"
)
aws_creds = client_sts.assume_role(
RoleArn=role,
RoleSessionName=sesson,
).get("Credentials")
set_cache_ext_creds(credentials=aws_creds)
return aws_creds
Источник: https://stackoverflow.com/questions/781 ... yed-on-kub