如何在 AWS Lambda 中运行 AWS SDK Opsworks 命令?
Posted
技术标签:
【中文标题】如何在 AWS Lambda 中运行 AWS SDK Opsworks 命令?【英文标题】:How to run AWS SDK Opsworks Commands in AWS Lambda? 【发布时间】:2017-01-16 22:08:15 【问题描述】:我有一个非常简单的 lambda 函数,试图使用 AWS 开发工具包调用 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,是的,我在 VPC 中运行,这是个问题。 【参考方案1】:为了解决这个问题,我刚刚删除了自定义 VPC 设置,因为该函数只是尝试访问 AWS Opsworks API。在文档中也注意到了这一点:
当您启用 VPC 时,您的 Lambda 函数将失去默认的互联网访问权限。如果您的函数需要外部 Internet 访问,请确保您的安全组允许出站连接并且您的 VPC 具有 NAT 网关。
由于 Lambda 将 SDK 捆绑在函数内部可用,并且访问权限由 IAM 策略确定,因此您仍然需要外部访问互联网才能使用 API,这有点令人困惑。
【讨论】:
您不需要“外部访问互联网”来使用 AWS API,您需要外部访问不属于您的 VPC 的任何内容。文档中的措辞可能更清楚。请注意,您可以通过 VPC 终端节点仅通过 VPC 访问来访问 S3。希望他们将来会添加更多的 VPC 服务端点。以上是关于如何在 AWS Lambda 中运行 AWS SDK Opsworks 命令?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 AWS Lambda 在 AWS EMR 上运行 PySpark
如何在 Docker 容器中运行 AWS Lambda 层?
AWS CDK - 如何在本地运行 API 和 Lambda?