代码之家  ›  专栏  ›  技术社区  ›  Nazar

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

  •  1
  • Nazar  · 技术社区  · 6 年前

    然而,当我将脚本作为systemd启动时,我的脚本可以从命令行顺利运行。服务,我收到以下错误:

    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 如上所述 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
    

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

    3 回复  |  直到 6 年前
        1
  •  1
  •   Magnus Melwin    6 年前

    答案要简单得多——环境变量没有被加载,在您的例子中是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上完成了这项工作,所以请检查特定于操作系统的systemd格式。

        2
  •  0
  •   jarmod    6 年前

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

    您可以将systemd配置为 run your script as a specific user 。添加 User=ubuntu [Service] 部分

        3
  •  0
  •   Seff    4 年前

    我有一个与Fluent Bit AWS Firehose插件类似的问题,当它作为systemd服务运行时,无法读取AWS凭据。

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

    凭据确实存储在用户 root ,默认情况下,服务以root身份运行。

    为了解决这个问题,我必须显式地将用户指定为 在systemd单元中:

    [Service]
    User=root
    

    并运行 systemctl daemon-reload