2013-10-23 4 views
0

누군가 아래의 PHP 코드가 InvalidClientTokenId 오류가 발생하는 이유를 알려 주실 수 있습니까? 적절한 권한으로이 EC2 인스턴스에 역할이 지정되었습니다. 이 간단한 테스트 케이스를 제공하기 위해 포맷 및 표준을 단순화하고 최소화했습니다. 결과PHP, AWS API, 역할, InvalidClientTokenId 오류가 발생했습니다.

// get role credentials 
$role_name = file_get_contents('http://169.254.169.254/latest/meta-data/iam/security-credentials/'); 
$auth = json_decode(file_get_contents('http://169.254.169.254/latest/meta-data/iam/security-credentials/'.$role_name),true); 
print_r($auth); 

// fixed params 
$params = array(); 
$params['AWSAccessKeyId']  = $auth['AccessKeyId']; 
$params['SignatureMethod'] = 'HmacSHA256'; 
$params['SignatureVersion'] = '2'; 
$params['Timestamp']   = gmdate('Y-m-d\TH:i:s\Z'); 

// SDB API 
$params['Version']   = '2009-04-15'; 
$params['Action']    = 'Select'; 
$params['SelectExpression'] = 'select * from `MYSDBDOMAIN`'; 

// format params into a string according to aws requirements 
uksort($params, 'strcmp'); $params_str = ''; 
foreach ($params as $key => $val){ $params_str .= rawurlencode($key).'='.rawurlencode($val).'&'; } 
$params_str = str_replace('%7E', '~',$params_str); $params_str = substr($params_str, 0, -1); 

// create signature 
$signature = urlencode(base64_encode(hash_hmac('sha256', "GET\nsdb.ap-southeast-1.amazonaws.com\n/\n".$params_str, $auth['SecretAccessKey'], true))); 

// create full url 
$url = "https://sdb.ap-southeast-1.amazonaws.com/?$params_str&Signature=$signature"; 

// Initiate curl and set options 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: keep-alive', 'Keep-Alive: 300', 'x-amz-security-token: '.$auth['Token'])); 

// get the result into an array and print 
$result = json_decode(json_encode(simplexml_load_string(curl_exec($ch))),true); 
print_r($result); 

:

Array 
(
    [Code] => Success 
    [LastUpdated] => 2013-10-18T02:31:12Z 
    [Type] => AWS-HMAC 
    [AccessKeyId] => +MYACCESSKEY+ 
    [SecretAccessKey] => +MYSECRET+ 
    [Token] => +MYTOKEN+ 
    [Expiration] => 2013-10-18T09:04:14Z 
) 


Array 
(
    [Errors] => Array 
     (
      [Error] => Array 
       (
        [Code] => InvalidClientTokenId 
        [Message] => The AWS Access Key Id you provided does not exist in our records. 
       ) 

     ) 

    [RequestID] => d0a23941-b9ff-ab89-e357-ab8122ee7307 
) 

답변

0

이 솔루션이었다 감사드립니다. SecurityToken 매개 변수를 추가해야했습니다 :

$params['SecurityToken'] = $auth['Token']; 
관련 문제