aws(学习笔记第二十一课)
- 开发
lambda
应用程序
学习内容:
lambda
的整体概念- 开发
lambda
应用程序
1. lambda
的整体概念
借助AWS Lambda
,无需预置或管理服务器即可运行代码。只需为使用的计算时间付费。借助 Lambda
,可以为几乎任何类型的应用进程或后端服务运行代码 - 所有这些都无需管理。上传代码后,Lambda 会处理运行和扩展具有高可用性的代码所需的一切。您可以将代码设置为从其他 AWS 服务自动触发,或直接从任何 Web 或移动应用进程调用。
lambda
的使用方式- 作为事件驱动的计算资源时,Lambda 可以响应事件时运行代码
- 作为计算服务时,可以响应
API Gateway
或者API
调用的HTTP
请求时运行代码
- 作为事件驱动的计算资源时,Lambda 可以响应事件时运行代码
2. 开发lambda
应用程序
- 开发第一个
lambda
应用程序hello,world
- 创建函数
选择nodejs
平台执行。
- 为了权限,设定
role
- 测试
点击测试
按钮,执行测试。
- 创建函数
- 开发另一个
lambda
应用程序,使用tag
过滤对EC2
进行开启和停止控制-
作成一个
EC2
,作为lambda
函数控制的目标
-
为了执行权限,通过赋予给
lambda
特定的role
-
role
的策略
这里有两个权限,- 一个是
logs
的权限,主要是输出lambda
的log
需要的权限。这个是lambda
的必须策略 - 另一个是
ec2
,主要是控制ec2
的时候需要的权限
json{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "ec2:DescribeInstances", "ec2:Start*", "ec2:Stop*", "ec2:DescribeInstanceStatus" ], "Resource": "*" } ] }
- 一个是
-
-
role
的信任关系
因为这个role
需要给lambda
执行需要,所以需要建立信任关系。json{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
-
开始创建
lambda
函数
权限这里执行lambda-role
,来给lambda
函数赋予执行权限。
-
成功创建
lambda
函数
-
lambda
函数的实例程序代码pythonimport os import boto3 import logging DEFAULT_TAGS = os.environ.get("DEFAULT_TAGS") print("DEFAULT_TAGS", DEFAULT_TAGS) logger = logging.getLogger() level = logging.getLevelName(os.environ.get("LOG_LEVEL", "INFO")) print("Logging level -- ", level) logger.setLevel(level) ec2_resource = boto3.resource('ec2') ec2_client = boto3.client('ec2') def lambda_handler(event, context): """ Function that start and stop ec2 instances schedule and with specific tags<br/> :param event: Input event, that should contain action and tags parameters, where tags is a list of comma separates key/value tags.<br/> :param context: Lambda context.<br/> :return: nothing """ logger.debug(event) print("event -- ", event) tags = get_tags(event['tags'] if 'tags' in event else DEFAULT_TAGS) print("tags -- ", tags) instances = get_instances_by_tags(tags) if not instances: logger.warning('No instances available with this tags') else: if event['action'] == 'start': ec2_client.start_instances(InstanceIds=instances) logger.info('Starting instances.') elif event['action'] == 'stop': ec2_client.stop_instances(InstanceIds=instances) logger.info('Stopping instances.') else: logger.warning('No instances availables with this tags') def get_tags(tags): """ Method that split comma separated tags and return a formed tags filter<br/> :param tags: Comma separated string with the tags values.<br/> :return: tags structure """ final_tags = [] split_tags = tags.split(",") for tag in split_tags: values = tag.split('=') final_tags.append({ 'Name': values[0], 'Values': [values[1]] }) return final_tags def get_instances_by_tags(tags): """ Method that filter all ec2 instances and return only the instances with specific tags<br/> :param tags: Filter structure with tag values.<br/> :return: list of ec2 instances """ response = ec2_resource.instances.filter(Filters=tags) print("Response -- ", response) for instance in response: print("Instance -- ", instance) intance_ids = [instance.id for instance in response] print("intance_ids -- ", intance_ids) return intance_ids
-
点击
deploy
对函数的代码进行部署
可以看出这里是一个vscode
风格的在线代码编辑器
-
对
lambda
函数进行环境变量的设定- 代码中使用`DEFAULT_TAGS = os.environ.get("DEFAULT_TAGS")得到环境变量,所以这里需要定义
tag:Name:lambda-ec2
是标准的aws
定义tag
的方式
-
回到
lambda
的测试,编辑event
参数
-
进行测试
-
检查
ec2
的状态
-
检查
CloudWatch
,可以看到lambda
函数的log
-