[英]How can I run an AWS ECS Task and then run a Lambda function after its ready then finally stop the Task?
[英]Why can't I run my ECS task from AWS Lambda?
我正在使用 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 函数的有效参数,因此我没有传递它。
任何人都知道可能出了什么问题或我可以在哪里寻找信息?
这对我有用。
设置 Lambda 时:
这是 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)
}
我遇到了这个问题,结果我在调试期间注释掉了 Dockerfile 末尾的 CMD 行。 因此,lambda 运行了,但没有记录 ECS 任务。 取消注释 CMD 会导致 ECS 任务再次运行和记录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.