I did this in my Amazon Lightsail vps in order to convert it over to using LVM.  First, you have to disable the cloud-init package from automatically growing the partition on each boot.  IIRC, you need to comment out or delete the lines in /etc/cloud/cloud.cfg that reference growpart and resizefs.  Then you can add these two scripts:

    #!/bin/sh

    PREREQ=""
    
    prereqs()
    {
            echo "$PREREQ"
    }
    
    case "${1:-}" in
      prereqs)
        prereqs
        exit 0
        ;;
    esac
    
    . /usr/share/initramfs-tools/hook-functions
    
    # copy the binary as early as possible
    copy_exec /sbin/resize2fs /sbin
    copy_exec /sbin/e2fsck /sbin

Put that in /etc/initramfs-tools/hooks/resize-hook

    #!/bin/sh
    
    PREREQ=""
    
    prereqs()
    {
            echo "$PREREQ"
    }
    
    case $1 in
    # get pre-requisites
    prereqs)
            prereqs
            exit 0
            ;;
    esac
    
    e2fsck -fy /dev/sda1
    resize2fs /dev/sda1 9g

Change the 9g to whatever size you want the fs shrunk to and put that in /etc/initramfs-tools/scripts/local-premount/resize.  Don't forget to chmod the two scripts +x, and rebuild your initramfs with `update-initramfs`.

After you reboot, verify that the filesystem did get shrunk, use the resizepart command in `parted` to shrink the partition.  It' a good idea to leave an extra gb or so in the partition to make sure you don't shrink the partition smaller than the filesystem, then run `resize2fs` on it later to expand it to fill the whole new partition size.