AWS php-sdk Lambda Error



您好,感谢您的帮助,

我正在使用 php-sdk 作为 aws lambda invoke 方法,而无需使用 API。

我正在按照此 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|GuzzleHttpEntityBodyInterface',
));

我得到的错误:

PHP Fatal error:  Uncaught exception 'AwsLambdaExceptionLambdaException' 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)

使用客户端上下文,您可以将特定于客户端的信息传递给您正在调用的 Lambda 函数。然后,您可以按照通过上下文变量的选择在 Lambda 函数中处理客户端信息。有关 ClientContext JSON 的示例,请转到亚马逊移动分析 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偏差太高。

接下来,检查AWSAccessKeyIdX-Amz-Credential的有效性(在后一种情况下为范围)。

然后,验证签名,以确保它已使用正确的匹配密钥进行签名,并且自签名以来未被篡改。 假设请求在传输中未损坏或被篡改,则有两种情况可能导致此问题:无效的访问密钥机密或签署请求的代码中的错误...因此,错误消息:

检查您的 AWS 秘密访问密钥和签名方法

消息含糊不清的原因是请求签名算法使用的一种安全机制 (HMAC-SHA) 无法区分两个条件(无效密钥与错误)。 每个签名 V4 请求正好有 1 个可能的有效签名,以及 16^64 - 1 个其他可能的签名,所有这些签名都同样错误,并且不传达有关签名不匹配原因的信息。(签名 V2 的数字较小,但对于此讨论而言,该数字没有意义。 最微小的错误会使整个算法陷入无法识别的混乱,这是安全性的内在组成部分。

只有在这些步骤完成后,才会评估请求的语法和结构,检查权限,并继续进行其余的请求处理,这就是为什么提供更有用的错误并不那么实用的原因。

相关内容

最新更新