如何从 AWS Lambda 函数运行 ECS 任务?
Posted
技术标签:
【中文标题】如何从 AWS Lambda 函数运行 ECS 任务?【英文标题】:How to run an ECS task from AWS Lambda function? 【发布时间】:2021-11-15 01:53:49 【问题描述】:我创建了一个 ECS 任务定义,并使用 AWS 控制台和 AWS CLI 成功运行。这些任务的多个实例将在一个集群中运行。这些是长期运行的任务(几个月到几年)。
我正在尝试使用 AWS Lambda 函数运行此任务的一个实例,但它不起作用。不会引发错误并且任务不会运行。我已将 AdministratorAccess 添加到 lambda 使用的执行角色。 VPC、子网组和安全组在 Lambda 中配置(选项卡配置 > VPC)
目标是运行任务而不是等待响应(因为这些是长时间运行的任务):
var aws = require('aws-sdk');
var ecs = new aws.ECS();
exports.handler = async (event) =>
var params =
cluster: "default",
count: 1,
launchType: "FARGATE",
networkConfiguration:
awsvpcConfiguration:
assignPublicIp: "ENABLED",
securityGroups: [ "sg-79002b" ],
subnets: [ "subnet-f4b4bf" ]
,
taskDefinition: "ecs-test-job-TestTaskDefinition-RgKHGrRzWZOq:1"
;
ecs.runTask(params, function(err)
if (err) console.warn('error: ', "Error while starting task: " + err);
);
;
回复:
Function Logs
START RequestId: 3f89e3d7-b997-4cda-a939-1ad806812c31 Version: $LATEST
END RequestId: 3f89e3d7-b997-4cda-a939-1ad806812c31
REPORT RequestId: 3f89e3d7-b997-4cda-a939-1ad806812c31 Duration: 50.20 ms Billed Duration: 51 ms Memory Size: 1280 MB Max Memory Used: 87 MB Init Duration: 417.57 ms
【问题讨论】:
【参考方案1】:异步函数exports.handler 在你的ecs.runTask
承诺被解决之前返回尝试像这样包装它:
var myprom = ecs.runTask(params).promise();
var result = await myprom; //Old syntax is myprom.then(()=>)
Try this code for checking if Lambda can connect to the internet.
连接到 Internet 网关的公共子网上的 Lambda 将无法访问 Internet。
Excerpt from another answer on ***.
要让 Lambda 通过 VPC 访问互联网,它应该位于 附加了 NAT 网关的私有子网。
在您的路由表中附加 NAT 网关而不是 igw-xxxxxx 当前子网
【讨论】:
我也尝试过等待,但由于这些是长期运行的任务,我们不希望得到响应。 15 分钟后等待超时 ("errorType":"TimeoutError","errorMessage":"connect ETIMEDOUT 52.95.114.96:443","code":"TimeoutError","message":"connect ETIMEDOUT 52.95.114.96:443","errno":-110,"syscall":"connect"..,"stack":["Error: connect ETIMEDOUT 52.95.114.96:443"," at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1148:16)"] END
)
您的 Lambda 是否部署在可以访问互联网的 VPC 中?
你成功了。 Lambda 位于公共子网中,但需要位于连接了 NAT 网关而不是 Internet 网关的私有子网中。我用我的发现更新了你的答案。谢谢你,大卫。以上是关于如何从 AWS Lambda 函数运行 ECS 任务?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除