尝试将缓存添加到KMS时出现SDK错误

时间:2015-05-14 15:51:39

标签: php amazon-web-services interface

我收到以下错误

Fatal error: Uncaught exception 'Aws\Common\Exception\InvalidArgumentException' with message 'Unable to utilize caching with the specified options' in vendor/aws/aws-sdk-php/src/Aws/Common/Credentials/Credentials.php:305 Stack trace: 

#0 vendor/aws/aws-sdk-php/src/Aws/Common/Credentials/Credentials.php(113): Aws\Common\Credentials\Credentials::createCache(Object(Aws\Common\Credentials\RefreshableInstanceProfileCredentials), Object(Illuminate\Cache\ApcStore), 'credentials_214...') 

#1 vendor/aws/aws-sdk-php/src/Aws/Common/Client/ClientBuilder.php(431): Aws\Common\Credentials\Credentials::factory(Object(Guzzle\Common\Collection)) 

#2 vendor/aws/aws-sdk-php/src/Aws/Common/Client/ClientBuilder.php(227): Aws\Common\Client\ClientBuilder->getCredent in vendor/aws/aws-sdk-php/src/Aws/Common/Credentials/Credentials.php on line 305

使用以下代码

use Aws\Kms\Exception\KmsException,
    Aws\Kms\KmsClient;

....

public function __construct($region = 'us-east-1')
{
    $this->cacheAdapter = New Illuminate\Cache\ApcStore(New Illuminate\Cache\ApcWrapper());

    $this->region = $region;
    $this->kms = KmsClient::factory([
        'credentials.cache' => $this->cacheAdapter,
        'region'            => $this->region,
    ]);
}

我认为这需要实施Guzzle CacheAdaperInterface,但我不确定该怎么做呢?

1 个答案:

答案 0 :(得分:0)

我在SDK前面使用了一个修复问题的缓存服务。

<?php

Namespace Library\Cache\Aws
{
  USE Guzzle\Cache\CacheAdapterInterface as CacheInterface;

  Class ApcAdapter Implements CacheInterface
  {
    /**
     * Test if an entry exists in the cache.
     *
     * @param string $id cache id The cache id of the entry to check for.
     * @param array $options Array of cache adapter options
     * @return bool Returns TRUE if a cache entry exists for the given cache id, FALSE otherwise.
     */
    public function contains($id, array $options = null)
    {
        return apc_exists($id);
    }

    /**
     * Deletes a cache entry.
     *
     * @param string $id cache id
     * @param array $options Array of cache adapter options
     * @return bool TRUE on success, FALSE on failure
     */
    public function delete($id, array $options = null)
    {
        return apc_delete($id);
    }

    /**
     * Fetches an entry from the cache.
     *
     * @param string $id cache id The id of the cache entry to fetch.
     * @param array $options Array of cache adapter options
     * @return string The cached data or FALSE, if no cache entry exists for the given id.
     */
    public function fetch($id, array $options = null)
    {
        return apc_fetch($id);
    }

    /**
     * Puts data into the cache.
     *
     * @param string $id The cache id
     * @param string $data The cache entry/data
     * @param int|bool $lifeTime The lifetime. If != false, sets a specific lifetime for this cache entry
     * @param array $options Array of cache adapter options
     * @return bool TRUE if the entry was successfully stored in the cache, FALSE otherwise.
     */
    public function save($id, $data, $lifeTime = false, array $options = null)
    {
        return apc_add($id, $data, intval($lifeTime));
    }
  }
}

Namespace Library\ServiceBuilder
{

  USE Aws\Common\Aws               AS ServiceBuilder,
      Aws\DynamoDb\DynamoDbClient  AS DynamoDbClient,
      Aws\Kms\KmsClient            AS KmsClient,
      Library\Cache\Aws\ApcAdapter AS ApcAdapter;

  Class Aws
  {
    protected static $_instance = [];
    protected        $_awsInstance;
    protected        $_region;

    protected function __construct($region)
    {
        $cacheAdapter = New ApcAdapter();
        $this->_region = $region;
        $this->_awsInstance = ServiceBuilder::factory(null, [
              'credentials.cache' => $cacheAdapter, 
              'region'            => $region,
            ]
        );

    }

    /**
     * @param string $region [opt, default=us-east-1]
     * @static
     * @return \Engrade\ServiceBuilder\Aws
     */
    public static function getInstance($region = 'us-east-1')
    {
        if (! array_key_exists($region, self::$_instance)) 
        {
            self::$_instance[$region] = New self($region);
        }

        return self::$_instance[$region];
    }

    /**
     * @return KmsClient
     */
    public function getKmsClient() 
    {
        return $this->_awsInstance->get('kms');
    }

    /**
     * @return DynamoDbClient
     */
    public function getDynamoDbClient() 
    {
        return $this->_awsInstance->get('dynamodb');
    }
  }
}

Namespace
{
  USE Library\ServiceBuilder AS ServiceBuilder
      Aws\Kms\Exception\KmsException,
      Aws\Kms\KmsClient;

  ....

  public function __construct($region = 'us-east-1')
  {
    $this->region = $region;

    $aws = ServiceBuilder\Aws::getInstance();
    $kms = $aws->getKmsClient();

    $this->kms = $kms::factory([
      'region' => $this->region,
    ]);
  }
}