簡體   English   中英

AWS php-sdk Lambda錯誤

[英]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時,幾件事會快速連續地發生,並且總是以相同的順序進行。 遇到的第一個失敗會導致整個請求失敗。

檢查的第一件事是簽名是否已過期,是由於顯式過期,還是由於Datex-amz-date值過於偏斜。

接下來,檢查AWSAccessKeyIdX-Amz-Credential的有效性(和后者的范圍)。

然后,對簽名進行驗證,以確保使用正確的匹配秘密密鑰對其進行簽名,並且自簽名以來沒有被篡改。 假設請求沒有在運行中被破壞或被篡改,則有兩種原因可以導致這種情況:無效的訪問密鑰機密或對請求進行簽名的代碼中的錯誤……因此,錯誤消息如下:

檢查您的AWS Secret Access密鑰和簽名方法

消息含糊不清的原因是請求簽名算法使用的一種安全機制(HMAC-SHA)使得無法區分這兩種情況(無效密鑰與錯誤)。 每個Signature V4請求都恰好有1個可能的有效簽名,以及16 ^ 64-1個其他可能的簽名,所有這些簽名都是同樣錯誤的,並且不傳達有關簽名不匹配的原因的信息。 (對於Signature V2,此數字較小,但對於本次討論而言,沒有意義。)最小的錯誤使整個算法陷入無法識別的混亂之中,這是安全性的固有部分。

僅在完成這些步驟之后,才對請求的語法和結構進行評估,檢查權限,然后繼續進行其余的請求處理,這就是為什么提供一個有用的錯誤並不那么實際的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM