aws(学习笔记第二十四课) 使用sam开发step functions

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

  • 使用sam开发step functions

学习内容:

  • 生成samstep functions实例程序
  • 什么是SAM amazon Serverless Application Model
  • SAM程序结构
  • SAM执行程序

1. 生成samstep functions实例程序

  1. 参照文档
    这里参照AWS的官方文档SAM amazon Serverless Application Model
  2. 什么是SAM amazon Serverless Application Model
    • 整体架构
      SAM就是一个基于Cloudformation的应用程序框架,主要目的正如名字(Serverless Application Model),方便进行Serverless Application的开发。
      开发的一般步骤如下:
      • 开发lambdaserverless application
      • 利用step functionsserverless application。当然,其中可以调用lambda
      • 之后利用上面的serverless application,进行Cloudformationtemplate定义。
      • 最后经过sam buildsam deploy部署到AWS的环境中。

3. SAM程序结构

  1. 开始使用SAM
    • 这里使用SAM提供的实例程序进行练习

      • HourlyTradingSchedule是一个AWS EventBridge的规则,这里定义了股票投资程序的调用周期。类似于linuxcron job
      • StockTradingStateMachine就是股票交易的StateMachine
      • 股票交易的StateMachine里面包括三个lambda
        • StockCheckerFunction这里随机产生股票的价格(进行简单的股票市场的模拟)
        • 中间其实有一个choice state,进行判断。这里没有画出来
        • 之后根据判断,如果股票高过某个固定价格,那么进行StockBuyerFunction的调用
        • 如果股票高过某个固定价格,那么进行StockSellerFunction的调用
        • 最后,不管买还是卖的操作,都进行TransactionTable的写入(使用DynamoDB记录交易)
    • 进行实际代码的实验

      • 实验环境
        这里还是使用非常给力的工具CloudShell
      • 构建代码
        • 创建代码的父路径

          shell 复制代码
          mkdir demo-sam
          cd demo-sam
        • 使用sam生成股票实例代码(这个代码是sam自带的)

          之后进行一些runtime的相关设定。

          到这里,代码就会被生成出来,而且cloudformationtemplate文件都是yaml格式的。

    • cloudshell环境中的代码通过S3取到本地

      • 创建传输文件的S3 bucket
        因为cloudshell不是很容易和本地传输文件,所以使用S3 bucket

      • SAM代码打包,copyS3 bucket

        shell 复制代码
        tar zcvf demo-sam.tar.gz demo-sam/
        aws s3 cp demo-sam.tar.gz s3://finlay-cloudshell/
      • SAM init生成的实例程序代码,下载到本地

        本地文件夹如下所示。

      • SAM init生成的实例程序代码使用vscode打开(这里单纯的可以更加容易编辑代码)

        • template文件

          yaml 复制代码
          AWSTemplateFormatVersion: '2010-09-09'
          Transform: AWS::Serverless-2016-10-31
          Description: |
            demo-sam
            Sample SAM Template for demo-sam
          
          Resources:
            StockTradingStateMachine:
              Type: AWS::Serverless::StateMachine # More info about State Machine Resource: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-statemachine.html
              Properties:
                DefinitionSubstitutions:
                  StockCheckerFunctionArn: !GetAtt StockCheckerFunction.Arn
                  StockSellerFunctionArn: !GetAtt StockSellerFunction.Arn
                  StockBuyerFunctionArn: !GetAtt StockBuyerFunction.Arn
                  DDBPutItem: !Sub arn:${AWS::Partition}:states:::dynamodb:putItem
                  DDBTable: !Ref TransactionTable
                Events:
                  HourlyTradingSchedule:
                    Type: Schedule # More info about Schedule Event Source: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-statemachine-schedule.html
                    Properties:
                      Description: Schedule to run the stock trading state machine every hour
                      Enabled: false # This schedule is disabled by default to avoid incurring charges.
                      Schedule: rate(1 hour)
                Policies:
                  # Find out more about SAM policy templates: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-policy-templates.html
                  - LambdaInvokePolicy:
                      FunctionName: !Ref StockCheckerFunction
                  - LambdaInvokePolicy:
                      FunctionName: !Ref StockSellerFunction
                  - LambdaInvokePolicy:
                      FunctionName: !Ref StockBuyerFunction
                  - DynamoDBWritePolicy:
                      TableName: !Ref TransactionTable
                DefinitionUri: statemachine/stock_trader.asl.json
          
            StockCheckerFunction:
              Type: AWS::Serverless::Function # More info about Function Resource: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html
              Properties:
                CodeUri: functions/stock_checker/
                Handler: app.lambda_handler
                Runtime: python3.9
                Architectures:
                  - x86_64
          
            StockSellerFunction:
              Type: AWS::Serverless::Function
              Properties:
                CodeUri: functions/stock_seller/
                Handler: app.lambda_handler
                Runtime: python3.9
                Architectures:
                  - x86_64
          
            StockBuyerFunction:
              Type: AWS::Serverless::Function
              Properties:
                CodeUri: functions/stock_buyer/
                Handler: app.lambda_handler
                Runtime: python3.9
                Architectures:
                  - x86_64
          
            TransactionTable:
              Type: AWS::Serverless::SimpleTable # More info about SimpleTable Resource: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-simpletable.html
              Properties:
                PrimaryKey:
                  Name: Id
                  Type: String
                ProvisionedThroughput:
                  ReadCapacityUnits: 1
                  WriteCapacityUnits: 1
          
            ApplicationResourceGroup:
              Type: AWS::ResourceGroups::Group
              Properties:
                Name: !Sub ApplicationInsights-SAM-${AWS::StackName}
                ResourceQuery:
                  Type: CLOUDFORMATION_STACK_1_0
            ApplicationInsightsMonitoring:
              Type: AWS::ApplicationInsights::Application
              Properties:
                ResourceGroupName: !Ref ApplicationResourceGroup
                AutoConfigurationEnabled: 'true'
          Outputs:
            # StockTradingStateMachineHourlyTradingSchedule is an implicit Schedule event rule created out of Events key under Serverless::StateMachine
            # Find out more about other implicit resources you can reference within SAM
            # https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-specification-generated-resources.html
            StockTradingStateMachineArn:
              Description: Stock Trading State machine ARN
              Value: !Ref StockTradingStateMachine
            StockTradingStateMachineRoleArn:
              Description: IAM Role created for Stock Trading State machine based on the
                specified SAM Policy Templates
              Value: !GetAtt StockTradingStateMachineRole.Arn

          使用vscode打开template文件,可以看到AWS service的图形化结构。

        • stock_checker文件 随机产生stock的价格

          python 复制代码
          from random import randint
          
          
          def lambda_handler(event, context):
              """Sample Lambda function which mocks the operation of checking the current price 
              of a stock.
          
              For demonstration purposes this Lambda function simply returns 
              a random integer between 0 and 100 as the stock price.
          
              Parameters
              ----------
              event: dict, required
                  Input event to the Lambda function
          
              context: object, required
                  Lambda Context runtime methods and attributes
          
              Returns
              ------
                  dict: Object containing the current price of the stock
              """
              # Check current price of the stock
              stock_price = randint(
                  0, 100
              )  # Current stock price is mocked as a random integer between 0 and 100
              return {"stock_price": stock_price}
        • stock_buyer文件 如果价格低,选择买进

          python 复制代码
          from datetime import datetime
          from random import randint
          from uuid import uuid4
          
          
          def lambda_handler(event, context):
              """Sample Lambda function which mocks the operation of buying a random number
              of shares for a stock.
          
              For demonstration purposes, this Lambda function does not actually perform any 
              actual transactions. It simply returns a mocked result.
          
              Parameters
              ----------
              event: dict, required
                  Input event to the Lambda function
          
              context: object, required
                  Lambda Context runtime methods and attributes
          
              Returns
              ------
                  dict: Object containing details of the stock buying transaction
              """
              # Get the price of the stock provided as input
              stock_price = event["stock_price"]
              # Mocked result of a stock buying transaction
              transaction_result = {
                  "id": str(uuid4()),  # Unique ID for the transaction
                  "price": str(stock_price),  # Price of each share
                  "type": "buy",  # Type of transaction (buy/sell)
                  "qty": str(
                      randint(1, 10)
                  ),  # Number of shares bought/sold (We are mocking this as a random integer between 1 and 10)
                  "timestamp": datetime.now().isoformat(),  # Timestamp of the when the transaction was completed
              }
              return transaction_result
        • stock_seller文件 如果价格高,选择抛出

          python 复制代码
          from datetime import datetime
          from random import randint
          from uuid import uuid4
          
          
          def lambda_handler(event, context):
              """Sample Lambda function which mocks the operation of selling a random number
              of shares for a stock.
          
              For demonstration purposes, this Lambda function does not actually perform any 
              actual transactions. It simply returns a mocked result.
          
              Parameters
              ----------
              event: dict, required
                  Input event to the Lambda function
          
              context: object, required
                  Lambda Context runtime methods and attributes
          
              Returns
              ------
                  dict: Object containing details of the stock selling transaction
              """
              # Get the price of the stock provided as input
              stock_price = event["stock_price"]
              # Mocked result of a stock selling transaction
              transaction_result = {
                  "id": str(uuid4()),  # Unique ID for the transaction
                  "price": str(stock_price),  # Price of each share
                  "type": "sell",  # Type of transaction (buy/sell)
                  "qty": str(
                      randint(1, 10)
                  ),  # Number of shares bought/sold (We are mocking this as a random integer between 1 and 10)
                  "timestamp": datetime.now().isoformat(),  # Timestamp of the when the transaction was completed
              }
              return transaction_result
        • step functions文件 将上面的lambda函数穿插起来,形成一个工作流程编排

          json 复制代码
          {
              "Comment": "A state machine that does mock stock trading.",
              "StartAt": "Check Stock Value",
              "States": {
                  "Check Stock Value": {
                      "Type": "Task",
                      "Resource": "${StockCheckerFunctionArn}",
                      "Retry": [
                          {
                              "ErrorEquals": [
                                  "States.TaskFailed"
                              ],
                              "IntervalSeconds": 15,
                              "MaxAttempts": 5,
                              "BackoffRate": 1.5
                          }
                      ],
                      "Next": "Buy or Sell?"
                  },
                  "Buy or Sell?": {
                      "Type": "Choice",
                      "Choices": [
                          {
                              "Variable": "$.stock_price",
                              "NumericLessThanEquals": 50,
                              "Next": "Buy Stock"
                          }
                      ],
                      "Default": "Sell Stock"
                  },
                  "Sell Stock": {
                      "Type": "Task",
                      "Resource": "${StockSellerFunctionArn}",
                      "Retry": [
                          {
                              "ErrorEquals": [
                                  "States.TaskFailed"
                              ],
                              "IntervalSeconds": 2,
                              "MaxAttempts": 3,
                              "BackoffRate": 1
                          }
                      ],
                      "Next": "Record Transaction"
                  },
                  "Buy Stock": {
                      "Type": "Task",
                      "Resource": "${StockBuyerFunctionArn}",
                      "Retry": [
                          {
                              "ErrorEquals": [
                                  "States.TaskFailed"
                              ],
                              "IntervalSeconds": 2,
                              "MaxAttempts": 3,
                              "BackoffRate": 1
                          }
                      ],
                      "Next": "Record Transaction"
                  },
                  "Record Transaction": {
                      "Type": "Task",
                      "Resource": "${DDBPutItem}",
                      "Parameters": {
                          "TableName": "${DDBTable}",
                          "Item": {
                              "Id": {
                                  "S.$": "$.id"
                              },
                              "Type": {
                                  "S.$": "$.type"
                              },
                              "Price": {
                                  "N.$": "$.price"
                              },
                              "Quantity": {
                                  "N.$": "$.qty"
                              },
                              "Timestamp": {
                                  "S.$": "$.timestamp"
                              }
                          }
                      },
                      "Retry": [
                          {
                              "ErrorEquals": [
                                  "States.TaskFailed"
                              ],
                              "IntervalSeconds": 20,
                              "MaxAttempts": 5,
                              "BackoffRate": 10
                          }
                      ],
                      "End": true
                  }
              }
          }

        检查vscodesam预览功能

    • 回到cloudshell执行sam buildsam deploy部署到AWS

      shell 复制代码
      sam build
      sam deploy

      可以看到,本质上这个sam application还是使用Cloudformation进行部署。

      查看Cloudformation进一步验证了想定结果。

