Python 作为守护进程运行时,Botocore无法读取凭据。服务

Python 作为守护进程运行时,Botocore无法读取凭据。服务,python,amazon-web-services,boto3,credentials,botocore,Python,Amazon Web Services,Boto3,Credentials,Botocore,我的脚本在命令行中运行平稳,但是,当我将其作为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

我的脚本在命令行中运行平稳,但是,当我将其作为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')
如果将区域添加为参数,脚本稍后仍会失败,因为找不到凭据。因此,当我提供region、id和key作为参数时,一切正常:

boto3.resource('dynamodb', region_name='us-west-2', aws_access_key_id=ACCESS_ID, aws_secret_access_key=ACCESS_KEY)
明显的问题是,当此脚本作为服务运行时,它无法从
~/.aws/config
~/.aws/credentials
获取信息,我通过运行
aws configure
确保包含所有必要的信息

我也试过:

export AWS_CONFIG_FILE="/home/ubuntu/.aws/config"
还有这个

sudo chown root:root ~/.aws

但这没有帮助。知道为什么.service没有“看到”凭据文件吗?

当systemd将脚本作为服务运行时,ubuntu用户不再运行脚本,因此主目录不再是/home/ubuntu。这意味着~/.aws/credentials不再引用/home/ubuntu/.aws/credentials,因此您的脚本试图从错误的位置加载凭据(可能是/root/.aws/credentials)


您可以将systemd配置为。在
[Service]
部分添加
User=ubuntu

答案要简单得多-环境变量没有加载,在您的例子中是aws凭据

使用以下给定内容创建一个文件
sudo vi/lib/systemd/system/iot\u 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上完成了这项工作,所以请检查您的操作系统特有的systemd格式。

我在Fluent Bit AWS Firehose插件作为systemd服务运行时,也遇到了类似的问题,即无法读取AWS凭据

从命令行手动调用Fluent位时,会加载凭据

凭据确实存储在用户
根目录下
,默认情况下,服务以根目录运行

为了解决这个问题,我必须在systemd单元中明确指定用户为
root

[Service]
User=root

并运行
systemctl daemon reload

将其作为服务运行时,您是否已明确将其设置为作为ubuntu用户运行?否则“home”目录不再是/home/ubuntu,因此~/.aws/credentials将无法从正确的位置加载。@jarmod我应该设置什么?您可以研究systemd文档。这里有一个例子:另外,你应该恢复你的chown命令-你不希望ubuntu用户的~/.aws文件夹归root:root所有。@jarmod Nice,我在
[Service]
中设置了
user=ubuntu
,这个东西现在就可以工作了。你应该把它作为答案贴出来。
[Service]
User=root