I have a SQS Queue
from which messages are read by multiple hosts. I want to run some job (business logic) after all the messages in the queue have been processed.
You could simply note empty receives from the API response while you're polling. Concerning CloudWatch, there is another metric that would be a better fit for this. From the documentation:
NumberOfEmptyReceives
The number of ReceiveMessage API calls that did not return a message.
Units: Count
Valid Statistics: Average, Minimum, Maximum, Sum, Data Samples (displays as Sample Count in the Amazon SQS console)
Some additional info:
I personally used this metric to set up a cloudwatch alarm that will scale down an autoscaling group that hosts my polling job after the sum of NumberOfEmptyReceives > 0 for several consecutive periods. I like doing consecutive periods because it makes it more evident that the queue was not only empty, but has stayed empty.
You could trigger your post business logic on the cloud watch metric related to queue depth. When the depth is 0 then you can send a SNS notification or start a lambda function.
Also this cloud watch metric is better then others since this is actual message count reported by sqs service.