4. 执行samstep functions实例程序

  1. 打开默认的aws eventbridge的规则设置

    默认是禁用的,编辑这里,打开禁用。

  2. 查看执行结果

    可以看出,已经成功执行一次

    股票价格为2,执行了buy stock lambda

相关推荐
多多*1 小时前
初识JVM HotSopt 的发展历程
java·开发语言·jvm·c++·学习·算法
m0_dawn1 小时前
(蓝桥杯)二维数组前缀和典型例题——子矩阵求和
python·学习·算法·职场和发展·蓝桥杯
zhxueverme1 小时前
操作系统八股文学习笔记
笔记·学习
广东数字化转型1 小时前
FFmpeg开发笔记(七)欧拉系统编译安装FFmpeg
笔记·ffmpeg
xwz小王子2 小时前
斯坦福大学李飞飞教授团队ARCap: 利用增强现实反馈收集高质量的人类示教以用于机器人学习
学习·机器人·ar
垂杨有暮鸦⊙_⊙2 小时前
有限元分析学习——Anasys Workbanch第一阶段笔记(9)带孔矩形板与L型支架案例的对称平面处理方案
笔记·学习·有限元分析
灵性(๑>ڡ<)☆2 小时前
Vue3学习-day4
前端·vue.js·学习
StudyWinter2 小时前
【OpenCV(C++)快速入门】--opencv学习
c++·学习·计算机视觉·openev
梳子烟YAN2 小时前
UML系列之Rational Rose笔记八:类图
笔记·uml