[英]AWS php-sdk Lambda Error
您好,感謝您的幫助,
我在不使用API的情況下將php-sdk用於aws lambda調用方法。
我正在按照此https://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.Lambda.LambdaClient.html#_invoke的文檔進行操作
奇怪的是,我將SNS類與外部憑據文件一起使用,該文件位於〜/ .aws / credentials和〜/ .aws / config中,並且工作正常,因此我認為憑據不存在問題,盡管我可能錯了。
我的代碼是:
$client = LambdaClient::factory([
'version' => 'latest',
'key' => $f_key,
'secret' => $f_secret,
'region' => 'us-east-1'
]);
$result = $client->invoke(array(
'FunctionName' => 'MY_FUNC',
// NOT SET AWS SAYS IT DEFAULTS
// 'InvocationType' => 'string',
// 'LogType' => 'string',
// 'Qualifier' => 'string',
'ClientContext' => '
'ClientContext' => '{
"id": 1006410,
"title": "LAMBDA TEST"
}',
',
'Payload' => 'mixed type: string|resource|\Guzzle\Http\EntityBodyInterface',
));
我得到的錯誤:
PHP Fatal error: Uncaught exception 'Aws\Lambda\Exception\LambdaException' with message 'Error executing "Invoke" on "https://lambda.us-east-1.amazonaws.com/2015-03-31/ARN_REMOVED/invocations"; AWS HTTP error: Client error: `POST https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/ARN_REMOVED/invocations` resulted in a `403 Forbidden` response:
{"message":"The request signature we calculated does not match the signature you provided. Check your AWS Secret Access (truncated...)
InvalidSignatureException (client): The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. - {"message":"The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for in /home/USER/Documents/symphonic/SMS-v1/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php on line 191
此PHP SDK期望可選的ClientContext
是base64編碼的JSON對象,而不是數組。
ClientContext => (string)
使用ClientContext可以將特定於客戶端的信息傳遞給您要調用的Lambda函數。 然后,您可以通過上下文變量進行選擇,從而在Lambda函數中處理客戶信息。 有關ClientContext JSON的示例,請轉到Amazon Mobile Analytics API參考和用戶指南中的PutEvents。
ClientContext JSON必須經過base64編碼。
https://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.Lambda.LambdaClient.html#_invoke
據推測,簽名錯誤是由內部兩個部分之間的差異引起的:SDK在生成簽名時處理不正確的參數類型的方式,以及在生成實際請求時進行處理的方式。 似乎是一個SDK錯誤,不正確的參數類型在將請求發送到API之前一直被靜默處理,這引發了模糊的錯誤。
不過,服務API並不存在問題。
當請求到達AWS時,幾件事會快速連續地發生,並且總是以相同的順序進行。 遇到的第一個失敗會導致整個請求失敗。
檢查的第一件事是簽名是否已過期,是由於顯式過期,還是由於Date
或x-amz-date
值過於偏斜。
接下來,檢查AWSAccessKeyId
或X-Amz-Credential
的有效性(和后者的范圍)。
然后,對簽名進行驗證,以確保使用正確的匹配秘密密鑰對其進行簽名,並且自簽名以來沒有被篡改。 假設請求沒有在運行中被破壞或被篡改,則有兩種原因可以導致這種情況:無效的訪問密鑰機密或對請求進行簽名的代碼中的錯誤……因此,錯誤消息如下:
檢查您的AWS Secret Access密鑰和簽名方法
消息含糊不清的原因是請求簽名算法使用的一種安全機制(HMAC-SHA)使得無法區分這兩種情況(無效密鑰與錯誤)。 每個Signature V4請求都恰好有1個可能的有效簽名,以及16 ^ 64-1個其他可能的簽名,所有這些簽名都是同樣錯誤的,並且不傳達有關簽名不匹配的原因的信息。 (對於Signature V2,此數字較小,但對於本次討論而言,沒有意義。)最小的錯誤使整個算法陷入無法識別的混亂之中,這是安全性的固有部分。
僅在完成這些步驟之后,才對請求的語法和結構進行評估,檢查權限,然后繼續進行其余的請求處理,這就是為什么提供一個有用的錯誤並不那么實際的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.