首先,我使用服务器环境
- sever:django nginx uwsgi
- 云:Docker AWS ECS
- 记录:AWS CloudWatch日志服务 Watchtower第三方应用
如果我使用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,
}
}
}
问题在哪里?
您需要在容器内提供AWS凭据。您可以使用音量将它们安装到恐怖:
docker run -v $HOME/.aws:/root/.aws --rm -it -p 8080: 80 image_name
您的凭据应在$HOME/.aws
中本地,然后将它们安装到运行您的应用程序的用户的主目录中(如果用户是其他用户,则将其更改为另一个DIR(
AWS区域未配置在您的容器内,凭据也可能也不是。看看文档或这里。
CLI生成的文件为上一节中配置的配置文件产生的文件如下:
〜/.aws/recertentials
[默认] aws_access_key_id = akiaiosfodnn7 example aws_secret_access_key = wjalrxutnfemi/k7mdeng/bpxrficyexamplekey
〜/.aws/config
[默认] 区域= US-WEST-2 输出= JSON
支持以下设置。
aws_access_key_id - aws访问密钥。
aws_secret_access_key - aws秘密键。
aws_session_token - AWS会话令牌。仅当您使用临时安全凭据时,才需要会话令牌。
区域 - AWS区域。
输出 - 输出格式(JSON,文本或表(