aws(学习笔记第二十一课) 开发lambda应用程序

aws(学习笔记第二十一课)

  • 开发lambda应用程序

学习内容:

  • lambda的整体概念
  • 开发lambda应用程序

1. lambda的整体概念

借助AWS Lambda,无需预置或管理服务器即可运行代码。只需为使用的计算时间付费。借助 Lambda,可以为几乎任何类型的应用进程或后端服务运行代码 - 所有这些都无需管理。上传代码后,Lambda 会处理运行和扩展具有高可用性的代码所需的一切。您可以将代码设置为从其他 AWS 服务自动触发,或直接从任何 Web 或移动应用进程调用。

  • lambda的使用方式
    • 作为事件驱动的计算资源时,Lambda 可以响应事件时运行代码
    • 作为计算服务时,可以响应API Gateway或者API调用的HTTP请求时运行代码

2. 开发lambda应用程序

  1. 开发第一个lambda应用程序hello,world
    • 创建函数
      选择nodejs平台执行。
    • 为了权限,设定role
    • 测试

      点击测试按钮,执行测试。
  2. 开发另一个lambda应用程序,使用tag过滤对EC2进行开启和停止控制
    • 作成一个EC2,作为lambda函数控制的目标

    • 为了执行权限,通过赋予给lambda特定的role

      • role的策略
        这里有两个权限,

        • 一个是logs的权限,主要是输出lambdalog需要的权限。这个是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函数的实例程序代码

      python 复制代码
      import 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

相关推荐
龙湾开发11 分钟前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(一)过程式凹凸贴图
c++·笔记·学习·3d·图形渲染
自学互联网1 小时前
系统集成项目管理工程师学习笔记
笔记·学习
charlie1145141911 小时前
基于Qt6 + MuPDF在 Arm IMX6ULL运行的PDF浏览器——MuPDF Adapter文档
arm开发·qt·学习·pdf·教程·设计·qt6
HappyAcmen2 小时前
线代第二章矩阵第九、十节:初等变换、矩阵的标准形、阶梯形与行最简阶梯形、初等矩阵
笔记·学习·线性代数·矩阵
lil44x_2 小时前
嵌入式学习笔记DAY21(双向链表、Makefile)
笔记·学习
hello1114-3 小时前
Redis学习打卡-Day2-缓存更新策略、主动更新策略、缓存穿透、缓存雪崩、缓存击穿
java·redis·学习·缓存·javaweb
天宫风子4 小时前
抽象代数小述(二之前)
经验分享·笔记·算法·生活·抽象代数
岑梓铭4 小时前
考研408《计算机组成原理》复习笔记,第二章(2)数值数据的表示(浮点数篇)
笔记·考研·408·计算机组成原理
小虎卫远程打卡app4 小时前
视频编解码学习十二之Android疑点
学习·视频编解码
岁岁岁平安5 小时前
Vue3学习(组合式API——reactive()和ref()函数详解)
前端·javascript·vue.js·学习·vue3·reactive·ref