  def Copy(
      self,
      kms_key_id: Optional[str] = None,
      delete: bool = False,
      deletion_account: Optional['account.AWSAccount'] = None) -> 'AWSSnapshot':
    """Copy a snapshot.

    Args:
      kms_key_id (str): Optional. A KMS key id to encrypt the snapshot copy
          with. If set to None but the source snapshot is encrypted,
          then the copy will be encrypted too (with the key used by the
          source snapshot).
      delete (bool): Optional. If set to True, the snapshot being copied will
          be deleted prior to returning the copy. Default is False.
      deletion_account (AWSAccount): Optional. An AWSAccount object to use to
          delete the snapshot if 'delete' is set to True. Since accounts operate
          per region, this can be useful when copying snapshots across regions
          (which requires one AWSAccount object per region as per
          boto3.session.Session() requirements) and wanting to delete the source
          snapshot located in a different region than the copy being created.

    Returns:
      AWSSnapshot: A copy of the snapshot.

    Raises:
      ResourceCreationError: If the snapshot could not be copied.
    """

    client = self.aws_account.ClientApi(common.EC2_SERVICE)
    copy_args = {
        'SourceRegion': self.region,
        'SourceSnapshotId': self.snapshot_id
    }  # type: Dict[str, Union[str, bool]]
    if kms_key_id:
      copy_args['Encrypted'] = True
      copy_args['KmsKeyId'] = kms_key_id
    try:
      response = client.copy_snapshot(**copy_args)
    except client.exceptions.ClientError as exception:
      raise errors.ResourceCreationError(
          'Could not copy snapshot {0:s}: {1:s}'.format(
              self.snapshot_id, str(exception)), __name__) from exception

    snapshot_copy = AWSSnapshot(
        # The response contains the new snapshot ID
        response['SnapshotId'],
        self.aws_account,
        self.aws_account.default_region,
        self.aws_account.default_availability_zone,
        self.volume,
        name='{0:s}-copy'.format(self.snapshot_id)
    )

    # Wait for the copy to be available
    client.get_waiter('snapshot_completed').wait(
        SnapshotIds=[snapshot_copy.snapshot_id],
        WaiterConfig={'Delay': 30, 'MaxAttempts': 100})

    if delete:
      if deletion_account:
        self.aws_account = deletion_account
      self.Delete()

    return snapshot_copy
Copy a snapshot.

Args:
kms_key_id (str): Optional. A KMS key id to encrypt the snapshot copy
with. If set to None but the source snapshot is encrypted,
then the copy will be encrypted too (with the key used by the
source snapshot).
delete (bool): Optional. If set to True, the snapshot being copied will
be deleted prior to returning the copy. Default is False.
deletion_account (AWSAccount): Optional. An AWSAccount object to use to
delete the snapshot if 'delete' is set to True. Since accounts operate
per region, this can be useful when copying snapshots across regions
(which requires one AWSAccount object per region as per
boto3.session.Session() requirements) and wanting to delete the source
snapshot located in a different region than the copy being created.

Returns:
AWSSnapshot: A copy of the snapshot.

Raises:
ResourceCreationError: If the snapshot could not be copied.
libcloudforensics/providers/aws/internal/ebs.py