Press "Enter" to skip to content

在AWS服务中构建一个完整的Web应用程序

介绍

当我们开始学习AWS时,通常我们只学习一些零碎的知识,比如一些核心服务;在AWS控制台上操作,我们可以创建一个新的EC2实例或者一个S3存储桶,并且上传一些东西。但是在大多数情况下,我们无法将所有的服务整合到一个实际的应用程序中。我们知道了不同的AWS服务,但是无法将它们整合成一个实际可用的东西。如果你有同样的感觉,你来对地方了。在完成本文之后,你将能够构建一个托管在AWS中的密码管理应用程序,它在AWS服务器中进行计算,用户数据将通过API Gateway发送到后端服务器,最终结果将在浏览器中显示,并且还将数据存储在AWS数据库中。

在AWS服务中构建一个完整的Web应用程序 四海 第1张

在继续之前,请确保你有一个AWS账户并且可以访问控制台。本文不需要对AWS有先前的了解;如果你对AWS有一些基本的了解,那将会有帮助,即使你不了解,你也应该能够跟随我们构建应用程序。本文不是对任何AWS服务的深入探讨,而是将它们全部整合到一个工作的应用程序中。

学习目标

  • 通过整合不同的AWS服务创建一个端到端的Web应用程序。
  • 学习如何使用AWS Amplify部署和托管Web应用程序。
  • 学习如何使用AWS Lambda创建后端服务器。
  • 学习如何使用API Gateway在前端和后端组件之间进行数据传输。
  • 学习如何从AWS DynamoDB数据库中存储和检索数据。

我们将构建的服务和应用程序概述

本文使用五个AWS服务从零开始构建端到端的Web应用程序,如上图所示。我们将创建一个安全密码管理应用程序,通过输入密码的名称、长度和属性(大写字母、小写字母、数字、特殊字符)生成和存储安全密码。这是一个简单的应用程序,但它将所有的主要组件整合在一起,可以用来构建一个更大的实际应用程序。

我们需要做什么来构建这个应用程序?

1. 我们必须创建和托管一个用户将在其浏览器中导航的网页。

2. 我们需要一种方法来调用密码生成功能。

3. 我们需要一种计算结果的方法。

4. 我们需要一种存储结果的方法,并且需要一种将结果返回给用户的方法。

5. 我们需要处理这些服务在AWS中的权限。

使用AWS Amplify创建和部署一个实时网页

在AWS中,实际上有几种方法可以做到这一点。我们将选择AWS Amplify;使用Amplify,我们可以构建和托管网站。这是一个很棒的服务,特别适合前端开发人员。我们将创建一个HTML页面,然后使用Amplify来部署和托管这个网页。让我们现在来做。以下是一个简单的HTML代码,当我们打开它时,会显示我们文章的名称。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>安全密码管理器!</title>
</head>
<body>
    创建一个端到端的AWS应用程序。
</body>
</html>

步骤1:将这段代码保存为index.html并将此文件压缩为zip文件。现在我们将在AWS Amplify中部署它。打开AWS管理控制台并搜索AWS Amplify。

在AWS服务中构建一个完整的Web应用程序 四海 第2张

第二步:我们想在这里托管Web应用程序,因此选择Amplify Hosting。

在AWS服务中构建一个完整的Web应用程序 四海 第3张

第三步:我们没有Git提供商,因此选择“无Git提供商进行部署”并继续。

在AWS服务中构建一个完整的Web应用程序 四海 第4张

第四步:给应用程序起一个自己喜欢的名称。我将我的命名为“PasswordGeneratorFrontend”。给一个环境名称。选择拖放并抓取我们之前创建的zip文件,然后点击保存和部署。

在AWS服务中构建一个完整的Web应用程序 四海 第5张

现在您将看到部署成功,并获得托管网页的链接。您也可以随时通过侧边栏中的域名管理访问此链接。

在AWS服务中构建一个完整的Web应用程序 四海 第6张

我们有一个现场网页,用户可以在我们的应用程序中导航。

设置AWS Lambda服务来进行应用程序中的计算

您可能知道,Lambda函数只是一小段代码,它在某些触发器的响应中运行,例如当您将图片上传到s3存储桶时,它可以触发一个Lambda函数来处理图片并生成缩略图等等,它只是一段在AWS中运行的代码或函数,当您需要时,它会自动在幕后发生。这些是无服务器的,意味着您无需设置和管理服务器来运行代码;它只是在幕后自动发生。因此,我们将编写一些Python代码并进行所需的计算。

