从php执行AWS CLI命令导致无法找到凭据

时间:2014-02-21 22:19:20

标签: php amazon-web-services amazon-s3 aws-cli

我正在尝试使用shell exec从php代码中运行aws s3 cp命令。以下是php代码。

echo shell_exec("sudo aws s3 cp s3://<bucket>/somefolder/somefile s3://<bucket>/someotherfolder/somefile --region ap-southeast-1 --acl public-read");

文件未被复制,echo的输出如下

“无法找到凭据已完成1个部分,其中包含...文件”

注1:我已使用aws configure命令设置凭据

注2:如果我直接从终端运行完全相同的命令,它可以正常工作。

有什么想法吗?

6 个答案:

答案 0 :(得分:2)

AWS CLI在〜/ .aws / config设置凭据,aws php sdk在〜/ .aws / credentials中查找它们。

所以:

cd ~/.aws
mv config credentials

解决了我认为对我来说同样的问题。

答案 1 :(得分:2)

这对我有用:

<?php

    putenv('AWS_DEFAULT_REGION=your-region');
    putenv('AWS_ACCESS_KEY_ID=YOURACCESSKEYID');
    putenv('AWS_SECRET_ACCESS_KEY=YOURSECRETACCESSKEY');

    $output = shell_exec('aws s3 cp ./file.txt s3://MYBUCKETID/ 2>&1');
    echo "<pre>$output</pre>";

?>

答案 2 :(得分:1)

然后,您可以在终端上运行:

$ cat ~/.aws/config
[profile eb-cli]
aws_access_key_id = XXXXXX
aws_secret_access_key = XXXXXX

$ aws configure

然后会要求您输入4个值:

  
      
  1. 访问密钥ID(访问密钥) - 这是两个值中较短的一个。
  2.   
  3. 秘密访问密钥
  4.   
  5. 默认区域名称(输入'us-east-1')
  6.   
  7. 输出格式(输入'json')
  8.   

然后

$ aws s3 sync s3://<bucketname>

答案 3 :(得分:0)

看起来像配置文件的权限/位置问题。

使用AWS CLI设置的凭据是在当前用户的路径中的特殊文件中编写的。 PHP我想是在执行其他权限(而不是同一个用户)。我建议您将配置保存在单独的文件中并传递给CLI this way。您还需要确保PHP shell_exec中的特定环境变量可用。

答案 4 :(得分:0)

扩展user1464317:

我发现Yosemite vs Mavericks存在这个问题。适用于Mavericks的AWS CLI在&#34;〜/ .aws / config&#34;中查找权限,其中Yosemite查找&#34;〜/ .aws / credentials&#34;。

如果使用cron,可以在crontab -e中设置环境变量,如下所示:

# Mavericks
AWS_CONFIG_FILE="/Users/YOUR_USER/.aws/config"

# Yosemite
AWS_CONFIG_FILE="/Users/YOUR_USER/.aws/credentials"

或者您执行user1464317暗示,将文件移到:

mv config credentials

答案 5 :(得分:0)

为了解决该问题,请执行以下步骤:

  1. 将.aws目录从/home/non-rootUser/.aws复制到/ var / www
  2. 现在将目录更改为/ var / www(cd / var / www)
  3. 更改权限: / www $ sudo chmod -R 755 .aws
  4. 更改所有权 / www $ sudo chown -R $ USER:$ USER .aws
  5. 重新检查