code: func (b *DynamoDBBackend) KeepAlive(ctx context.Context, lease backend.Lease, expires time.Time) error {
  	if len(lease.Key) == 0 {
  		return trace.BadParameter("lease is missing key")
  	}
  	input := &dynamodb.UpdateItemInput{
  		ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
  			":expires": {
  				N: aws.String(strconv.FormatInt(expires.UTC().Unix(), 10)),
  			},
  			":timestamp": {
  				N: aws.String(strconv.FormatInt(b.clock.Now().UTC().Unix(), 10)),
  			},
  		},
  		TableName: aws.String(b.Tablename),
  		Key: map[string]*dynamodb.AttributeValue{
  			hashKeyKey: {
  				S: aws.String(hashKey),
  			},
  			fullPathKey: {
  				S: aws.String(prependPrefix(lease.Key)),
  			},
  		},
  		UpdateExpression: aws.String("SET Expires = :expires"),
  	}
  	input.SetConditionExpression("attribute_exists(FullPath) AND (attribute_not_exists(Expires) OR Expires >= :timestamp)")
  	_, err := b.svc.UpdateItemWithContext(ctx, input)
  	err = convertError(err)
  	if trace.IsCompareFailed(err) {
  		err = trace.NotFound(err.Error())
  	}
  	return err
  }
docs: // KeepAlive keeps object from expiring, updates lease on the existing object,
  // expires contains the new expiry to set on the lease,
  // some backends may ignore expires based on the implementation
  // in case if the lease managed server side