第一步:前往AWS控制台并导航到Lambda。

在AWS服务中构建一个完整的Web应用程序 四海 第7张

第二步:创建一个新的函数并选择“从头开始编写”,这应该是默认选项,然后给出一个函数名称。然后选择运行环境,让我们选择最新可用版本的Python。您可以将其他所有内容保持不变,然后点击创建函数。

在AWS服务中构建一个完整的Web应用程序 四海 第8张

第三步:现在在控制台中向下滚动,您将看到一个用于编写代码的编辑器。我们将在该编辑器中放置我们的Python代码。以下是我们的Python代码:

import json
import random
import string

def lambda_handler(event, context):
    # 从事件对象中提取输入参数
    name = event['name']
    length = int(event['length'])
    req_capital_letters = int(event['reqCapitalLetters'])
    req_small_letters = int(event['reqSmallLetters'])
    req_numbers = int(event['reqNumbers'])
    req_special_chars =int(event['reqSpecialChars'])
    # 生成密码
    password_chars = []
    allowed="" #允许的字符
    # 包含每个选定字符集中的一个字符
    if req_capital_letters:
        password_chars.append(random.choice(string.ascii_uppercase ))
        allowed=allowed+string.ascii_uppercase
    if req_small_letters:
        password_chars.append(random.choice(string.ascii_lowercase))
        allowed=allowed+string.ascii_lowercase
    if req_numbers:
        password_chars.append(random.choice(string.digits))
        allowed=allowed+string.digits
    if req_special_chars:
        password_chars.append(random.choice(string.punctuation))
        allowed=allowed+string.punctuation
    # 计算剩余长度以获取随机字符
    remaining_length = length - len(password_chars)
    # 为剩余长度生成随机字符
    password_chars.extend(random.choice(allowed) for _ in range(remaining_length))
    # 洗牌以消除顺序偏差
    random.shuffle(password_chars)
    # 连接字符以形成密码
    password = ''.join(password_chars)
    # 以JSON响应的形式返回密码
    return {
        'statusCode': 200,
        'body': json.dumps('您的密码是:' + password + ',用于' + name)
    }

代码非常简单易懂。我们只是导入了JSON实用程序包和Python随机字符串库以生成随机字符,然后我们有了我们的lambda处理程序;这对所有lambda函数都是通用的,在这里我们做了大部分的工作。您记得我们的用户将传递密码的名称、长度和属性(大写字母、小写字母、数字、特殊字符)作为输入。我们从事件对象中获取这些值并存储在相应的变量中。然后我们从每个用户选择的集合中包含一个字符。然后我们计算密码的剩余长度,并根据该长度从用户选择的集合中生成剩余长度的随机字符。最后,我们将结果作为JSON对象返回。

在AWS服务中构建一个完整的Web应用程序 四海 第9张

确保保存此代码(您可以按CTRL + S),然后非常重要的是,您还需要通过单击“部署”按钮来部署它。

第四步:现在,让我们测试我们的lambda函数,确保该函数正常工作。点击测试按钮旁边的小箭头,然后点击“配置测试事件”。

在AWS服务中构建一个完整的Web应用程序 四海 第10张

第五步:让我们设置一个测试事件;它允许我们传入一些测试数据,以确保函数正常工作。创建一个新事件并给它一个事件名称。在事件JSON中,我们将传递一些随机密码属性。在我的情况下,我将密码长度设置为10,并选择了所有字符集(1-选中,0-未选中)。向下滚动,然后点击保存。

在AWS服务中构建一个完整的Web应用程序 四海 第11张

第六步:我们成功配置了测试事件;现在,我们需要实际运行测试,我们可以通过点击测试按钮来实现。如您所见,我们得到了一个200的状态码,并且结果中至少包含一个来自所有集合的字符。因此,我们的lambda函数正常工作。

在AWS服务中构建一个完整的Web应用程序 四海 第12张

到目前为止,我们使用Amplify托管了一个简单的HTML页面,并使用lambda函数实现了应用程序的功能。

创建一个API来调用密码生成器功能

