I created two different versions of the auto-scaling group template.
The first template doesn't auto-assign a public IP to the EC2 instances on creation, so there is only a private IP assigned to the EC2 instance when created. The target group health checks continuously fail as Unhealthy for the EC2 instance though.
However, in the second template of the ASG in the Network Configuration section I set a public IP to be auto-assigned to the EC2 instance. Then the target group health checks pass no issue.
The public IP auto-assignment is the only difference between the two templates. When creating the ASG from the templates I am selecting the public subnets (meaning they route traffic to the IGW) of the VPC I am working with. I have also tried private subnets with the same issue. The VPC for the EC2 instances is the same as the application load balancer.
The security groups for the ALB and EC2 instances both allow all incoming traffic on port 80.
Since the load balancer and EC2 instances are in the same VPC I assumed the target group would be able to resolve the health checks without needing to assign a public IP to the EC2 instances.
I'm not understanding why it's required to have a public IP assigned to the EC2 instances.