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

Posted

技术标签:

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

代替

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

(C) 在 S3 中创建静态 htmljavascript 文件,在 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 【参考方案1】:

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

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

    对于模板,使用“Mustashe for Python”pystashe。

    在您的 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>
    

    创建data 对象以填充参数化模板:

    
      "name": "Tom Thumb",
      "phone": "0123456789"
    
    

    从项目中的位置加载template

    template = file('%s/mypath/template.html'%py_root).read()
    

    从数据对象渲染页面:

    myhtml = pystache.render(template, data)
    

    将渲染后的html返回给客户端:

    response = 
        "statusCode": 200,
        "body": myhtml,
        "headers": 
            'Content-Type': 'text/html',
        
    
    

    将 python 代码、站点包和 html 文件压缩并放入 deployment 文件夹。

    deployment文件夹,打包SAM项目,准备上传到S3:

    aws cloudformation package --template-file myservice.yml --output-template-file deploy-myservice.yml --s3-bucket myserverless-deploy
    

    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 模板吗?

以上是关于如何在 AWS Lambda 上的无服务器应用程序中存储和使用 HTML 模板(使用 AWS SAM)?的主要内容,如果未能解决你的问题,请参考以下文章

带有 AWS Lambda 错误“找不到模块”的无服务器框架

AWS - Serverless 和 lambda

AWS Lambda 上的 Nestjs(无服务器框架)|如何访问事件参数?

使用现有策略的 AWS Gateway 中的无服务器白名单 IP

如何使用 aws cloudformation 或 aws cdk 设置 aws aurora mysql 表?

如何将使用Sharp库的无服务器框架应用程序部署到AWS?