Joshua Caskie
07/11/2025, 6:27 PMMarvin
07/11/2025, 6:27 PMMarvin
07/11/2025, 6:28 PMprefect.runtime
module:
python
from prefect.runtime import flow_run
# Get the flow run ID
flow_run_id = flow_run.id
# Get job variables (may contain infrastructure-specific information)
job_variables = flow_run.job_variables
2. For ECS-specific task ID, you have a few options:
python
import os
import boto3
def get_ecs_task_id():
# Method 1: From ECS container metadata
task_metadata_uri = os.getenv("ECS_CONTAINER_METADATA_URI_V4")
if task_metadata_uri:
import requests
metadata = requests.get(task_metadata_uri).json()
return metadata.get("TaskARN")
# Method 2: From ECS Task ID environment variable
return os.getenv("AWS_ECS_TASK_ID")
3. You can also access the flow run's metadata through the Prefect API during execution:
python
from prefect.client import get_client
async def get_flow_run_infrastructure_details():
async with get_client() as client:
flow_run_data = await client.read_flow_run(flow_run.id)
# Infrastructure details may be available in the flow run data
return flow_run_data
Note that the exact location of the ECS Task ID might vary depending on your worker configuration and how the infrastructure was set up. The most reliable method is typically using the ECS container metadata endpoint, which is automatically available within ECS tasks.
For more information about ECS integration with Prefect, you can refer to the ECS Guide in the Prefect documentation.
Let me know if you need any clarification or have questions about accessing specific infrastructure details!Joshua Caskie
07/11/2025, 6:58 PMMarvin
07/11/2025, 6:58 PMMarvin
07/11/2025, 7:00 PMpython
import requests
import os
from typing import Optional
def get_ecs_task_details() -> Optional[dict]:
"""Get ECS task details including task ID and execution ID."""
metadata_uri = os.getenv("ECS_CONTAINER_METADATA_URI_V4")
if not metadata_uri:
return None
try:
# Get task metadata
task_response = requests.get(f"{metadata_uri}/task")
if task_response.status_code == 200:
task_metadata = task_response.json()
return {
"task_id": task_metadata.get("TaskARN", "").split("/")[-1],
"task_execution_id": task_metadata.get("TaskExecutionARN", "").split("/")[-1],
"cluster": task_metadata.get("Cluster"),
"task_arn": task_metadata.get("TaskARN"),
"task_execution_arn": task_metadata.get("TaskExecutionARN")
}
except Exception as e:
print(f"Error fetching ECS metadata: {e}")
return None
2. Alternative method using boto3 (if you need to query additional task details):
python
import boto3
from prefect import task
import os
@task
def get_task_execution_details():
# Get the task ID from the metadata endpoint first
task_details = get_ecs_task_details()
if not task_details:
return None
# Use boto3 to get additional details if needed
ecs_client = boto3.client('ecs')
try:
response = ecs_client.describe_tasks(
cluster=task_details["cluster"],
tasks=[task_details["task_arn"]]
)
if response["tasks"]:
task = response["tasks"][0]
return {
"task_id": task_details["task_id"],
"task_execution_id": task_details["task_execution_id"],
"last_status": task.get("lastStatus"),
"desired_status": task.get("desiredStatus"),
"container_instance_arn": task.get("containerInstanceArn")
}
except Exception as e:
print(f"Error querying ECS API: {e}")
return None
You can use these functions in your Prefect flow:
python
from prefect import flow
@flow
def my_ecs_flow():
task_details = get_ecs_task_details()
if task_details:
print(f"Running in ECS Task: {task_details['task_id']}")
print(f"Task Execution ID: {task_details['task_execution_id']}")
else:
print("Not running in ECS or couldn't fetch task details")
The ECS Container Metadata Endpoint (V4) is the most reliable way to get this information because:
1. It's automatically available inside ECS tasks
2. It doesn't require additional AWS permissions
3. It provides real-time information about the current task
Note that the metadata endpoint is only available when running inside an ECS container. If you need to access this information from outside the task, you'll need to use the boto3 method with appropriate AWS permissions.
For more information about ECS task metadata, you can refer to the AWS documentation about ECS container metadata.