AWS Lambda IAM无法连接AWS IoT

时间:2019-08-27 09:24:22

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

我们有一个用例,我们需要一个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通过给我凭据,然后再次出现错误。

:(

0 个答案:

没有答案