接下来,我们需要一种调用密码生成器功能或基本上调用lambda函数的方法。我们的用户显然不会像我们刚刚做的那样进入AWS控制台并运行它,因此我们需要一个可以调用的公共终端点或URL来触发lambda函数运行,为此,我们将使用API Gateway服务,这是AWS的一个核心服务,我们可以使用它来构建我们自己的API(应用程序编程接口),无论是http,rest还是WebSocket API,都是调用lambda函数的完美方式。让我们使用API Gateway为我们的Lambda函数创建一个REST API。

第一步:进入AWS控制台,并搜索API Gateway。

在AWS服务中构建一个完整的Web应用程序 四海 第13张

第二步:点击“创建API”按钮创建一个新的API。现在进入REST API部分,然后点击“构建”按钮。

在AWS服务中构建一个完整的Web应用程序 四海 第14张

第三步:现在选择REST并选择“新建API”,然后我们需要给它一个名称。在我的情况下,我给了它一个名字叫“CallPasswordGenerator”。您可以将其他所有内容保持不变,然后点击“创建API”。

在AWS服务中构建一个完整的Web应用程序 四海 第15张

第 4 步:我们现在有一个空的 API,它还没有与任何 lambda 函数集成。现在让我们来做这个。在侧边栏上,确保选择了资源,然后选择了反斜杠,在操作菜单上选择创建方法。方法的类型将是一个 post,因为用户将向 AWS 发送数据,然后点击 POST 旁边的小勾。

第 5 步:对于集成类型,我们将使用一个 lambda 函数,然后给出我们的 lambda 函数名称,然后点击保存。

在AWS服务中构建一个完整的Web应用程序 四海 第16张

第 6 步:现在,一个重要的事情是我们需要启用 CORS 或跨源资源共享。所以去操作菜单,选择“启用 CORS”。它允许在一个域或来源中运行的 Web 应用程序访问不同域或来源上的资源,因为我们的 Web 应用程序在 Amplify 中运行在一个域中。我们的 lambda 函数将在另一个域中运行,所以我们需要能够在这些域或来源之间进行工作,这就是我们为什么要这样做的原因。

在AWS服务中构建一个完整的Web应用程序 四海 第17张

保持所有默认值不变,然后点击下面的启用 CORS 按钮。

在AWS服务中构建一个完整的Web应用程序 四海 第18张

第 7 步:让我们部署 API,以便我们可以测试它。转到操作菜单,选择部署 API。我们需要在这里设置一个新阶段,因为您可能对开发、测试和生产有不同的阶段。点击“部署”。

在AWS服务中构建一个完整的Web应用程序 四海 第19张

第 8 步:复制出现在屏幕上的调用 URL,因为我们以后会用到它,所以打开记事本或您想保存这个 URL 的任何地方。它将作为我们的 API 网关 URL。

在AWS服务中构建一个完整的Web应用程序 四海 第20张

第 9 步:让我们验证一下这个 API。进入侧边栏的资源,选择 POST。点击“测试”选项。这将允许我们发送我们想要的测试数据,并显示相应的响应。

在AWS服务中构建一个完整的Web应用程序 四海 第21张

第 10 步:我们使用相同的格式来测试 lambda 函数。以 JSON 格式传递所需的密码属性,然后点击测试按钮。我们可以看到我们的 API 成功工作,并且我们收到了包含密码和成功状态码的响应。

在AWS服务中构建一个完整的Web应用程序 四海 第22张

将数据存储在数据库中

实际上,我们不必将结果存储在任何地方,我们可以将其返回给用户,但大多数真实世界的应用程序都有数据库。所以,我们需要设置一个数据库,还需要处理应用程序的不同部分之间的权限,具体来说,我们需要给我们的 lambda 函数写入数据库的权限。从数据库开始,我们将使用 DynamoDB,一个键值或 NoSQL 数据库,它通常比关系数据库更轻量级,因为您需要提前设置模式和关系。

步骤1:打开控制台,搜索DynamoDB,然后点击创建表。

在AWS服务中构建一个完整的Web应用程序 四海 第23张

在AWS服务中构建一个完整的Web应用程序 四海 第24张

步骤2:为表指定一个名称;对于分区键,让我们将名称设为’ID’。其他一切保持不变,创建表。

在AWS服务中构建一个完整的Web应用程序 四海 第25张

步骤3:现在我们需要保存Amazon资源名称或ARN;为此,点击表名称,在常规信息下的additionalinfo中,您可以找到ARN。保存此ARN。我们将在稍后返回并获取它。

