如何从 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 集群

ECS 任务能否调用 lambda?

如何在 AWS ECS 集群的服务中运行 AWS ECS 任务,而不是将服务从 Circle CI 的“aws-ecs/run-task”中排除

如何将 AWS 区域传递给 lambda 函数?

如何确定AWS Lambda函数中的当前区域?

如何在aws中运行java lambda函数[重复]