Generally I use a timer if the animation can be interrupted, like a looping animation of some kind: idle, look around, etc. For animations that can’t be I most often end up in a Custom Action to handle it.
The main reason I use a Custom Action in this case is that I almost always pair my attack with some custom code to handle damage, or to line up the damage with the animation. Check out this thread for a more detailed behavior tree, with an attack that used a custom action.