使用PHP SDK的IAM角色问题

Nic*_*lou 5 php amazon-ec2 amazon-web-services

我正在使用此脚本填充DynamoDB:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LoadDataPHP.html

我使用AWS SDK收到此错误:

PHP致命错误:未捕获异常'Aws\Exception\CredentialsException',并在/ var/www/vendor/aws/aws-sdk-php/src/Credentials/CredentialProvider中显示消息'无法从/root/.aws/credentials读取凭据'. PHP:263

根据https://docs.aws.amazon.com/aws-sdk-php/v2/guide/credentials.html

如果您未明确向客户端对象提供凭据且没有可用的环境变量凭据,则SDK会尝试从Amazon EC2实例元数据服务器检索实例配置文件凭据.只有在已配置了IAM角色的Amazon EC2实例上运行时,这些凭据才可用.

我有一个IAM角色附加到我的实例,具有全功率用户访问权限.我已经确认该角色通过AWS CLI正常工作,该CLI可以在没有任何凭据配置的情况下访问DynamoDB.

关于我可能做错什么的任何建议?我的印象(并解释说明凭证文件)我不需要配置任何凭据,因此使用IAM角色.

Nic*_*lou 7

代码中的这一行:

 'profile' => 'default',
Run Code Online (Sandbox Code Playgroud)

是什么导致了我的问题。如果您使用的是 IAM 角色,则不需要配置文件行,将其删除将修复“无法读取凭据”错误。


小智 7

我只是想为其他任何可能在这种情况下结束的人扩展一点.

如果您在EC2实例上使用IAM角色作为凭据方法


然后在创建客户端时不要使用配置文件行.如果您在客户端中指定了配置文件,它会告诉SDK使用凭据ini文件中的配置文件覆盖您在客户端中设置的任何形式的凭据.

在PHP SDK V3文档中提到(但埋没了一点):https: //docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/configuration.html#profile

示例代码

$client = new SqsClient([
    'profile' => 'default', // <--- Don't use this line if you're using IAM Roles for credentials
    'region' => 'us-west-2',
    'version' => '2012-11-05'
]);
Run Code Online (Sandbox Code Playgroud)

误导性文件


PHP SDK文档建议在EC2实例的所有其他凭据之上使用IAM角色.这很好,完全有道理.对新来者的误导性部分就是这种情况;

  1. 假设SDK的新用户在入门部分中读取Basic SDK Usage.
  2. 根据文档设置S3客户端以进行测试.
  3. 一旦他们使用了S3代码,开发人员就决定跳到代码示例部分,为不同的AWS服务设置客户端.

这里的问题是所有代码示例(S3示例除外)都包含破坏IAM角色凭证方法的配置文件设置.

代码示例至少应该引用配置文件的功能.