在AWS服务中构建一个完整的Web应用程序 四海 第26张

步骤4:为lambda函数授予写权限,转到lambda服务,然后转到配置选项卡,然后需要点击执行角色中的角色名称。这将在新标签页中打开。

在AWS服务中构建一个完整的Web应用程序 四海 第27张

步骤5:我们基本上需要为此角色添加一些权限。为此,点击添加权限,然后创建内联策略。

在AWS服务中构建一个完整的Web应用程序 四海 第28张

步骤6:使用JSON代码更容易,因此点击那里的JSON选项卡。将此代码放入该选项卡中。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "dynamodb:PutItem",
            "dynamodb:DeleteItem",
            "dynamodb:GetItem",
            "dynamodb:Scan",
            "dynamodb:Query",
            "dynamodb:UpdateItem"
        ],
        "Resource": "YOUR-TABLE-ARN"
    }
    ]
}

它允许在JSON中执行所有这些指定的操作,以便lambda函数可以在我们的DynamoDB表上执行所有这些操作。但非常重要的是,您需要更新复制的表ARN,然后点击Review Policy。

在AWS服务中构建一个完整的Web应用程序 四海 第29张

步骤7:现在,为该策略命名,最后,创建策略。

在AWS服务中构建一个完整的Web应用程序 四海 第30张

步骤8:我们需要更新lambda函数的Python代码以与数据库交互。我们之前的代码没有这个功能。

import json
import random
import string
# 导入AWS SDK(对于Python,包名是boto3)
import boto3
# 使用AWS SDK创建一个DynamoDB对象
dynamodb = boto3.resource('dynamodb')
# 使用DynamoDB对象选择我们的表
table = dynamodb.Table('PasswordDatabase')
def lambda_handler(event, context):
    # 从事件对象中提取输入参数
    name = event['name']
    length = int(event['length'])
    req_capital_letters = int(event['reqCapitalLetters'])
    req_small_letters = int(event['reqSmallLetters'])
    req_numbers = int(event['reqNumbers'])
    req_special_chars =int(event['reqSpecialChars'])
    # 生成密码
    password_chars = []
    allowed="" #允许的字符
    # 包括来自每个选定字符集的一个字符
    if req_capital_letters:
        password_chars.append(random.choice(string.ascii_uppercase ))
        allowed=allowed+string.ascii_uppercase
    if req_small_letters:
        password_chars.append(random.choice(string.ascii_lowercase))
        allowed=allowed+string.ascii_lowercase
    if req_numbers:
        password_chars.append(random.choice(string.digits))
        allowed=allowed+string.digits
    if req_special_chars:
        password_chars.append(random.choice(string.punctuation))
        allowed=allowed+string.punctuation
    # 计算剩余长度以生成随机字符
    remaining_length = length - len(password_chars)
    # 为剩余长度生成随机字符
    password_chars.extend(random.choice(allowed) for _ in range(remaining_length))
    # 打乱字符以消除顺序偏差
    random.shuffle(password_chars)
    # 将字符连接起来形成密码
    password = ''.join(password_chars)
    
    # 使用我们实例化的对象将结果写入DynamoDB表
    response = table.put_item(
        Item={
            'ID': name,
            'Password':password
            })

    # 以JSON响应的形式返回密码
    return {
        'statusCode': 200,
        'body': json.dumps('您的'+name+'的密码是:' + password)
    }

这段代码中的新内容是我们导入了一个名为boto3的AWS SDK(软件开发工具包)模块,然后我们获取了DynamoDB的boto3资源对象。接下来,我们使用这个对象通过传递表名来连接我们的DynamoDB表,其余部分与之前的代码相同。最后,代码使用table.put_item()函数将密码的名称和生成的密码插入到表中。

在AWS服务中构建一个完整的Web应用程序 四海 第31张

第9步:确保按下CTRL+S保存此代码,并非常重要的是,确保部署此代码,然后点击测试按钮测试此代码。我们可以看到我们的代码运行良好,并且给出了正确的结果。

在AWS服务中构建一个完整的Web应用程序 四海 第32张

第10步:让我们通过进入“浏览表项”检查这些结果是否已更新到DynamoDB表中,这将显示存储了什么。

在AWS服务中构建一个完整的Web应用程序 四海 第33张

