我们有一个用例,我们需要一个Lambda函数来连接到AWS IoT,并具有订阅和发布主题的能力。我们使用AWS IoT SDK开发了该应用程序。我们想在端口443上的WebSocket上使用MQTT,因此我们使用了以下构造函数:
// AWS IAM credentials could be retrieved from AWS Cognito, STS, or other secure sources
AWSIotMqttClient client = new AWSIotMqttClient(clientEndpoint, clientId, awsAccessKeyId, awsSecretAccessKey, sessionToken);
// optional parameters can be set before connect()
client.connect();
并获取我们正在使用的凭据:
EnvironmentVariableCredentialsProvider credentialsProvider = new EnvironmentVariableCredentialsProvider();
我们的lambda函数已获得外部访问权限,并授予其IAM角色以进行所有权限的测试:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
现在有趣的是,当我们在本地进行测试时,效果很好。 :)。一切正常。但是,当我们在Lambda中对其进行测试时,会出现以下错误:
Aug 27, 2019 8:56:53 AM com.amazonaws.services.iot.client.mqtt.AwsIotMqttConnectionListener onFailure
08:56:53 WARNING: Connect request failure
08:56:53 MqttException (0) - java.lang.NullPointerException
08:56:53 at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38)
08:56:53 at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:664)
08:56:53 at java.lang.Thread.run(Thread.java:748)
08:56:53 Caused by: java.lang.NullPointerException
08:56:53 at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketHandshake.receiveHandshakeResponse(WebSocketHandshake.java:133)
08:56:53 at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketHandshake.execute(WebSocketHandshake.java:74)
08:56:53 at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketSecureNetworkModule.start(WebSocketSecureNetworkModule.java:77)
08:56:53 at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:650)
08:56:53 ... 1 more
08:56:53 Aug 27, 2019 8:56:53 AM com.amazonaws.services.iot.client.core.AwsIotConnection onConnectionFailure
08:56:53 INFO: Connection temporarily lost
08:56:53 Aug 27, 2019 8:56:53 AM com.amazonaws.services.iot.client.core.AwsIotConnection onConnectionFailure
08:56:53 INFO: Connection retry cancelled or exceeded maximum retries
08:56:53 Aug 27, 2019 8:56:53 AM com.amazonaws.services.iot.client.core.AbstractAwsIotClient onConnectionClosed
08:56:53 INFO: Client connection closed: 7f5e5b0d-d41a-48d1-955e-d71f2e1d5e51
在研究了各种问题和SDK代码之后,NPE在更高的版本中进行了更改,以显示一条更有用的错误消息,即拒绝连接身份验证。不幸的是,由于另一个与最近Paho升级有关的错误引入了兼容性错误,因此直到Paho的朋友们负责修复upgrade header issues并且AWS的朋友使Paho 1.2.0与SDK兼容之前,我们尚无法升级。
在有人告诉我们Lambda 不适合订购寿命长的MQTT之前……”尽管我们同意在很多情况下Lambda不适合我们的特定用例,但它是完美的。我们只是在试图理解为什么它在本地而不在Lambda上起作用。
更新:
好的,我为应用程序添加了先查看自定义ENV变量集的功能,然后如果不存在它们,则退回使用lambda函数提供的默认ENV变量证书。然后,我向分配给lambda函数的相同角色添加了一个用户,并直接在ENV中使用这些凭据替换了lambda传递的凭据。删除这些,然后让lambda通过给我凭据,然后再次出现错误。
:(