【问题标题】:How to store and use HTML templates in serverless application on AWS Lambda (using AWS SAM)?如何在 AWS Lambda 上的无服务器应用程序中存储和使用 HTML 模板(使用 AWS SAM)?
【发布时间】:2019-03-26 06:46:30
【问题描述】:

代替

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

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

我想达到一个中间地带:

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

该设置将生成一个无服务器 Web 应用程序,其中 AWS Lambda 函数提供服务器端(讽刺的是我没有忘记)生成的 HTML 输出。

在 AWS Lambda 函数的 Python 代码中,可以包含 HTML 代码 sn-ps,在函数中修改(填充数据),并将 HTML 作为 text/html 输出返回给客户端。这种方法的缺点是 HTML 模板随后被“嵌入”到 Python 代码中,而不是外部的单独文件中。

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

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

【问题讨论】:

  • 以下内容可能对使用无服务器 AWS lambda 提供静态文件(您的模板)有用。 :github.com/activescott/serverless-aws-static-file-handler 我一直想试试这个,但没有机会。尽管如此,这是一项有趣的尝试!
  • 关于添加“python”标签:已接受,但这不是问题的核心。 Python 只是编写 AWS Lambda 函数的示例语言,它也可以是 Node.js/JavaScript、Java、Go 或 C#。
  • 在 Node.js 中,我通常使用 Handlebars 来达到同样的效果:handlebarsjs.com

标签: python amazon-web-services aws-lambda aws-sam


【解决方案1】:

我不知道你从哪里开始,所以我从头开始。

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

  2. 对于模板,使用“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... :)

【讨论】:

  • 这可行,谢谢。在此之后...我如何安排 mypath/template.html 是存储在/与 Lambda 函数处理程序一起的包的一部分?还是压缩包时自动完成?那么,AWS Lambda 是否接受其他非 Python 文件是部署的一部分,是否可以从函数处理程序代码中引用这些文件?
  • "作为记录,我更喜欢使用 NodeJS 的选项 C。"我已经完成了几次选项 (C),使用 JavaScript 编写静态 HTML 文件,使用 Node.js 驱动的或 AWS Lambda 提供的 API 端点。 Node.js 应用程序需要一个 Web 服务器(这比 AWS Lambda 函数的成本几乎为零)。创建 AWS Lambda API 端点很好,但是应用程序逻辑位于两个位置:JavaScript 客户端和 AWS Lambda 服务器端。方法 (B) 旨在将所有逻辑都带到“服务器端”:AWS Lambda 函数,并具有低成本解决方案的额外优势。
  • Lambda 服务将 zip 文件解压缩到 Lambda 容器中,因此您在 zip 文件中的任何结构都将与容器中的文件夹结构相同。这包括任何东西,如图像、二进制文件、库等。
  • 我想这就是我想到的选项 (B) 的解决方案。谢谢! /me accepting your answer
  • @JochemSchulenklopper 很棒的帖子 - 这适用于 Python 的 Jinja2 模板吗?
猜你喜欢
  • 2019-09-23
  • 2018-05-24
  • 2017-09-24
  • 1970-01-01
  • 2017-08-17
  • 2020-08-11
  • 2019-02-13
  • 2022-09-29
  • 1970-01-01
相关资源
最近更新 更多