我已经开发了一个python程序来将文件上传到S3,因为我已经使用' aws config
'来配置IAM访问值。命令(使用其中的值创建~/.aws
文件夹和config
以及credentials
。当我在终端上运行程序时,文件成功上传到s3。
以下是代码片段:
s3client=boto3.client('s3')
s3client.upload_file(FILE_PATH, BUCKET_NAME,FILE_PATH)
现在我尝试从Linux服务运行此程序,为此我在s3upload.service
文件夹中创建了名为/lib/systemd/system/
的新服务。
[Unit]
Description=Demo S3 upload program
After=multi-user.target
[Service]
Type=simple
WorkingDirectory=/home/demouser/
ExecStart=/usr/bin/python /home/demouser/s3upload.py
Restart=on-abort
[Install]
WantedBy=multi-user.target
令人惊讶的是,这不起作用!即使我提到服务的工作目录是/home/demouser/
,它也无法识别~/.aws
文件夹内容?
我得到了以下错误:
NoCredentialsError: Unable to locate credentials
抬头:如果我在程序中对IAM访问值进行硬编码,那么它的工作正常,但我不想采用这种方法。
我在呼叫服务时是否遗漏了任何内容?如何解决此问题?
答案 0 :(得分:0)
IMO,boto3 api需要将正确的用户环境读取到本地〜/ .aws。如果您没有为用户指定Systemd配置,则该服务只需使用" root"。这就是它失败的原因。
这个额外的设置应该解决了这个问题。
[Service]
User=demouser
如果你将你的python程序放在AWS服务中(例如EC2),你可以使用AssumeRoles作为服务,你可以摆脱〜/ .aws