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
的时候需要的权限
{"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
执行需要,所以需要建立信任关系。{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Service": "lambda.amazonaws.com"},"Action": "sts:AssumeRole"}] }
- 开始创建
lambda
函数
权限这里执行lambda-role
,来给lambda
函数赋予执行权限。
- 成功创建
lambda
函数
lambda
函数的实例程序代码import os import boto3 import loggingDEFAULT_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_tagsdef 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
- 作成一个