title: CloudFormation Template is invalid: Template format error: Every Outputs member must contain a Value object
body: <p>I have an AWS IoT Chat Application whose UI is on React and to do the AWS configuration I have a setup which is executed using "serverless deploy" command. When executed, a serverless.yml gets executed, and it breaks at a point where it throws an error as 
  <strong>CloudFormation Template is invalid: Template format error: Every Outputs member must contain a Value object</strong></p>
  
  <p>the serverless.yml code is given below:</p>
  
  <pre><code>resources:
    Resources:
      UserTable:
        Type: "AWS::DynamoDB::Table"
        Properties:
          TableName: "IotChatUsers"
          AttributeDefinitions:
            - AttributeName: identityId
              AttributeType: S
          KeySchema:
            - AttributeName: identityId
              KeyType: HASH
          ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5
  
      ChatTable:
        Type: "AWS::DynamoDB::Table"
        Properties:
          TableName: "IotChatChats"
          AttributeDefinitions:
            - AttributeName: name
              AttributeType: S
          KeySchema:
            - AttributeName: name
              KeyType: HASH
          ProvisionedThroughput:
            ReadCapacityUnits: 5
            WriteCapacityUnits: 5
  
      ConnectPolicy:
        Type: "AWS::IoT::Policy"
        Properties:
          PolicyName: IotChatConnectPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
            - Effect: "Allow"
              Action:
                - "iot:Connect"
              Resource:
                - "*"
  
      PublicSubscribePolicy:
        Type: "AWS::IoT::Policy"
        Properties:
          PolicyName: IotChatPublicSubscribePolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
            - Effect: "Allow"
              Action:
                - "iot:Subscribe"
              Resource: { "Fn::Join" : ["",["arn:aws:iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topicfilter/room/public/*"]] }
  
      PublicReceivePolicy:
        Type: "AWS::IoT::Policy"
        Properties:
          PolicyName: IotChatPublicReceivePolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
            - Effect: "Allow"
              Action:
                - "iot:Receive"
              Resource: { "Fn::Join" : ["",["arn:aws:iot:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":topic/room/public/*"]] }
  
      UserPool:
        Type: "AWS::Cognito::UserPool"
        Properties:
          UserPoolName: iot_chat_api_user_pool
          AutoVerifiedAttributes:
            - email
          MfaConfiguration: OFF
          Schema:
            - AttributeDataType: String
              Name: email
              Required: true
  
      ReactAppClient:
        Type: AWS::Cognito::UserPoolClient
        Properties:
          GenerateSecret: false
          RefreshTokenValidity: 200
          UserPoolId:
            Ref: UserPool
  
      IdentityPool:
        Type: "AWS::Cognito::IdentityPool"
        Properties:
          IdentityPoolName: iot_chat_api_identity_pool
          AllowUnauthenticatedIdentities: false
          CognitoIdentityProviders:
            - ClientId:
                Ref: ReactAppClient
              ProviderName:
                Fn::GetAtt: UserPool.ProviderName
          SupportedLoginProviders:
            graph.facebook.com: ${self:custom.variables.facebook_app_id}
            accounts.google.com: ${self:custom.variables.google_app_id}
  
      IdentityPoolAuthRole:
        Type: "AWS::IAM::Role"
        Properties:
          AssumeRolePolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: "Allow"
                Principal:
                  Federated:
                    - "cognito-identity.amazonaws.com"
                Action:
                  - "sts:AssumeRoleWithWebIdentity"
                Condition:
                  StringEquals:
                    cognito-identity.amazonaws.com:aud:
                      Ref: IdentityPool
                  ForAnyValue:StringLike:
                    cognito-identity.amazonaws.com:amr: authenticated
          ManagedPolicyArns:
            - arn:aws:iam::aws:policy/AWSIoTDataAccess
          Path: "/"
          Policies:
            - PolicyName: iot-chat-invoke-api-gateway
              PolicyDocument:
                Version: '2012-10-17'
                Statement:
                  - Effect: Allow
                    Action:
                      - execute-api:Invoke
                    Resource: { "Fn::Join" : ["", ["arn:aws:execute-api:",{"Ref":"AWS::Region"},":",{"Ref":"AWS::AccountId"},":",{"Ref":"ApiGatewayRestApi"},"/*"]] }
  
      IdentityPoolRoleAttachment:
        Type: AWS::Cognito::IdentityPoolRoleAttachment
        Properties:
          IdentityPoolId:
            Ref: IdentityPool
          Roles:
            authenticated:
              Fn::GetAtt:
                - IdentityPoolAuthRole
                - Arn
  
      ConfirmUserInvocationPermission:
        Type: AWS::Lambda::Permission
        Properties:
          Action: lambda:InvokeFunction
          FunctionName:
            Fn::GetAtt: AutoConfirmUserLambdaFunction.Arn
          Principal: cognito-idp.amazonaws.com
          SourceArn:
            Fn::GetAtt: UserPool.Arn
  
    Outputs:
      UserPoolId:
        Description: "The ID of the user pool that is created."
        Value:
          Ref: UserPool
  
      ReactAppClientId:
        Description: "The ID of the user pool react app client id."
        Value:
          Ref: ReactAppClient
  
      IdentityPoolId:
        Description: "The ID of the identity pool that is created."
        Value:
          Ref: IdentityPool
  
      AutoConfirmUserFnArn:
        Description: "The ARN of the Auto Confirm User Lambda function"
        Value:
          Fn::GetAtt:
            - AutoConfirmUserLambdaFunction
            - Arn
  
      FacebookAppId:
        Description: "Facebook App Id"
        Value: ${self:custom.variables.facebook_app_id}
  
      GoogleAppId:
        Description: "Google App Id"
        Value: ${self:custom.variables.google_app_id}
  </code></pre>
  
  <p>I need some insight to figure out what is wrong with the serverless.yml which throws me this validation error.</p>
  
  <pre><code>Environment Information -----------------------------
       OS:                     win32
       Node Version:           8.9.1
       Serverless Version:     1.25.0
  </code></pre>
  
  <p><strong>UPDATE:</strong></p>
  
  <p>On parsing the YAML below is the result of Outputs node:</p>
  
  <pre><code>"Outputs": {
        "IdentityPoolId": {
          "Description": "The ID of the identity pool that is created.", 
          "Value": {
            "Ref": "IdentityPool"
          }
        }, 
        "FacebookAppId": {
          "Description": "Facebook App Id", 
          "Value": "${self:custom.variables.facebook_app_id}"
        }, 
        "ReactAppClientId": {
          "Description": "The ID of the user pool react app client id.", 
          "Value": {
            "Ref": "ReactAppClient"
          }
        }, 
        "GoogleAppId": {
          "Description": "Google App Id", 
          "Value": "${self:custom.variables.google_app_id}"
        }, 
        "UserPoolId": {
          "Description": "The ID of the user pool that is created.", 
          "Value": {
            "Ref": "UserPool"
          }
        }, 
        "AutoConfirmUserFnArn": {
          "Description": "The ARN of the Auto Confirm User Lambda function", 
          "Value": {
            "Fn::GetAtt": [
              "AutoConfirmUserLambdaFunction", 
              "Arn"
            ]
          }
        }
      }
  </code></pre>
  
  <p><strong>Update 2:</strong></p>
  
  <p>This is where the complete application comes from: <a href="https://github.com/awslabs/aws-iot-chat-example" rel="nofollow noreferrer">aws-iot-chat-example</a></p>