【问题标题】:How to run an ECS task from AWS Lambda function?如何从 AWS Lambda 函数运行 ECS 任务?
【发布时间】: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

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-ecs


    【解决方案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 Stackoverflow.

    要让 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 网关的私有子网中。我用我的发现更新了你的答案。谢谢你,大卫。
    猜你喜欢
    • 2022-11-18
    • 2021-07-11
    • 1970-01-01
    • 2019-09-25
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多