Как правильно задать анимацию небольшого вращения-"покачивания" в canvas?
Можно угол поворота сделать функцией синуса от прошедшего времени.  Примерно так:var ts0;
function draw(ts) {
    // ...
    if(!ts0) ts0 = ts;
    const dt = ts - ts0; // сколько прошло миллисекунд
    //  ...
    ctx.translate(500, 180 + Math.sin(dt/352)*3); 
    ctx.rotate( Math.sin(dt/630) / 40 ); Тут помимо поворота ещё по вертикали слегка покачивается. Так же, плавной синусоидой, но с другим периодом, чтобы не выглядело циклично.Рабочий пример.
В функцию, вызываемую по requestAnimationFrame() параметром передаётся текущее время, так что можно не заморачиваться с созданием нового объекта Date, а использовать этот параметр.
Из соотношения координат в  ctx.drawImage(cloud, -350, -250); с размерами картинки определяется центр, относительно которого получится вращение. Желательно его подобрать так, чтобы они приходился на визуальный центр масс тучи.
Держите. Коэффициенты для изменения скорости и амплитуды - их вы, думаю, сможете подобрать самостоятельно.