【问题标题】:Exception when publishing mqtt message from lambda inside docker container从 docker 容器内的 lambda 发布 mqtt 消息时出现异常
【发布时间】:2021-10-19 22:54:02
【问题描述】:

我在 docker 容器内运行 aws SAM Lambda,并尝试使用 aws 示例代码(适用于 JAVA 的 aws iot SDK)中的 pubSub 类发布 MQTT 消息。当我在 lambda 之外使用相同的类/方法时,它可以工作。当我从 lambda 内部运行它时,出现以下异常:

software.amazon.awssdk.crt.CrtRuntimeException:aws_tls_ctx_options_init_client_mtls_from_path 失败(aws_last_error:AWS_ERROR_FILE_INVALID_PATH(44),无效文件路径。)UNKNOWN(-1)

我认为这是因为 docker 容器无法访问证书(.pem 文件),所以我将其添加到 docker 配置中的文件共享设置中,但仍然是相同的异常.. 我在这里错过了什么?

【问题讨论】:

  • Invalid file path 错误似乎很明显;没有更多信息(Dockerfile 等)很难进一步评论。

标签: amazon-web-services docker mqtt aws-iot


【解决方案1】:

就像“英国人”所说的那样,信息非常明确。无法识别证书文件,因为 Lambda 在 Docker 容器中运行,该容器无法访问本地硬盘驱动器上的文件(包括证书)。 有两种可行的解决方案:

  1. 不要使用直接 MQTT,而是使用 MQTT Over WebSocket - Sig4,它使用 IAM 凭证而不是证书。 https://github.com/aws/aws-iot-device-sdk-java#build-the-sdk-from-the-github-source

  2. 根据您的使用案例,使用 HTTPS - IotDataPlaneClient 代替 MQTT 发布消息甚至可能有意义,尤其是在多个 Lambda 尝试使用相同证书时可能存在并发问题时。 https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/iotdataplane/IotDataPlaneClient.html

我最终做的是选项 1 - IDK,如果有办法将文件包含在 docker 容器的范围内,但这是一个很好的解决方法。

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 2018-09-09
    • 1970-01-01
    • 2012-08-27
    • 2022-06-14
    • 1970-01-01
    • 2017-05-14
    • 2017-02-22
    • 2021-08-17
    相关资源
    最近更新 更多