AWS Lambda实现Fleet Provisioning时调用IoT API报ResourceNotFound异常求助
我正尝试在AWS Lambda函数中实现Fleet Provisioning(设备批量配置),初始代码如下:
'use strict'; var AWS = require('aws-sdk'); var iot = new AWS.Iot({ endpoint: 'apiendpoint', accessKeyId: "AAAABBBBBCCCCDDDDD", secretAccessKey: "AAAAABBBBCCCDD/1234122311222", region: 'ap-south-1' }); exports.handler = async (event, context) => { var params = { setAsActive: true }; return { statusCode: 200, body:JSON.stringify(await createCertAndKey(params)) } } const createCertAndKey = async (params) => { return new Promise((resolve, reject) => { iot.createKeysAndCertificate(params, function(err, data){ if(err){ console.log(err); reject(err) } else{ console.log("success?"); resolve(data) } }) }) }
调用createKeysAndCertificate接口时出现ResourceNotFound异常,调用其他AWS IoT相关函数也会触发相同异常,请问我哪里操作错误?
问题分析与解决方案
先来说说你代码里的几个关键问题,这些大概率是导致ResourceNotFound的核心原因:
1. 硬编码访问密钥的双重问题
你直接在代码里写死accessKeyId和secretAccessKey,这不仅严重违反AWS安全最佳实践(极容易导致密钥泄露),更关键的是:Lambda函数运行时本应通过IAM角色获取权限,硬编码密钥会让SDK无法正确关联到你的AWS账户下的IoT资源,进而引发资源找不到的错误。
解决方法:立刻删除代码里的accessKeyId和secretAccessKey配置,给Lambda函数关联一个包含iot:CreateKeysAndCertificate等所需IoT操作权限的IAM角色。
2. IoT服务端点配置错误
你设置的endpoint是'apiendpoint',这显然是个无效的占位符。AWS IoT的标准API端点格式为iot.<region>.amazonaws.com,比如你用的ap-south-1区域,正确端点应该是iot.ap-south-1.amazonaws.com。
错误的端点会让SDK无法连接到正确的AWS IoT服务节点,自然会返回资源不存在的异常。更省心的做法是直接省略endpoint配置——AWS SDK会根据你指定的region自动推断正确的服务端点,避免手动输入出错。
3. 异步代码的简化优化(可选但推荐)
你的createCertAndKey手动用Promise封装了回调,其实AWS SDK v2已经支持直接通过.promise()方法将回调转为Promise,代码会更简洁且不易出错:
const createCertAndKey = async (params) => { try { const data = await iot.createKeysAndCertificate(params).promise(); console.log("success!"); return data; } catch (err) { console.log(err); throw err; } }
最终修复步骤总结
- 给Lambda函数分配带有正确IoT权限的IAM角色,彻底移除硬编码密钥
- 修正或删除错误的endpoint配置
- 确认Lambda所在区域和你的IoT资源所在区域一致(代码里是ap-south-1,确保IoT服务也部署在该区域)
做完这些调整后,再测试调用应该就能解决ResourceNotFound的问题了。
内容的提问来源于stack exchange,提问作者Sujata

