[英]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.