【问题标题】:Call to IAM API in Lambda times out在 Lambda 中调用 IAM API 超时
【发布时间】:2021-05-24 16:30:40
【问题描述】:

我有一个 NodeJS lambda 函数,它试图通过 IAM listUsers API 方法列出 IAM 用户。调用正在触发,但在 lambda 函数本身超时之前永远不会返回,我不确定为什么。代码如下:

    exports.handler = async (event) => {
    
        console.log('before call');
        var ret = await listIAMUsers();
        console.log('ret: ' + JSON.stringify(ret));
    };
    
    
    async function listIAMUsers() {
        var AWS = require('aws-sdk');
        AWS.config.update({region: 'REGION'});
        var iam = new AWS.IAM({apiVersion: '2010-05-08'});
        
        var params = {MaxItems: 10};
        
        return iam.listUsers(params).promise();
    }

【问题讨论】:

    标签: node.js aws-lambda amazon-iam


    【解决方案1】:

    Managing IAM Users。密切注意我们在哪里初始化客户端并添加 require 语句。

    出于优化目的。加载和初始化是很好的。加载函数时的客户端

    // Load the AWS SDK for Node.js
    var AWS = require('aws-sdk');
    // Set the region 
    AWS.config.update({region: 'REGION'});
    // Create the IAM service object
    var iam = new AWS.IAM({apiVersion: '2010-05-08'});
    

    由于 JS 是单线程的,因此您可以重用客户端。

    
    // Load the AWS SDK for Node.js
    var AWS = require('aws-sdk');
    exports.handler = async (event, context) => {
            console.log('before call');
            var ret = await listIAMUsers();
            console.log('ret: ' + JSON.stringify(ret));
    };
        
    async function listIAMUsers() {
        // Set the region 
        AWS.config.update({region: 'REGION'});
        // Create the IAM service object
        var iam = new AWS.IAM({apiVersion: '2010-05-08'});
        var params = {MaxItems: 10};
        return iam.listUsers(params).promise();
    }
    
    
    START RequestId: 933ca3dd-2feb-4f98-8f8e-87286f59748d Version: $LATEST
    2021-02-22T15:57:14.867Z    933ca3dd-2feb-4f98-8f8e-87286f59748d    INFO    before call
    2021-02-22T15:57:15.560Z    933ca3dd-2feb-4f98-8f8e-87286f59748d    INFO    ret: {"ResponseMetadata":{"RequestId":"bf65a9f5-e4a6-493b-a6a2-c3081d88f7be"},
    "Users":[
        {"Path":"/","UserName":"username","UserId":"sadsadsadsa",
    "Arn":"arn:aws:iam::1234567890:user/username",
    "CreateDate":"2020-11-27T13:09:20.000Z","Tags":[]},
        {"Path":"/","UserName":"tempuser","UserId":"adsadasdasdsad",
    "Arn":"arn:aws:iam::1234567890:user/tempuser",
    "CreateDate":"2021-01-24T21:24:47.000Z","Tags":[]}],"IsTruncated":false}
    END RequestId: 933ca3dd-2
    

    【讨论】:

    • 感谢您的建议,但不幸的是,在移动该 require 语句后,它仍然失败,并在 lambda 超时时出现同样的超时行为
    • @ChrisDellinger 我共享的代码是有效的,只需尝试复制粘贴它应该可以工作,另外检查您的handler。如果设置正确,请在 lambda 设置中设置。另外请确保您的 lambda 角色是否具有列出用户的必要权限。如果。可能你可以分享错误信息。
    【解决方案2】:

    这里有几种可能性:

    1. Lambda 角色权限 - 尝试检查您的 lambda 角色是否附加了正确的 IAM 策略,例如 arn:aws:iam::aws:policy/IAMReadOnlyAccess
    2. 如果您的 Lambda 函数放置在没有任何 Internet 访问权限的公共子网或私有子网中,则您需要附加 arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole 以及 Internet 或 aws 服务访问权限(显示为 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2021-07-18
      • 1970-01-01
      • 2016-10-13
      • 2021-01-30
      • 2019-05-22
      • 2019-01-20
      相关资源
      最近更新 更多