Skip to main content
Source

This page is generated from skills/dotnet-aws-ecs/references/healthcheck-endpoint-guide.md. Edit the source, not this page.

Third-party skill

This skill is maintained by adisimon217 under the MIT license. Upstream: https://github.com/adisimon217/sample-appmod-skills

Health Check Endpoint Guide

This reference defines patterns for verifying and configuring a health check endpoint in .NET applications targeting ECS Fargate with an Application Load Balancer.

Why Health Checks Are Required​

Both the ALB target group and the ECS service rely on health checks to determine whether a container is healthy:

  • ALB target group sends periodic HTTP requests to the health check path. If a target fails consecutive checks, the ALB removes it from rotation.
  • ECS deployment circuit breaker uses health check status to decide whether a rolling deployment succeeded or should roll back.

Without a working health check endpoint, the ALB will mark all targets as unhealthy and the service will never stabilize.

Check First​

Before adding anything, check if the application already exposes a health check:

  1. Search Program.cs (or Startup.cs for older patterns) for:
    • MapHealthChecks
    • UseHealthChecks
    • Any custom middleware mapped to /health, /hc, /healthz, or /status
  2. Check if Microsoft.Extensions.Diagnostics.HealthChecks or Microsoft.AspNetCore.Diagnostics.HealthChecks is already referenced in the .csproj.

If a health check endpoint already exists, note its path (e.g., /hc) and skip to the "Wire Into IaC" section.

Adding the Health Check Endpoint​

Step 1: Add the NuGet Package (if not present)​

The base health check infrastructure is included in the Microsoft.AspNetCore.App shared framework, so no extra package is needed for a basic liveness endpoint.

Only add packages if you need specific health check providers (database, Redis, etc.) — which is out of scope for this skill.

Step 2: Register Health Check Services​

In Program.cs, add the service registration before var app = builder.Build();:

builder.Services.AddHealthChecks();

Step 3: Map the Health Check Endpoint​

After var app = builder.Build();, map the endpoint:

app.MapHealthChecks("/hc");

Use /hc as the default health check path. It is:

  • Short and conventional in .NET applications
  • Unlikely to conflict with application routes
  • Easy to remember when configuring ALB target groups

If the application already uses a different path (e.g., /health or /healthz), keep the existing path — just ensure the IaC health check configuration matches.

Full Example (Minimal API / ASP.NET Core 8+)​

var builder = WebApplication.CreateBuilder(args);

// ... existing service registrations ...

builder.Services.AddHealthChecks();

var app = builder.Build();

// ... existing middleware pipeline ...

app.MapHealthChecks("/hc");

// ... existing endpoint mappings (MapControllers, MapRazorPages, etc.) ...

app.Run();

Older Patterns (Startup.cs)​

For applications still using the Startup.cs pattern:

ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
// ... existing registrations ...
services.AddHealthChecks();
}

Configure:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// ... existing middleware ...
app.UseEndpoints(endpoints =>
{
endpoints.MapHealthChecks("/hc");
// ... existing endpoints ...
});
}

Wire Into IaC​

The health check path must be configured in two places in the generated IaC:

ALB Target Group​

# CloudFormation
TargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
HealthCheckPath: /hc
HealthCheckIntervalSeconds: 30
HealthCheckTimeoutSeconds: 5
HealthyThresholdCount: 2
UnhealthyThresholdCount: 3
Matcher:
HttpCode: "200"
// CDK
var targetGroup = new ApplicationTargetGroup(this, "TargetGroup", new ApplicationTargetGroupProps
{
HealthCheck = new Amazon.CDK.AWS.ElasticLoadBalancingV2.HealthCheck
{
Path = "/hc",
Interval = Duration.Seconds(30),
Timeout = Duration.Seconds(5),
HealthyThresholdCount = 2,
UnhealthyThresholdCount = 3
}
});

ECS Task Definition (Container Health Check)​

Optionally, add a container-level health check in the task definition. This lets ECS itself monitor the container independently of the ALB:

# CloudFormation
ContainerDefinitions:
- Name: !Sub "${EnvironmentName}-app"
HealthCheck:
Command:
- "CMD-SHELL"
- "curl -f http://localhost:8080/hc || exit 1"
Interval: 30
Timeout: 5
Retries: 3
StartPeriod: 60

Note on chiseled images: Ubuntu Chiseled runtime images do not include curl or a shell. For chiseled images, rely on the ALB health check alone and omit the container-level HealthCheck. The ALB health check is sufficient for ECS deployment monitoring when using the deployment circuit breaker.

Validation​

After adding the health check, verify it works locally:

dotnet run
# In another terminal:
curl http://localhost:<port>/hc

Expected response:

  • HTTP 200 with body Healthy

If the application isn't runnable locally (e.g., missing database), the health check will still return 200 by default since a basic AddHealthChecks() with no registered checks always reports healthy.

Summary of Decisions​

DecisionDefaultNotes
Health check path/hcKeep existing path if one is already configured
Container-level health checkOmit for chiseled imagesNo curl/shell available
ALB health check interval30sGood balance for dev environments
Unhealthy threshold3Allows brief startup delays
Start period (container)60sOnly relevant if container health check is used