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
  
 
- 作成一个