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

相关推荐
程序员大雄学编程1 小时前
「机器学习笔记7」决策树学习:从理论到实践的全面解析(上)
笔记·决策树·机器学习
larry_dongy1 小时前
【学习记录】vscode+ros2+cpp调试
vscode·学习
递归不收敛2 小时前
吴恩达机器学习课程(PyTorch适配)学习笔记:1.5 决策树与集成学习
pytorch·学习·机器学习
菜鸟‍2 小时前
【论文学习】2025年图像处理顶会论文
图像处理·人工智能·学习
Logintern092 小时前
【学习篇】Redis 分布式锁
redis·分布式·学习
聪明的笨猪猪2 小时前
Java Spring “Bean” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
A9better2 小时前
嵌入式开发学习日志38——stm32之看门狗
stm32·嵌入式硬件·学习
bnsarocket3 小时前
Verilog和FPGA的自学笔记3——仿真文件Testbench的编写
笔记·fpga开发·verilog·自学
丰锋ff3 小时前
2025 年真题配套词汇单词笔记(考研真相)
笔记·考研
Vizio<5 小时前
《基于 ERT 的稀疏电极机器人皮肤技术》ICRA2020论文解析
论文阅读·人工智能·学习·机器人·触觉传感器