如何在AWS Lambda中运行AWS SDK Opsworks命令?

3

我有一个非常简单的Lambda函数,试图使用AWS SDK调用opsworks.describeInstances。代码在本地执行得很好,但是在Lambda内部,它超时而没有任何错误或反馈。

var AWS = require('aws-sdk');
var opsworks = new AWS.OpsWorks({
    apiVersion: 'latest',
    region: "us-east-1"
});
exports.handler = function(event, context, callback) {
    var params = {
        LayerId: 'idoflayer'
    };
    opsworks.describeInstances(params, function(err, data) {
        if (err) {
            return callback(err);
        }
        callback(null, data);
    });
};

Lambda策略是:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "opsworks:CreateDeployment",
                "opsworks:DescribeDeployments",
                "opsworks:DescribeLayers",
                "opsworks:DescribeInstances"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

我已经增加了内存和超时时间。日志只显示函数被调用,没有输出。Lambda函数的监控显示有调用错误,但我认为这只是由于超时引起的。我在us-west-2中运行它,但我也尝试在us-east-1中运行它,结果相同。
有什么想法吗?我很想使用lambda来监视和管理OpsWorks。

这种超时通常是由于将Lambda函数放置在没有NAT网关的VPC中引起的。具有VPC访问权限的Lambda函数不会获得公共IP地址,因此如果您希望Lambda函数访问VPC之外的任何内容(例如AWS Opsworks API),则需要拥有NAT网关。 - Mark B
谢谢Mark B,是的,我正在VPC内运行,那就是问题所在。 - JGS
1个回答

0
为了解决这个问题,我只需删除自定义VPC设置,因为该函数仅尝试访问AWS Opsworks API。文档中还注意到以下内容:
“启用VPC后,您的Lambda函数将失去默认的Internet访问权限。如果您的函数需要外部Internet访问权限,请确保您的安全组允许出站连接,并且您的VPC具有NAT网关。”
由于Lambda捆绑了SDK以在函数内部使用,并且访问受IAM策略确定,因此仍然需要外部访问Internet才能使用API,这有点令人困惑。

您不需要“外部访问互联网”才能使用AWS API,您需要访问任何不属于您的VPC的外部资源。文档中的措辞可能需要更清晰明了。请注意,您可以通过VPC端点仅使用VPC访问S3。希望未来会添加更多的VPC服务端点。 - Mark B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接