【问题标题】:AWS php-sdk Lambda ErrorAWS php-sdk Lambda 错误
【发布时间】:2018-09-21 19:49:20
【问题描述】:

您好,感谢您的帮助,

我在不使用 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

【问题讨论】:

  • ClientContext 不应该是一个包含 base64 编码 JSON 的字符串,而不是一个数组吗?我建议您在完全删除该元素的情况下进行测试。
  • @Michael-sqllbot 我认为您是正确的,现在查看我的代码,我发现它是数组格式并且可能没有正确编码谢谢您的建议我会尝试一下,如果它工作我会接受你的回答
  • @Michael-sqllbot 非常感谢!这对我有用:
  • $str = '{"Type":"User"}'; $base64str = base64_encode($str); 'ClientContext' => $base64str,

标签: php amazon-web-services aws-lambda


【解决方案1】:

此 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 错误,错误的参数 type 在向 API 发送请求之后一直被静默处理,这会引发一个模糊的错误。

不过,服务 API 没有问题。

当请求到达 AWS 时,几件事情会以非常快的速度连续发生,并且总是以相同的顺序发生。遇到的第一个失败会导致整个请求失败。

首先检查签名是否已过期,要么是显式过期,要么是 Datex-amz-date 值过于倾斜。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 2017-02-11
    • 2022-11-24
    • 2017-10-03
    • 2012-11-10
    • 1970-01-01
    • 2021-04-23
    相关资源
    最近更新 更多