如何在从服务调用程序时提供AWS凭据和配置文件

时间:2018-04-17 07:09:20

标签: python amazon-s3 service aws-sdk boto3

我已经开发了一个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访问值进行硬编码,那么它的工作正常,但我不想采用这种方法。

我在呼叫服务时是否遗漏了任何内容?如何解决此问题?

1 个答案:

答案 0 :(得分:0)

IMO,boto3 api需要将正确的用户环境读取到本地〜/ .aws。如果您没有为用户指定Systemd配置,则该服务只需使用" root"。这就是它失败的原因。

这个额外的设置应该解决了这个问题。

 [Service]
 User=demouser

如果你将你的python程序放在AWS服务中(例如EC2),你可以使用AssumeRoles作为服务,你可以摆脱〜/ .aws