I can reproduce this with DynamoDB and S3. For example, this file as `template.json`:
```json
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::Serverless-2016-10-31",
  "Resources": {
    "S3Setup": {
      "Type": "AWS::S3::Bucket",
      "Properties": {
        "BucketName": "testbucket"
      }
    }
  }
}
```
Apply using
`awslocal cloudformation create-stack --stack-name local --template-body file://template.json` -> 200 OK
Immediately followed by
`awslocal cloudformation create-change-set --stack-name local --change-set-name nochanges --template-body file://template.json` -> Error
Errors happen if stack has multiple objects and any one has no changes, which makes it impossible to update the stack via cloudformation.

Here's a DynamoDB example for which it happens as well:
```json
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Transform": "AWS::Serverless-2016-10-31",
  "Resources": {
    "DynamoSample": {
      "Type": "AWS::DynamoDB::Table",
      "Properties": {
        "TableName": "ExampleTable",
        "AttributeDefinitions": [
          {
            "AttributeName": "name",
            "AttributeType": "S"
          }
        ],
        "KeySchema": [
          {
            "AttributeName": "name",
            "KeyType": "HASH"
          }
        ],
        "ProvisionedThroughput": {
          "ReadCapacityUnits": 1,
          "WriteCapacityUnits": 1
        }
      }
    }
  }
}
```

stack_name = resources_map.get('AWS::StackName')
        resource_hash_key = (stack_name, logical_id)
        
        updating = CURRENTLY_UPDATING_RESOURCES.get(resource_hash_key)
        LOG.debug('Currently updating stack resource %s/%s: %s' % (stack_name, logical_id, updating))
        if updating:
            return None
        
        resource_tuple = parsing.parse_resource(logical_id, resource_json, resources_map)
        if not resource_tuple:
            return None
        _, resource_json, _ = resource_tuple
        
        props = resource_json['Properties'] = resource_json.get('Properties') or {}
        if resource_json['Type'] == 'AWS::Lambda::EventSourceMapping' and not props.get('StartingPosition'):
            props['StartingPosition'] = 'LATEST'
        
        resource = resources_map._parsed_resources.get(logical_id)
        if resource and not update:
            return resource
        
        resource_wrapped = {logical_id: resource_json}
        should_be_created = template_deployer.should_be_deployed(logical_id, resource_wrapped, stack_name)
        if not should_be_created:
            
            if not template_deployer.is_updateable(logical_id, resource_wrapped, stack_name):
                LOG.debug('Resource %s need not be deployed: %s %s' % (logical_id, resource_json, bool(resource)))