CloudWatch Alarms are notifications that are created based on whether a set threshold is met on any one of the CloudWatch metrics. The period for which the metrics are evaluated for an alarm can be set to a custom range. The three states are ok, meaning no trigger, insufficient data, indicating that there is not enough data to make a determination, and alarm which is triggered if the threshold is met.
You can have multiple targets for your CloudWatch alarm, it could be to stop, start, or recover an EC2 instance. It could be used for autoscaling on an ASG if a certain capacity threshold is met. Or, it could trigger an SNS notification which could trigger other services as needed. You are able to create composite alarms as well that are able to use AND / OR conditions to monitor the state of multiple alarms and create an alarm based on their collective response. For example, you could have a collective alarm that monitors an alarm for high IOPS and CPU utilization and when both trigger an alarm send an SNS notification.
You are able to monitor the status of EC2 instances as well as the underlying hardware and set an alarm accordingly. A side note, you are able to also create alarms based on the CloudWatch Logs Metric Filter and have an alarm triggered if a certain key phrase appears above a certain amount of time.