I started a snapshot of
1TB volume that carries
750GB of data in AWS EC2 without shutting the instance down. It gave completed status, progress 100% when I noted after 10hrs. I can see the started time. But how to know the exact completion time of the snapshot?
The completion time is generally not important, as the snapshot is of the volume as at the time you request it, even if you change it while the snapshot is being made. It can take several hours, but it generally doesn't matter how long it takes. My experience is snapshots can take from a few minutes to a few hours, depending on how much data is changed, if there's an existing snapshot, and probably due to internal AWS factors as well.
As pointed out by Joseph below in the comments, the completion time matters if you're doing a backup before you make a change and need to roll that change back.
If you need a completely consistent snapshot you shut the server down, trigger the snapshot, then start the server immediately. This primarily ensures all data is flushed to disk and in a consistent state, with nothing in RAM. It's similar to Windows shadow copy.
In most cases a snapshot of a running system is fine, but sometimes it will be inconsistent. If an application is writing to the disk when the snapshot is requested that data may be corrupt.
EC2 Snapshot documentation is fairly good, like most AWS documentation.
Tip: the first snapshot of any volume is the slowest as it needs to back up every block. Also, the longer the interval between snapshots the slow they tend to be as there's more data to snapshot. If you need a really fast snapshot at any particular time, take a snapshot a couple of hour earlier as that will make the next snapshot faster.
You can use AWS Backup to take the snapshot (On-Demand backup OR using Backup Plans), then either run an On-Demand report which will have the "Completion Date" column OR you can go to AWS Backup console -> My Account -> Jobs, filter by volume ID, click on the JOB ID and check the same field, next you need to go to the EC2 console -> Elastic Block Store -> Snapshots and get the "Started" value. Having these 2 values you can calculate the actual run time.
Do not use "Job Run Time" from the AWS Backup report since it is calculated based on the "Creation Date" of the job and not when the job actually started.