'Requests a description of a set of instances.
You must specify at least one of the parameters.
**Required Permissions**: To use this action, an IAM user must
have a Show, Deploy, or Manage permissions level for the
stack, or an attached policy that explicitly grants
permissions. For more information on user permissions, see
`Managing User Permissions`_.
:type stack_id: string
:param stack_id: A stack ID. If you use this parameter,
`DescribeInstances` returns descriptions of the instances
associated with the specified stack.
:type layer_id: string
:param layer_id: A layer ID. If you use this parameter,
`DescribeInstances` returns descriptions of the instances
associated with the specified layer.
:type instance_ids: list
:param instance_ids: An array of instance IDs to be described. If you
use this parameter, `DescribeInstances` returns a description of
the specified instances. Otherwise, it returns a description of
every instance.'

def describe_instances(self, stack_id=None, layer_id=None, instance_ids=None):

    params = {}
    if (stack_id is not None):
        params['StackId'] = stack_id
    if (layer_id is not None):
        params['LayerId'] = layer_id
    if (instance_ids is not None):
        params['InstanceIds'] = instance_ids
    return self.make_request(action='DescribeInstances', body=json.dumps(params))
