AWS PHP SDK调用Lambda无API时异常求助(SNS凭证可正常使用)
看起来你遇到的情况有点棘手——SNS能用本地凭证文件,但Lambda调用却出问题,先别着急,我们一步步来排查:
先确认LambdaClient的初始化配置
首先要确保你初始化LambdaClient时没有配置错误,尤其是区域和API版本。AWS SDK v2的Lambda需要指定正确的API版本2015-03-31,而且如果你的Lambda函数和SNS不在同一个区域,那必须明确指定Lambda所在的区域,不然默认区域不对会导致调用失败。举个正确的初始化例子:$client = LambdaClient::factory(array( 'region' => 'us-east-1', // 替换成你的Lambda函数所在区域 'version' => '2015-03-31' ));验证凭证链的加载优先级
AWS SDK的凭证加载是有优先级的:环境变量 >~/.aws/credentials> IAM角色。如果你的代码运行环境里不小心设置了错误的AWS_ACCESS_KEY_ID或AWS_SECRET_ACCESS_KEY环境变量,会直接覆盖凭证文件里的内容,而SNS可能刚好没受影响。你可以打印客户端配置来确认:print_r($client->getConfig());重点看
credentials部分,确认是不是你预期的IAM用户。检查IAM权限是否足够
虽然SNS的权限没问题,但Lambda调用需要单独的lambda:InvokeFunction权限。你要确认你的IAM用户/角色的政策里包含这个权限,比如:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:你的区域:你的AWS账号ID:function:你的Lambda函数名" } ] }你也可以用AWS CLI先测试下这个凭证能不能调用Lambda:
aws lambda invoke --function-name 你的Lambda函数名 --region 你的区域 output.txt如果CLI也报错,那大概率是权限或凭证问题;如果CLI正常,那就是SDK的配置问题。
捕获异常看具体错误信息
最关键的一步是给你的invoke代码加上异常捕获,拿到具体的错误提示,比如权限不足、函数不存在、区域错误等,这些信息能直接定位问题:try { $result = $client->invoke(array( 'FunctionName' => '你的Lambda函数名', 'Payload' => json_encode(array('your' => 'data')) )); print_r($result); } catch (Aws\Lambda\Exception\LambdaException $e) { echo "错误信息:" . $e->getMessage() . "\n"; echo "AWS错误码:" . $e->getAwsErrorCode() . "\n"; echo "AWS错误详情:" . $e->getAwsErrorMessage() . "\n"; }
内容的提问来源于stack exchange,提问作者Patrick Florian

