如何在 AWS Lambda 上的无服务器应用程序中存储和使用 HTML 模板(使用 AWS SAM)?



而不是

  • (A( 遵循在 AWS 上运行 Web 应用程序的更传统路线(例如,在 AWS EC2 或 Beanstalk 上使用 Ruby/Sinatra 或 Python/Flask(,或

  • (C( 在 S3 中创建静态 HTML 和 JavaScript 文件,在 AWS Lambda 中创建动态 API 终端节点(将 JSON 数据发送到通过 JavaScript 使用/解释该数据的静态网页(,

我想达成一个中间立场:

  • (B( 在 AWS Lambda 中创建 HTTP 终端节点(例如,在 Python 中(,这些终端节点读取和使用 HTML 模板来生成对客户端的完整 HTML 响应。

这种设置将导致一个无服务器 Web 应用程序,其中 AWS Lambda 函数提供服务器端(具有讽刺意味的是,我并没有丢失(生成的 HTML 输出。

在 AWS Lambda 函数的 Python 代码中,可以包含 HTML 代码片段,在函数中修改该代码片段(用数据填充(,然后将 HTML 作为text/html输出返回到客户端。这种方法的缺点是HTML模板被"嵌入"在Python代码中,而不是外部的单独文件中。

Q1:如何引用代码包中某处的 HTML 模板文件 - 模板应该是包的一部分 - 让 Python 函数读取该文件,并通过模板中的变量替换生成 HMTL 页面?

Q2: 如何使用 AWS 无服务器应用程序模型 (AWS SAM( 在我的项目中指定/包含/链接到一组 HTML 模板文件?

我不确定你从哪里开始,所以我会从头开始。

  1. 创建引用处理程序和事件资源的 YAML 配置文件,并将其放入deployment文件夹中。

  2. 对于 Templating,请使用 "Mustashe for Python" pystashe。

  3. 在 Python 项目/Virtualenv 中创建参数化 HTML 模板:

    <html>
    <head>
    <title>Customer: {{name}}</title>
    </head>
    <body>
    <div>
    <h2>Customer Name: {{name}}</h2> 
    <h4>Phone Number: {{phone}}</h4>
    </div>
    </body>
    </html>
    
  4. 创建data对象以填充参数化模板:

    {
    "name": "Tom Thumb",
    "phone": "0123456789"
    }
    
  5. 从项目中的位置加载template

    template = file('%s/mypath/template.html'%py_root).read()
    
  6. 从数据对象呈现页面:

    myhtml = pystache.render(template, data)
    
  7. 将呈现的 html 返回给客户端:

    response = {
    "statusCode": 200,
    "body": myhtml,
    "headers": {
    'Content-Type': 'text/html',
    }
    }
    
  8. 压缩 python 代码、站点包和 html 文件,并放入deployment文件夹中。

  9. deployment文件夹中打包 SAM 项目,该项目将准备并上传到 S3:

    aws cloudformation package --template-file myservice.yml --output-template-file deploy-myservice.yml --s3-bucket myserverless-deploy
    
  10. deployment文件夹中,将 SAM 项目部署到 AWS:

    aws cloudformation deploy --template-file deploy-myservice.yml --stack-name mycontext-myservice-dev --capabilities CAPABILITY_IAM
    

为了记录,我更喜欢选项C,带有NodeJS... :)

最新更新