当docker运行时,会发生错误。 “ValueError:无法configuration处理程序”守望台“:您必须指定一个区域。”

首先,我使用服务器环境

  • sever:django + nginx + uwsgi
  • 云:docker+ AWS ECS
  • 日志logging:AWS CloudWatch日志服务+了望塔第三方应用程序

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

 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设置如下所示。

 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, } } } 

哪里有问题?

您需要在您的容器内提供aws凭据。 你可以用一个音量来安装它们:

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

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

AWS区域未在您的容器中configuration,可能也不是证书。 看看文档或这里 。

上一节中configuration的configuration文件由CLI生成的文件如下所示:

〜/ .aws /凭证

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

〜/ .aws /configuration

[default] region = us-west-2 output = json

支持以下设置。

aws_access_key_id – AWS访问密钥。

aws_secret_access_key – AWS密钥。

aws_session_token – AWS会话令牌。 会话令牌只有在使用临时安全证书时才是必需的。

区域 – AWS地区。

输出 – 输出格式(json,文本或表格)