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

相关推荐
zhuyixiangyyds7 小时前
day21和day22学习Pandas库
笔记·学习·pandas
每次的天空7 小时前
Android学习总结之算法篇四(字符串)
android·学习·算法
jingjingjing11118 小时前
笔记:docker安装(ubuntu 20.04)
笔记·docker·容器
背影疾风8 小时前
C++学习之路:指针基础
c++·学习
DreamBoy@8 小时前
【408--考研复习笔记】操作系统----知识点速览
笔记
UpUpUp……9 小时前
特殊类的设计/单例模式
开发语言·c++·笔记·单例模式
苏克贝塔9 小时前
CMake学习--Window下VSCode 中 CMake C++ 代码调试操作方法
c++·vscode·学习
odoo中国10 小时前
深度学习 Deep Learning 第15章 表示学习
人工智能·深度学习·学习·表示学习
电星托马斯10 小时前
C++中顺序容器vector、list和deque的使用方法
linux·c语言·c++·windows·笔记·学习·程序人生
清晨朝暮10 小时前
【算法学习计划】贪心算法(下)
学习