泊坞窗运行时,会发生错误。 “ValueError:无法配置处理程序'了望塔':您必须指定一个区域。”

时间:2017-05-31 08:46:18

标签: django amazon-web-services docker amazon-cloudwatchlogs

首先,我使用服务器环境

  • sever:django + nginx + uwsgi
  • cloud:docker + AWS ECS
  • 日志记录:AWS CloudWatch日志服务+了望塔第三方应用

如果我使用python manage.py runserver在本地运行服务器,则日志会很好地存储在CloudWatch日志中。但是,如果我使用docker和docker run --rm -it -p 8080: 80 image_name命令构建项目,则会发生以下错误。

Traceback (most recent call last):
  File "/usr/lib/python3.5/logging/config.py", line 558, in configure
    handler = self.configure_handler(handlers[name])
  File "/usr/lib/python3.5/logging/config.py", line 731, in configure_handler
    result = factory(**kwargs)
  File "/usr/local/lib/python3.5/dist-packages/watchtower/__init__.py", line 78, in __init__
    self.cwl_client = (boto3_session or boto3).client("logs")
  File "/usr/local/lib/python3.5/dist-packages/boto3/__init__.py", line 83, in client
    return _get_default_session().client(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/boto3/session.py", line 263, in client
    aws_session_token=aws_session_token, config=config)
  File "/usr/local/lib/python3.5/dist-packages/botocore/session.py", line 836, in create_client
    client_config=config, api_version=api_version)
  File "/usr/local/lib/python3.5/dist-packages/botocore/client.py", line 70, in create_client
    verify, credentials, scoped_config, client_config, endpoint_bridge)
  File "/usr/local/lib/python3.5/dist-packages/botocore/client.py", line 224, in _get_client_args
    verify, credentials, scoped_config, client_config, endpoint_bridge)
  File "/usr/local/lib/python3.5/dist-packages/botocore/args.py", line 45, in get_client_args
    endpoint_url, is_secure, scoped_config)
  File "/usr/local/lib/python3.5/dist-packages/botocore/args.py", line 103, in compute_client_args
    service_name, region_name, endpoint_url, is_secure)
  File "/usr/local/lib/python3.5/dist-packages/botocore/client.py", line 297, in resolve
    service_name, region_name)
  File "/usr/local/lib/python3.5/dist-packages/botocore/regions.py", line 122, in construct_endpoint
    partition, service_name, region_name)
  File "/usr/local/lib/python3.5/dist-packages/botocore/regions.py", line 135, in _endpoint_for_partition
    raise NoRegionError()
botocore.exceptions.NoRegionError: You must specify a region.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "django_app/manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.5/dist-packages/django/core/management/__init__.py", line 341, in execute
    django.setup()
  File "/usr/local/lib/python3.5/dist-packages/django/__init__.py", line 22, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/usr/local/lib/python3.5/dist-packages/django/utils/log.py", line 75, in configure_logging
    logging_config_func(logging_settings)
  File "/usr/lib/python3.5/logging/config.py", line 795, in dictConfig
    dictConfigClass(config).configure()
  File "/usr/lib/python3.5/logging/config.py", line 566, in configure
    '%r: %s' % (name, e))
ValueError: Unable to configure handler 'watchtower': You must specify a region.

错误消息指出了区域问题,我不知道如何解决它。 django日志记录设置如下所示。

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'handlers': {
        'watchtower': {
            'level': 'DEBUG',
            'class': 'watchtower.CloudWatchLogHandler',
            'formatter': 'verbose',
        },
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['watchtower', 'console'],
            'level': 'INFO',
            'propagate': True,
        },
        'django.user': {
            'handlers': ['watchtower'],
            'level': DJANGO_LOG_LEVEL,
            'propagate': False,
        },
        'django.partner': {
            'handlers': ['watchtower'],
            'level': DJANGO_LOG_LEVEL,
            'propagate': False,
        }
    }
}

问题出在哪里?

2 个答案:

答案 0 :(得分:1)

您需要在容器内提供aws凭据。您可以使用音量以音标方式安装它们:

docker run -v $HOME/.aws:/root/.aws --rm -it -p 8080: 80 image_name

您的凭据应该在$HOME/.aws本地,然后将它们挂载到运行您的应用程序的用户的主目录中(如果用户是其他用户,则将/ root更改为另一个目录)

答案 1 :(得分:0)

未在容器内配置AWS区域,可能两者都不是凭据。请查看documentationhere

  

CLI为上一节中配置的配置文件生成的文件如下所示:

     

〜/ .aws /凭证

     
    

[默认]     aws_access_key_id = AKIAIOSFODNN7EXAMPLE     aws_secret_access_key = wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY

  
     

〜/ .aws /配置

     
    

[默认]     地区= US-西2     输出= JSON

  
     

支持以下设置。

     
    

aws_access_key_id - AWS访问密钥。

         

aws_secret_access_key - AWS密钥。

         

aws_session_token - AWS会话令牌。只有在使用临时安全凭证时才需要会话令牌。

         

区域 - AWS区域。

         

输出 - 输出格式(json,text或table)