title: Template format error: Every Mappings attribute must be a String or a List
body: <p>I wanted to have some quick references at the top of my CloudFormation template, so that I don't have to write out a complex reference every time i need it throughout the template.</p>
  
  <p>So I wrote this:</p>
  
  <pre><code>Mappings:
    StandardResourcesMap:
      AWSExecuteApi:
        string: !Join [ ':' , ['arn', !Sub '${AWS::Partition}', 'execute-api', !Sub '${AWS::Region}', !Sub '${AWS::AccountId}'] ]
      AWSLambdaFunctions:
        string: !Join [ ':' , ['arn', !Sub '${AWS::Partition}', 'apigateway', !Sub '${AWS::Region}', 'lambda:path/2015-03-31/functions/'] ]
  </code></pre>
  
  <p><em>The rest of the CloudFormation template follows this, and, without the lines above, the template deploys (an S3 bucket, DynamoDB table and a python 3.7-based Lambda).</em></p>
  
  <p>The hope was that I could then just use:</p>
  
  <pre><code>!FindInMap [StandardResourcesMap,AWSExecuteApi,string]
  </code></pre>
  
  <p>whenever i needed the long-winded value, however the template fails validation with:</p>
  
  <pre><code>An error occurred (ValidationError) when calling the CreateChangeSet operation: Template format error: Every Mappings attribute must be a String or a List.
  </code></pre>
  
  <p>as the title says. </p>
  
  <p>I have tried a number of variations on the <code>Mappings</code> such as using the <code>!Ref</code> variant:</p>
  
  <pre><code>Mappings:
    StandardResourcesMap:
      AWSExecuteApi:
        string: !Join [ ':' , ['arn', !Ref 'AWS::Partition', 'execute-api', !Ref 'AWS::Region', !Ref 'AWS::AccountId'] ]
      AWSLambdaFunctions:
        string: !Join [ ':' , ['arn', !Ref 'AWS::Partition', 'apigateway', !Ref 'AWS::Region', 'lambda:path/2015-03-31/functions/'] ]
  </code></pre>
  
  <p>and I just get pulled up on various validation errors, centring on the one presented above.</p>
  
  <p>any help would be greatly appreciated.</p>