繁体   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