为什么我不能从AWS Lambda运行ECS任务?

时间:2019-06-17 18:31:52

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

我正在使用Amazon Web Services,并尝试在由Lambda触发的集群上运行ECS任务定义。

当我在ECS控制台中手动运行此任务并选择所有与我传递给run_task相同的选项时,它运行得很好。我看到Cloudwatch中的日志,并且任务的效果(更新数据库)已按预期发生。但是,当我从Lambda运行任务时,它不起作用,而且也没有给我带来我看到的错误。

这是Lambda定义:

import boto3

def lambda_handler(event, context):
    print("howMuchSnowDoUpdate")
    client = boto3.client('ecs')
    response = client.run_task(
        cluster='HowMuchSnow',
        taskDefinition='HowMuchSnow:2',
        count=1,
        launchType='FARGATE',
        networkConfiguration={
            'awsvpcConfiguration': {
                'subnets': [
                    'subnet-ebce7c8c',
                ],
                'securityGroups': [
                    'sg-03bb63bf7b3389d42',
                ],
                'assignPublicIp': 'DISABLED'
            }
        },
    )
    print(response)

我已将Lambda的IAM角色赋予ECSFull政策。在我这样做之前,我得到了运行run_task时拒绝的预期权限。但是一旦我添加了该策略,Lambda就可以正常运行了,没有报告任何错误,这就是我从那行print(response)行得到的响应:

{'tasks': [{'taskArn': 'arn:aws:ecs:us-east-1:221691463461:task/10b2473f-482d-4f75-ab43-3980f6995b17', 'clusterArn': 'arn:aws:ecs:us-east-1:221691463461:cluster/HowMuchSnow', 'taskDefinitionArn': 'arn:aws:ecs:us-east-1:221691463461:task-definition/HowMuchSnow:2', 'overrides': {'containerOverrides': [{'name': 'HowMuchSnow'}]}, 'lastStatus': 'PROVISIONING', 'desiredStatus': 'RUNNING', 'cpu': '256', 'memory': '512', 'containers': [{'containerArn': 'arn:aws:ecs:us-east-1:221691463461:container/9a76562b-1fef-457f-ae04-0f0eb4003e7b', 'taskArn': 'arn:aws:ecs:us-east-1:221691463461:task/10b2473f-482d-4f75-ab43-3980f6995b17', 'name': 'HowMuchSnow', 'lastStatus': 'PENDING', 'networkInterfaces': []}], 'version': 1, 'createdAt': datetime.datetime(2019, 6, 17, 14, 57, 29, 831000, tzinfo=tzlocal()), 'group': 'family:HowMuchSnow', 'launchType': 'FARGATE', 'platformVersion': '1.3.0', 'attachments': [{'id': 'e6ec4941-9e91-47d1-adff-d406f28b1931', 'type': 'ElasticNetworkInterface', 'status': 'PRECREATED', 'details': [{'name': 'subnetId', 'value': 'subnet-ebce7c8c'}]}]}], 'failures': [], 'ResponseMetadata': {'RequestId': '3a2506ef-9110-11e9-b57a-d7e334b6f5f7', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '3a2506ef-9110-11e9-b57a-d7e334b6f5f7', 'content-type': 'application/x-amz-json-1.1', 'content-length': '1026', 'date': 'Mon, 17 Jun 2019 14:57:29 GMT'}, 'RetryAttempts': 0}}

在我看来,这看起来还不错。但是任务从未真正运行过。我确实在群集的ECS控制台的任务列表中看到了一个暂挂的任务。但是它的运行时间不及实际任务的运行时间。像我手动运行时一样,它在CloudWatch中不会生成任何日志。我也没有在日志中看到错误。

我要注意的一件事是,从控制台手动运行任务时,我必须选择一个VPC,但这不是boto3的ECS run_task函数的有效参数,因此我不会通过它。

任何人都知道哪里出了问题或在哪里寻找信息?

2 个答案:

答案 0 :(得分:1)

这对我有用。

设置Lambda时:

  • 角色必须具有ECS运行任务能力
  • 请勿在Lambda函数设置本身中指定VPC

这是Lambda代码(替换您自己的子网,安全组等)。

import boto3

client = boto3.client('ecs')

cluster_name = "demo-cluster"
task_definition = "demo-task:1"

def lambda_handler(event, context):
    try:

        response = client.run_task(
            cluster=cluster_name,
            launchType = 'FARGATE',
            taskDefinition=task_definition,
            count = 1,
            platformVersion='LATEST',
            networkConfiguration={
                'awsvpcConfiguration': {
                    'subnets': [
                        'subnet-0r6gh701', 
                        'subnet-a73d7c10'
                    ],
                    'securityGroups': [
                        "sg-54cb123f",
                    ],
                    'assignPublicIp': 'ENABLED'
                }
            })

        print(response)

        return {
            'statusCode': 200,
            'body': "OK"
        }
    except Exception as e:
        print(e)

        return {
            'statusCode': 500,
            'body': str(e)
        }    

答案 1 :(得分:0)

我遇到了这个问题,结果发现我在调试过程中在Dockerfile末尾注释了CMD行。这样就运行了lambda,但未记录任何ECS任务。取消对CMD的注释会导致ECS任务运行并再次记录。