"""Build a CloudWatch console deep-link for the running Lambda invocation. Shared by @task_handler and @subtask_handler so both persist the same `cloud_logs_url` onto the SubTask they run. """ import os from typing import Optional from urllib.parse import quote def _console_encode(value: str) -> str: return quote(value, safe="").replace("%", "$25") def cloudwatch_url() -> Optional[str]: """Deep-link to this invocation's log stream, or None outside Lambda.""" region = os.environ.get("AWS_REGION") log_group = os.environ.get("AWS_LAMBDA_LOG_GROUP_NAME") log_stream = os.environ.get("AWS_LAMBDA_LOG_STREAM_NAME") if not (region and log_group and log_stream): return None return ( f"https://{region}.console.aws.amazon.com/cloudwatch/home" f"?region={region}#logsV2:log-groups/log-group/" f"{_console_encode(log_group)}/log-events/{_console_encode(log_stream)}" )