Централизованное ведение журнала с помощью Django, Docker и CloudWatch

Давайте рассмотрим, как настроить контейнеризованное приложение Django, работающее на экземпляре EC2, для отправки журналов в Amazon CloudWatch.

Шаги:

  1. Создать роль IAM
  2. Прикрепить роль IAM к экземпляру EC2
  3. Создайте группу журналов CloudWatch
  4. Установите агент журналов CloudWatch на экземпляр EC2
  5. Настроить ведение журнала Django
  6. Обновить Docker Compose

django docker ec2 cloudwatch

Создать роль IAM

Начните с создания новой роли IAM и прикрепите политику CloudWatchAgentServerPolicy, которую демон Docker будет использовать для записи в CloudWatch.

В консоли IAM выберите "Роли" и нажмите "Создать роль". Выберите службу "EC2" в разделе "Общие варианты использования":

iam create new role

Нажмите кнопку далее.

На странице разрешений найдите политику "CloudWatchAgentServerPolicy" и установите флажок, чтобы прикрепить ее:

iam create new role

Нажмите далее несколько раз. На странице просмотра введите название роли, например, CloudWatchAgentRole, а затем создайте роль.

Присвоить роль IAM

Чтобы назначить роль экземпляру EC2, перейдите на Панель управления EC2 и выберите экземпляр. Нажмите на раскрывающийся список "Действия", выберите "Настройки экземпляра" и нажмите "Прикрепить/заменить роль IAM":

attach iam role

Найдите и выберите роль IAM, которую вы только что создали, и нажмите "Применить".

Вы также можете назначить роль из командной строки следующим образом:

$ aws ec2 associate-iam-instance-profile \
    --instance-id <YOUR_INSTANCE_ID> \
    --iam-instance-profile Name=CloudWatchAgentRole

Создать группу журналов CloudWatch

Теперь, когда у демона Docker есть разрешение на запись в CloudWatch, давайте создадим группу журналов для записи. В консоли CloudWatch создайте новую группу журналов. Добавьте также новый поток журналов в эту недавно созданную группу.

Установите агент ведения журналов CloudWatch

Подключитесь по SSH к экземпляру EC2 и загрузите и установите CloudWatch Logs Agent непосредственно с S3.

Пример:

# download
$ curl https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb

# install
$ sudo dpkg -i -E ./amazon-cloudwatch-agent.deb

Настройка ведения журнала Django

Поскольку контейнеры Docker отправляют логи в выходные потоки stdout и stderr, вам нужно настроить ведение журнала Django так, чтобы он записывал все в stderr с помощью StreamHandler.

Например:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler'
        },
    },
    'loggers': {
        '': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    },
}

Обновить Docker Compose

Наконец, мы можем использовать awslogs от Docker драйвер ведения журнала в отдельных контейнерах.

Например:

version: "3.8"

services:
  api:
    build: ./project
    command: gunicorn core.wsgi:application --bind 0.0.0.0:8000 --log-level=debug
    logging:
      driver: "awslogs"
      options:
        awslogs-region: "us-east-1"
        awslogs-group: "your-log-group"
        awslogs-stream: "your-log-stream"

Не используете compose? Предполагая, что вы уже создали изображение и пометили его тегами, разверните контейнер следующим образом:

$ docker run \
    --log-driver="awslogs" \
    --log-opt awslogs-region="use-east-1" \
    --log-opt awslogs-group="your-log-group" \
    --log-opt awslogs-stream="your-log-group" \
    your-image-tag
Вернуться на верх