当 lambda 在 vpc 中时,无法 运行 来自 lambda 的 fargate 任务
Not able to run fargate task from lambda when lambda is in a vpc
所以问题是 lambda 需要能够从 vpc 中的数据库读取并启动 ecs fargate 任务。但是,如果 lambda 在 vpc 中,那么它不会自行启动任务,而是 lambda 超时。
import json
import boto3
client = boto3.client('ecs')
cluster_name = 'as-dev'
task_name = 'as-dev:2'
def lambda_handler(event, context):
# TODO implement
try:
response = client.run_task(
cluster=cluster_name,
launchType = 'FARGATE',
taskDefinition=task_name,
count = 1,
platformVersion='LATEST',
networkConfiguration={
'awsvpcConfiguration': {
'subnets': [
'subnet-12345ab12345'
],
'securityGroups': [
'sg-123451234sasdqwe'
],
'assignPublicIp': 'ENABLED'
}
}
)
print(response)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
except Exception as e:
print(e)
return {
'statusCode': 500,
'body': str(e)
}
(由于显而易见的原因更改了配置)
如果 运行 作为 ec2 上的一个简单 python 程序,代码可以正常工作。只有当 vpc 添加到 lambda 时,它才会停止工作并超时。
默认情况下,VPC 中的 lambda 函数无法访问互联网。启用访问的一种流行方法是使用 NAT 网关并将您的 lambda 放在 私有子网 中,如以下所述:
替代方案是对 ECS 使用 VPC interface endpoints。一旦你正确地设置它们,你就不需要使用互联网了。相反,您的函数将使用端点私下访问 ECS。
所以问题是 lambda 需要能够从 vpc 中的数据库读取并启动 ecs fargate 任务。但是,如果 lambda 在 vpc 中,那么它不会自行启动任务,而是 lambda 超时。
import json
import boto3
client = boto3.client('ecs')
cluster_name = 'as-dev'
task_name = 'as-dev:2'
def lambda_handler(event, context):
# TODO implement
try:
response = client.run_task(
cluster=cluster_name,
launchType = 'FARGATE',
taskDefinition=task_name,
count = 1,
platformVersion='LATEST',
networkConfiguration={
'awsvpcConfiguration': {
'subnets': [
'subnet-12345ab12345'
],
'securityGroups': [
'sg-123451234sasdqwe'
],
'assignPublicIp': 'ENABLED'
}
}
)
print(response)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
except Exception as e:
print(e)
return {
'statusCode': 500,
'body': str(e)
}
(由于显而易见的原因更改了配置)
如果 运行 作为 ec2 上的一个简单 python 程序,代码可以正常工作。只有当 vpc 添加到 lambda 时,它才会停止工作并超时。
默认情况下,VPC 中的 lambda 函数无法访问互联网。启用访问的一种流行方法是使用 NAT 网关并将您的 lambda 放在 私有子网 中,如以下所述:
替代方案是对 ECS 使用 VPC interface endpoints。一旦你正确地设置它们,你就不需要使用互联网了。相反,您的函数将使用端点私下访问 ECS。