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 分钟前
MySQL异步连接池的学习(五)
学习·mysql
知识分享小能手13 分钟前
Vue3 学习教程,从入门到精通,Axios 在 Vue 3 中的使用指南(37)
前端·javascript·vue.js·学习·typescript·vue·vue3
所愿ღ1 小时前
JavaWeb-Servlet基础
笔记·servlet
岑梓铭2 小时前
考研408《计算机组成原理》复习笔记,第五章(2)——CPU指令执行过程
笔记·考研·408·计算机组成原理·计组
焄塰5 小时前
Ansible 管理变量和事实
学习·centos·ansible
oe10196 小时前
读From GPT-2 to gpt-oss: Analyzing the Architectural Advances(续)
笔记·gpt·学习
Include everything9 小时前
Rust学习笔记(三)|所有权机制 Ownership
笔记·学习·rust
杜子不疼.9 小时前
《Python学习之文件操作:从入门到精通》
数据库·python·学习
★YUI★9 小时前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
livemetee10 小时前
Flink2.0学习笔记:Flink服务器搭建与flink作业提交
大数据·笔记·学习·flink