### Apache Airflow version

2.1.3 (latest released)

### Operating System

Linux

### Versions of Apache Airflow Providers

apache-airflow-providers-amazon==1.4.0
apache-airflow-providers-docker==1.2.0
apache-airflow-providers-ftp==1.1.0
apache-airflow-providers-http==1.1.1
apache-airflow-providers-imap==1.0.1
apache-airflow-providers-postgres==2.0.0
apache-airflow-providers-sqlite==1.0.2

### Deployment

Other

### Deployment details

_No response_

### What happened

[2021-09-08 00:30:00,035] {taskinstance.py:1462} ERROR - Task failed with exception
Traceback (most recent call last):
  File "/home/airflow/.local/lib/python3.8/site-packages/airflow/models/taskinstance.py", line 1164, in _run_raw_task
    self._prepare_and_execute_task_with_callbacks(context, task)
  File "/home/airflow/.local/lib/python3.8/site-packages/airflow/models/taskinstance.py", line 1282, in _prepare_and_execute_task_with_callbacks
    result = self._execute_task(context, task_copy)
  File "/home/airflow/.local/lib/python3.8/site-packages/airflow/models/taskinstance.py", line 1312, in _execute_task
    result = task_copy.execute(context=context)
  File "/home/airflow/.local/lib/python3.8/site-packages/airflow/utils/session.py", line 70, in wrapper
    return func(*args, session=session, **kwargs)
  File "/home/airflow/.local/lib/python3.8/site-packages/airflow/providers/amazon/aws/operators/ecs.py", line 230, in execute
    self._check_success_task()
  File "/home/airflow/.local/lib/python3.8/site-packages/airflow/providers/amazon/aws/operators/ecs.py", line 380, in _check_success_task
    if container.get('lastStatus') == 'STOPPED' and container['exitCode'] != 0:
KeyError: 'exitCode'

### What you expected to happen

I Expect to see the error reason reported by the ECS operator not the KeyError when the code tries to access the exit code from the container.

Maybe something like:
` if container.get('lastStatus') == 'STOPPED' and container.get('exitCode', 1) != 0:`
to avoid the exception and some error handling that would make is easier to find the reason the container failed.
currently we have to search through the big huge info log with the Failed INFO. 

### How to reproduce

Run ECS Task with bad creds to pull docker image from gitlab repo

### Anything else

_No response_

### Are you willing to submit PR?

- [X] Yes I am willing to submit a PR!

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)

airflow/providers/amazon/aws/operators/ecs.py
Only required if you want logs to be shown in the Airflow UI after your job has
        finished.
    :type awslogs_stream_prefix: str
    :param awslogs_fetch_interval: the interval that the ECS task log fetcher should wait
        in between each Cloudwatch logs fetches.
    :type awslogs_fetch_interval: timedelta
    :param quota_retry: Config if and how to retry the launch of a new ECS task, to handle
        transient errors.
    :type quota_retry: dict
    :param reattach: If set to True, will check if the task previously launched by the task_instance
        is already running. If so, the operator will attach to it instead of starting a new task.
        This is to avoid relaunching a new task when the connection drops between Airflow and ECS while
        the task is running (when the Airflow worker is restarted for example).
    :type reattach: bool
    :param number_logs_exception: Number of lines from the last Cloudwatch logs to return in the
        AirflowException if an ECS task is stopped (to receive Airflow alerts with the logs of what
        failed in the code running in ECS).
    :type number_logs_exception: int
    """
    ui_color = '#f0ede4'
    template_fields = ('overrides',)
    template_fields_renderers = {
        "overrides": "json",
        "network_configuration": "json",
        "tags": "json",
        "quota_retry": "json",
    }
    REATTACH_XCOM_KEY = "ecs_task_arn"
    REATTACH_XCOM_TASK_ID_TEMPLATE = "{task_id}_task_arn"
    def __init__(