我们可以看到表中现在有一个新的结果,这个结果是我们运行lambda函数的测试过程中产生的。

在AWS服务中构建一个完整的Web应用程序 四海 第34张

将前端与后端连接起来

目前,我们能够将内容写入DynamoDB表,并且我们的lambda函数具有适当的权限,但您可能已经注意到Amplify和API网关之间缺少连接。目前,从我们的index.html页面无法触发lambda函数。因此,让我们完成这个最后的部分。

我们需要更新index.html页面来调用API网关。这是最终index.html代码的链接。

代码解释:最初,在样式部分,我们对h1标签、输入框和表单进行了一些样式设置,以便在网页上获得更好的外观。您可以根据自己的喜好修改和更新CSS。在body部分,我们有一个h1标签“密码生成器”,这将成为我们的网页标题。接下来,我们有一个表单,用户将在其中使用复选框输入密码的名称和属性,并且我们有一个提交表单的按钮,该按钮调用“call API”函数,该函数在脚本标签中定义。我们将名称和密码的长度作为参数传递给此函数。在此函数中,我们根据表单中的用户输入将属性的值初始化为0或1。

我们创建一个带有这些值的JSON对象,并通过将此对象传递给请求体来调用端点。最后,我们在浏览器中弹出一个警告框,其中显示来自API网关的响应。

现在我们必须使用Amplify重新部署我们的index.html页面。再次将此文件制作成一个zip文件。打开Amplify并拖放zip文件。它应该在几秒钟内部署完成,并且我们将获得托管应用程序的链接。

在AWS服务中构建一个完整的Web应用程序 四海 第35张

只需打开链接。我们可以看到我们的应用程序已成功部署。

在AWS服务中构建一个完整的Web应用程序 四海 第36张

在AWS服务中构建一个完整的Web应用程序 四海 第37张

在AWS服务中构建一个完整的Web应用程序 四海 第38张

在这里,我们成功地更新了我们的DynamoDB数据库中的结果。

删除您的资源

如果您跟随本文进行操作,请删除我们在本文中创建的所有内容。一切都应该在免费套餐中,以防万一您不希望在月底收到任何意外账单。

步骤1:转到您的Amplify资源,点击右上角的操作,然后点击删除应用程序。在删除之前,您需要确认此操作。

在AWS服务中构建一个完整的Web应用程序 四海 第39张

步骤2:接下来,转到DynamoDB并点击表格。选择表格并点击删除。在删除之前也需要确认。

在AWS服务中构建一个完整的Web应用程序 四海 第40张

步骤3:接下来,您可以删除您的lambda函数。导航到AWS Lambda,选择侧边栏中的函数,然后选择您的函数名称。然后,转到操作下拉菜单,点击删除。

在AWS服务中构建一个完整的Web应用程序 四海 第41张

步骤4:最后,API网关。选择API名称,在操作下点击删除。

在AWS服务中构建一个完整的Web应用程序 四海 第42张

结论

在本文中,我们使用各种AWS服务实现了一个端到端的Web应用程序。在此应用程序中,用户可以在托管和部署的Web页面上输入他们的密码名称和属性,使用AWS Amplify。当用户提交密码详细信息时,页面中的脚本通过在请求体中传递用户数据来调用API网关,从而触发AWS Lambda函数,该函数根据用户输入进行计算并创建密码。结果被写入AWS DynamoDB数据库,然后我们将在浏览器中通过API网关收到返回的消息。我们已经看到了创建API网关、创建Lambda函数、配置数据库以及为Lambda函数分配用户权限以写入数据库的整个过程。虽然示例相对简单,但它涵盖了更复杂的真实世界应用程序所需的基本组件。

要点

  1. AWS Amplify可以帮助我们轻松创建和托管Web页面,非常适合前端开发人员。
  2. AWS Lambda是一种无服务器后端服务,根据触发器调用我们的代码,无需管理服务器。
  3. API Gateway通过提供端点来连接Web应用程序中的各种服务。
  4. DynamoDB可以使用适当的SDK以JSON格式存储Lambda函数生成的结果。
  5. 设置权限和配置AWS服务所需的策略对于确保应用程序的正常运行至关重要。

常见问题

本文章中显示的媒体不归Analytics Vidhya所有,仅在作者的自由裁量下使用。

Leave a Reply

Your email address will not be published. Required fields are marked *