使用AWS JS SDK编写Lambda获取账号所有IAM角色返回null如何解决
问题根因
- 异步逻辑不匹配:你使用回调方式调用
iam.listRoles接口,但async类型的Lambda handler不会等待回调函数执行完成,函数在接口返回结果前就已经结束执行,因此返回的结果始终是空值。 - IAM权限缺失:如果Lambda函数绑定的执行角色没有配置
iam:ListRoles操作权限,接口调用会抛出权限错误,也会导致无法拿到正确结果。
修复方案
将回调调用改为AWS SDK支持的Promise调用形式,配合await等待接口返回结果后再组装响应,示例代码如下:
const AWS = require("aws-sdk"); exports.handler = async (event) => { const iam = new AWS.IAM(); try { // 等待listRoles接口返回结果 const data = await iam.listRoles().promise(); const response = { statusCode: 200, body: JSON.stringify(data.Roles) }; return response; } catch (err) { console.log(err, err.stack); return { statusCode: 500, body: JSON.stringify({error: err.message}) }; } };
额外配置检查
请确认Lambda执行角色的权限策略中已经添加了如下权限声明:
{ "Effect": "Allow", "Action": "iam:ListRoles", "Resource": "*" }
内容的提问来源于stack exchange,提问作者Abhishek Tirkey
相关产品推荐
相关产品推荐

