当 运行 为 daemon.service 时,Botocore 无法读取凭据
Botocore fails to read credentials when run as daemon.service
我的脚本 运行 从命令行顺利运行,但是,当我将它作为 systemd.service 启动时,出现以下错误:
iot_local.service - My iot_local Service
Loaded: loaded (/lib/systemd/system/iot_local.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2018-04-01 23:06:45 UTC; 5s ago
Process: 2436 ExecStart=/usr/bin/python /home/ubuntu/myTemp/iot_local.py (code=exited, status=1/FAILURE)
Main PID: 2436 (code=exited, status=1/FAILURE)
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 358, in resolve
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: service_name, region_name)
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: File "/usr/local/lib/python2.7/dist-packages/botocore/regions.py", line 122, in construct_endpoint
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: partition, service_name, region_name)
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: File "/usr/local/lib/python2.7/dist-packages/botocore/regions.py", line 135, in _endpoint_for_partition
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: raise NoRegionError()
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: botocore.exceptions.NoRegionError: You must specify a region.
Apr 01 23:06:45 ip-172-31-29-45 systemd[1]: iot_local.service: Main process exited, code=exited, status=1/FAILURE
Apr 01 23:06:45 ip-172-31-29-45 systemd[1]: iot_local.service: Unit entered failed state.
Apr 01 23:06:45 ip-172-31-29-45 systemd[1]: iot_local.service: Failed with result 'exit-code'.
这一行似乎失败了:
DB=boto3.resourse('dynamodb')
如果我将区域添加为参数,脚本稍后仍会失败,因为找不到凭据。因此,当我提供区域、ID 和密钥作为参数时,一切正常:
boto3.resource('dynamodb', region_name='us-west-2', aws_access_key_id=ACCESS_ID, aws_secret_access_key=ACCESS_KEY)
明显的问题是,当此脚本作为服务 运行 时,它无法从 ~/.aws/config
和 ~/.aws/credentials
获取信息,我确保其中包含所有运行ning aws configure
所提到的必要信息 here.
[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY
我也试过这个:
export AWS_CONFIG_FILE="/home/ubuntu/.aws/config"
还有这个
sudo chown root:root ~/.aws
但这并没有帮助。知道为什么 .service 没有 "see" 凭据文件吗?
当 systemd 运行 将您的脚本作为服务提供时,ubuntu 用户不再 运行 脚本,因此主目录不再是 /home/ubuntu .这意味着 ~/.aws/credentials 不再引用 /home/ubuntu/.aws/credentials 并且您的脚本因此试图从错误的位置加载凭据(可能是 /root/.aws/credentials).
您可以将 systemd 配置为 run your script as a specific user。在 [Service]
部分添加 User=ubuntu
。
答案要简单得多 - 环境变量未加载,在您的情况下是 aws 凭据。
创建文件sudo vi /lib/systemd/system/iot_local.service
使用以下给定的内容。
[Unit]
Description=Spideren MQ RPC service
[Service]
WorkingDirectory=/opt/cocoon_predev/
Environment="AWS_DEFAULT_REGION=us-xxxx"
Environment="AWS_ACCESS_KEY_ID=xxxxxxxxx"
Environment="AWS_SECRET_ACCESS_KEY=xxxxxxxxxx"
Environment="LANG=en_US.UTF-8"
Environment="PYTHONIOENCODING=utf-8"
ExecStart=/usr/bin/python2 /home/myproject/iotservice.py
User=myusername
Restart=on-failure
RestartSec=90s
最后 运行 下面的命令激活服务。
sudo systemctl daemon-reload
sudo systemctl start iot_local.service
sudo systemctl status iot_local.service
检查守护程序启动中的错误 - 运行 以下命令
journalctl -u spiderenrpc.service
我已在 Ubuntu 上完成此操作 - 因此请检查您的 os.
特定的系统格式
当 Fluent Bit AWS Firehose 插件 运行 作为系统服务时,我遇到了类似的问题,无法读取 AWS 凭证。
从命令行手动调用 Fluent Bit 时,已加载凭据。
凭据确实存储在用户 root
下,服务 运行 默认情况下以 root 身份运行。
为了解决这个问题,我必须在 systemd 单元中明确指定用户为 root
:
[Service]
User=root
和运行systemctl daemon-reload
我的脚本 运行 从命令行顺利运行,但是,当我将它作为 systemd.service 启动时,出现以下错误:
iot_local.service - My iot_local Service
Loaded: loaded (/lib/systemd/system/iot_local.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2018-04-01 23:06:45 UTC; 5s ago
Process: 2436 ExecStart=/usr/bin/python /home/ubuntu/myTemp/iot_local.py (code=exited, status=1/FAILURE)
Main PID: 2436 (code=exited, status=1/FAILURE)
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: File "/usr/local/lib/python2.7/dist-packages/botocore/client.py", line 358, in resolve
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: service_name, region_name)
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: File "/usr/local/lib/python2.7/dist-packages/botocore/regions.py", line 122, in construct_endpoint
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: partition, service_name, region_name)
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: File "/usr/local/lib/python2.7/dist-packages/botocore/regions.py", line 135, in _endpoint_for_partition
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: raise NoRegionError()
Apr 01 23:06:45 ip-172-31-29-45 python[2436]: botocore.exceptions.NoRegionError: You must specify a region.
Apr 01 23:06:45 ip-172-31-29-45 systemd[1]: iot_local.service: Main process exited, code=exited, status=1/FAILURE
Apr 01 23:06:45 ip-172-31-29-45 systemd[1]: iot_local.service: Unit entered failed state.
Apr 01 23:06:45 ip-172-31-29-45 systemd[1]: iot_local.service: Failed with result 'exit-code'.
这一行似乎失败了:
DB=boto3.resourse('dynamodb')
如果我将区域添加为参数,脚本稍后仍会失败,因为找不到凭据。因此,当我提供区域、ID 和密钥作为参数时,一切正常:
boto3.resource('dynamodb', region_name='us-west-2', aws_access_key_id=ACCESS_ID, aws_secret_access_key=ACCESS_KEY)
明显的问题是,当此脚本作为服务 运行 时,它无法从 ~/.aws/config
和 ~/.aws/credentials
获取信息,我确保其中包含所有运行ning aws configure
所提到的必要信息 here.
[default]
aws_access_key_id=XXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYY
我也试过这个:
export AWS_CONFIG_FILE="/home/ubuntu/.aws/config"
还有这个
sudo chown root:root ~/.aws
但这并没有帮助。知道为什么 .service 没有 "see" 凭据文件吗?
当 systemd 运行 将您的脚本作为服务提供时,ubuntu 用户不再 运行 脚本,因此主目录不再是 /home/ubuntu .这意味着 ~/.aws/credentials 不再引用 /home/ubuntu/.aws/credentials 并且您的脚本因此试图从错误的位置加载凭据(可能是 /root/.aws/credentials).
您可以将 systemd 配置为 run your script as a specific user。在 [Service]
部分添加 User=ubuntu
。
答案要简单得多 - 环境变量未加载,在您的情况下是 aws 凭据。
创建文件sudo vi /lib/systemd/system/iot_local.service
使用以下给定的内容。
[Unit]
Description=Spideren MQ RPC service
[Service]
WorkingDirectory=/opt/cocoon_predev/
Environment="AWS_DEFAULT_REGION=us-xxxx"
Environment="AWS_ACCESS_KEY_ID=xxxxxxxxx"
Environment="AWS_SECRET_ACCESS_KEY=xxxxxxxxxx"
Environment="LANG=en_US.UTF-8"
Environment="PYTHONIOENCODING=utf-8"
ExecStart=/usr/bin/python2 /home/myproject/iotservice.py
User=myusername
Restart=on-failure
RestartSec=90s
最后 运行 下面的命令激活服务。
sudo systemctl daemon-reload
sudo systemctl start iot_local.service
sudo systemctl status iot_local.service
检查守护程序启动中的错误 - 运行 以下命令
journalctl -u spiderenrpc.service
我已在 Ubuntu 上完成此操作 - 因此请检查您的 os.
特定的系统格式当 Fluent Bit AWS Firehose 插件 运行 作为系统服务时,我遇到了类似的问题,无法读取 AWS 凭证。
从命令行手动调用 Fluent Bit 时,已加载凭据。
凭据确实存储在用户 root
下,服务 运行 默认情况下以 root 身份运行。
为了解决这个问题,我必须在 systemd 单元中明确指定用户为 root
:
[Service]
User=root
和运行systemctl daemon-reload