适用于 PHP 的 AWS 开发工具包:从实例配置文件元数据服务器检索凭证时出错


AWS SDK for PHP: Error retrieving credentials from the instance profile metadata server

我正在尝试通过Web api向Android发送SNS消息。从 http://aws.amazon.com/developers/getting-started/php/下载并安装了开发工具包

运行 sample.php 时出现以下错误:

Fatal error: Uncaught exception 'Aws'Common'Exception'InstanceProfileCredentialsException' with message 'Error retrieving credentials from the instance profile metadata server. When you are not running inside of Amazon EC2, you must provide your AWS access key ID and secret access key in the "key" and "secret" options when creating a client or provide an instantiated Aws'Common'Credentials'CredentialsInterface object. ([curl] 28: Connection timed out after 5016 milliseconds [url] http://169.254.169.254/latest/meta-data/iam/security-credentials/)' in C:'xampp'htdocs'aws-php'vendor'aws'aws-sdk-php'src'Aws'Common'InstanceMetadata'InstanceMetadataClient.php:85 Stack trace: #0 C:'xampp'htdocs'aws-php'vendor'aws'aws-sdk-php'src'Aws'Common'Credentials'RefreshableInstanceProfileCredentials.php(52): Aws'Common'InstanceMetadata'InstanceMetadataClient->getInstanceProfileCredentials() #1 C:'xampp'htdocs'aws-php'vendor'aws'aws-sdk-php'src'Aws'Common'Credentials'AbstractRefreshableCredentials.php(54): Aws'Common'Credentials'Refreshable in C:'xampp'htdocs'aws-php'vendor'aws'aws-sdk-php'src'Aws'Common'InstanceMetadata'InstanceMetadataClient.php on line 85

关于这个主题的一些指导将对我有很大帮助

就我而言,我正在使用

return DynamoDbClient::factory(array(
  'version' => 'latest',
  'region'  => AWS_REGION,
  'key' => AWS_KEY,
  'secret'  => AWS_SECRET
));

这曾经适用于aws/aws-sdk-php 2.8.5 版,但是当 composer 自动安装 3.2.0 版时,我得到了上面的错误。问题很简单,我应该改变我打电话的方式

return DynamoDbClient::factory(array(
  'version' => 'latest',
  'region'  => AWS_REGION,
  'credentials' => array(
    'key' => AWS_KEY,
    'secret'  => AWS_SECRET,
  )
));

如此处所述。在不更改调用的情况下,apache php 回退到使用 HOME 环境变量(该变量为空)查找~/.aws/credentials文件。您可以通过运行 php -r 'var_dump(getenv("HOME"));' 来检查其值。

这是一个相关的帖子

就我而言,我不得不使用硬编码凭据

$s3Client = new S3Client([
    'region' => REGION,
    'version' => '2006-03-01',
    'credentials' => [
        'key'    => S3_KEY,
        'secret' => S3_SECRETE,
    ],
]);

在此处查看更多详细信息:

您必须

将包含配置的.aws/credentials文件放在 Web 服务的主目录中*通常/var/www ),而不是登录用户的主目录中。

您可以通过在服务器上的 php 文件中运行 echo getenv('HOME'); 来查找 Web 服务正在使用的主目录。

我试图使用凭据文件并遇到了同样的错误,github 上的这家伙几乎钉住了它:

凭据文件应采用 ini 格式,但没有.ini扩展名。它应该有一个"默认"部分,用你的密钥和密钥定义:

$ less ~/.aws/credentials
[default]
aws_access_key_id = key
aws_secret_access_key = secret

如果您指定了其他部分名称而不是默认值,只需向 S3Client 参数添加profile键:

[example]
aws_access_key_id = key
aws_secret_access_key = secret
$s3Client = new 'Aws'S3'S3Client([
    'version' => '2006-03-01',
    'region' => $yourPreferredRegion,
    'profile' => 'example',
]);

建议使用凭证文件或环境变量在您自己的服务器上提供凭证

而@Anti的回答也帮了我很大!

如果您更喜欢硬编码方式,请按照@shadi的答案进行操作。

如果是 laravel 和 aws/aws-sdk-php-laravel sdk,那么在配置所有步骤并在 .env 文件中定义密钥之后您必须删除配置缓存并通过以下命令重建它。

php artisan config:cache;
composer dump-autoload;

假设服务器位于 AWS EC2 上(ECS 和弹性 beanstalk 可能相同),处理此问题的"正确"方法是根本不存储凭证。

相反,请执行此操作:

  1. 创建 IAM 角色 (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html)
  2. 向角色策略添加相关权限(在这种情况下,发送 SNS 消息)
  3. 将角色分配给 EC2 实例(实例设置 =>附加/替换 IAM 角色)

这样,您就不会在代码中留下任何敏感数据。

以下是步骤:

  1. 类型 cd ~这样,您将进入主目录。
  2. mkdir .aws
  3. sudo vi .aws/credentials
  4. 编写以下行并保存文件。

    [default]
    aws_access_key_id = Your AWS Access Key
    aws_secret_access_key = Your AWS Secret Access Key
    

这可能是因为配置文件尚未发布。

请务必发布配置文件:

php artisan vendor:publish  --provider="Aws'Laravel'AwsServiceProvider"

要测试这是问题所在,只需清除配置即可。

php artisan config:clear

如果它在清除缓存的情况下工作,那么这将是问题所在。

就我而言(laravel 8,在几次版本升级之后),我不得不更改 composer.json 的"脚本"部分。然后在"帆作曲家安装"之后,我的 AWS 代码再次工作。

"scripts": {
    "post-autoload-dump": [
        "Illuminate''Foundation''ComposerScripts::postAutoloadDump",
        "@php artisan package:discover --ansi"
    ],
    "post-update-cmd": [
        "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
    ],
    "post-root-package-install": [
        "@php -r '"file_exists('.env') || copy('.env.example', '.env');'""
    ],
    "post-create-project-cmd": [
        "@php artisan key:generate --ansi"
    ]
},

来源:https://github.com/laravel/laravel/blob/8.x/composer.json

您可以尝试以下行:

$credentials = 新的 aws''Credentials''Credentials('key' , 'secret-key');

$s 3 = new S3Client(['版本' => '最新','区域' => 'ap-south-1','credentials'=>$credentials]);