Lambda与ALB集成

Lambda能挂在ALB后面,当作ALB的target group, Lambda返回HTTP响应给ALB:

image-20220308120543513

本节我们将创建一个Lambda和ALB,并将Lambda绑在ALB上面进行测试

创建Lambda

进入Lambda页面,创建新的函数。命名为lambda-alb, 运行环境选择Python 3.7:

image-20220308175530430

其他选项保持默认,进行创建。

创建ALB

进入EC2的Load Balancer页面,创建ALB:

image-20220308175628982

为ALB命名为alb-for-lambda:

image-20220308175707662

VPC保持默认,选择两个或多个子网:

image-20220308175749097

创建新的安全组,在安全组里将放行80和443端口的流量:

image-20220308180854129

在新的页面里,输入安全组的名称:

image-20220308180836394

放通80和443端口:

image-20220308180748148

创建完成后,回到ALB页面,刷新安全组,使用刚才创建的安全组。


在target group选项,选择创建新的target group:

image-20220308181315062

在新的页面,选择使用Lambda Function

image-20220308181458230

为target group命名,例如lambda-target-group,然后进入下一步:

image-20220308181522971

选择使用上一步创建的lambda:

image-20220308181545883

点击创建,状态变为Active时,可以进行访问

image-20220308182058449

测试

在浏览器访问上一步创建ALB的url。

它会下载为download文件,里面是lambda的返回结果:

image-20220308182115059

下载成文件,这显然不符合预期

需要使用专用的返回格式(参考: https://docs.aws.amazon.com/lambda/latest/dg/services-alb.html ):

{
    "statusCode": 200,
    "statusDescription": "200 OK",
    "isBase64Encoded": False,
    "headers": {
        "Content-Type": "text/html"
    },
    "body": "<h1>Hello from Lambda!</h1>"
}

image-20220308120717249

修改Lambda代码,并进行部署:

image-20220308182217274

重新访问ALB地址:

image-20220308182231072

ALB传参

用户在访问ALB URL时,可能会携带一些参数,例如query string, post body, user-agent等,这些都可以由ALB传给Lambda的event参数:

修改Lambda代码为:

import json

def lambda_handler(event, context):
    # TODO implement
    return {
    "statusCode": 200,
    "statusDescription": "200 OK",
    "isBase64Encoded": False,
    "headers": {
        "Content-Type": "application/json"
    }, 
    "body": json.dumps(event)  # 将event返回给ALB
}

访问ALB地址,并加入一些测试的query string,可以看到ALB传给Lambda的event具体内容:

image-20220308184619248

具体的字段说明如下:

image-20220308120628560

附: Multi-Header传值

ALB支持Multi-header传值,当在浏览器对于同一个参数传入多个值时,ALB传给Lambda时会将其转换为数组:

image-20220308185015012

默认Multi-value header在target group中是关闭的,需要单独开启:

image-20220308185324618

权限控制

为了让target group能够访问Lambda,Lambda必须要给我们创建的target group授权才能进行调用。

其实这一步已经帮我们自动实现,在target group创建时,会在Lambda中同时创建一条Resource-based policy

我们可以进入Lambda的Configuration => Permission页面进行确认:

image-20220308190146616

下拉后会发现Lambda有一条Resource-based policy:

image-20220308190154902

在这条policy里,声明了Lambda允许对应的target group来调用它:

image-20220308190232518


参考: https://docs.aws.amazon.com/lambda/latest/dg/services-alb.html