访问aws服务没有密钥和& php

时间:2018-06-12 12:56:59

标签: php amazon-web-services amazon-ec2 aws-sdk

要明确的是,我们已经创建了EC2策略,因此我的网站可以直接访问参数存储,S3,Amazon SES等服务。

截至目前,我的所有凭据都存储在AWS参数存储中,然后网站正在使用这些凭据,即数据库凭据,差异。 API密钥等。因此,只有硬编码凭证才能从参数存储中获取参数。现在,客户端也希望删除这些硬编码凭据,这就是我们创建EC2策略的原因。

到目前为止,我们有以下代码来获取参数:

$config = array(
        'version' => 'latest',
        'region' => '*****',
        'credentials' => array(
            'key' => '*******',
            'secret' => '******',
        )
    );
$s3_instance = new \Aws\Ssm\SsmClient($config);

$result = $s3_instance->getParameters([
    'Names' => $credential_group,
    'WithDecryption' => true
]);
//converting S3 private data to array to read
$keys = $result->toArray();
var_dump($keys);

现在问题是我必须在上面的代码中进行更改,因此它应该在不传递这些凭据的情况下工作。

注意:我正在使用AWS PHP库执行上述操作。

更新

进一步阅读文档https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_credentials.html

  

使用环境变量的凭据
  如果您在实例化时未向客户端对象提供凭据,则SDK会尝试在您的环境中查找凭据。 SDK检查凭据的第一个位置是您的环境变量。 SDK使用getenv()函数函数来查找AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY和AWS_SESSION_TOKEN环境变量。这些凭据称为环境凭据。

之后,我尝试了下面的内容:

  

的var_dump(GETENV(' AWS_ACCESS_KEY_ID'));

但它返回bool(false)。那么我需要在环境凭证中手动设置它们吗? 我需要在上面的代码中更改哪些内容?

更新

基于此文档:https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/guide_configuration.html#credentials

我做了以下更改(从数组中删除了凭据部分):

$config = array(
    'version' => 'latest',
    'region' => '*****'
);

然后系统抛出以下警告:

  

警告:include(Test_Role_Cognitoaccess_from_instanceRole.php):无法打开流

     

警告:include():无法打开' Test_Role_Cognitoaccess_from_instanceRole.php'包含(include_path ='。:/ usr / share / pear:/ usr / share / php')

     

警告:include(Test_Role_Cognitoaccess_from_instanceRole.php):无法打开流

     

警告:include():无法打开' Test_Role_Cognitoaccess_from_instanceRole.php'包含(include_path ='。:/ usr / share / pear:/ usr / share / php')

2 个答案:

答案 0 :(得分:1)

正如您已经提到的,您已将策略附加到EC2 IAM角色以访问其他AWS服务。

您应该尝试创建默认凭据提供程序,这将自动从该角色中选择密钥。

$provider = CredentialProvider::chain(CredentialProvider::env(), CredentialProvider::ini(), CredentialProvider::instanceProfile(), CredentialProvider::ecsCredentials());

答案 1 :(得分:0)

当您将凭证直接传递给 SsmClient 并同时为 EC2 机器定义角色时,您就会对 AWS 造成混淆。如果您已经为 EC2 实例定义了权限,那么只需执行以下操作:

use Aws\Ssm\SsmClient;
      
 
$client = new SsmClient(['version' => 'latest', 'region' => 'ap-southeast-2']);

$result = $client->getParameters(['Names' => ['My-SECRATE-KEY'], 'WithDecryption' => true]);

print_r($result);

请记住,权限的传播需要一点时间,在此期间您会​​收到特定用户的权限错误。如果您等待并让更改生效,则上述代码将正常工作而不会出现任何错误。就我而言,我将 AmazonSSMReadOnlyAccess 附加到 EC2 角色和 EC2 实例。如果参数存储中的键/值未加密,则可以删除 'WithDecryption' => true 或将其更改为 false。