零基础5分钟上手亚马逊云科技-开发云原生网站应用

简介:

欢迎来到小李哥全新亚马逊云科技AWS云计算知识学习系列,适用于任何无云计算或者亚马逊云科技技术背景的开发者,通过这篇文章大家零基础5分钟就能完全学会亚马逊云科技一个经典的服务开发架构方案。

我会每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿云开发/架构技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS最佳实践,并应用到自己的日常工作里。本次介绍的是如何利用亚马逊云科技上利用云原生计算服务Lambda,开发Python语言数据库交互模块,向DynamoDB托管NoSQL数据库写入和读取数据,提升云上应用程序的扩展性,降低运维维护难度。本方案架构图如下:

方案所需基础知识

什么是亚马逊云科技云原生 Lambda 服务?

亚马逊云科技 Lambda 是一项无服务器计算服务,专为帮助开发者运行代码而无需管理服务器基础设施而设计。通过 Lambda,开发者可以在不需要配置或维护服务器的情况下,自动运行代码以响应各种事件触发,如对 S3 存储桶的更改、API Gateway 请求、或数据库更新等。Lambda 支持多种编程语言,允许开发者只需上传代码并定义触发条件,AWS 会自动处理所有底层资源的管理,如计算资源的分配、扩展和监控。这个高度自动化的服务使得开发和部署变得更加简便和高效。

利用云原生服务开发应用的好处

无需管理基础设施

利用 AWS Lambda,开发者不再需要担心服务器配置、操作系统维护、或扩展资源的复杂性。AWS 自动管理这些基础设施任务,使开发者能够专注于应用逻辑的编写和优化。这种无服务器的架构大大减少了运维工作量,同时降低了管理成本。

按需扩展

Lambda 提供了内置的自动扩展能力,可以根据应用负载的变化动态调整资源。无论是处理高峰流量还是应对突发需求,Lambda 都能够快速扩展,以确保应用的稳定性和响应速度。用户只需为实际使用的计算时间付费,这种弹性扩展模式使得资源利用率更高,成本更为可控。

快速迭代与部署

使用 Lambda,开发者可以快速测试和部署新功能,无需等待繁琐的部署流程。AWS 提供的持续集成和持续部署(CI/CD)工具链可以与 Lambda 无缝集成,帮助开发团队快速推送更新和修复,确保应用始终保持最新状态。

本方案包括的内容

1. 利用亚马逊云科技Python Boto3 SDK开发数据库交互应用代码

2. 了解DynamoDB数据库读写API

3. 部署云原生架构和应用代码实现交互功能,并利用API Gateway创建对外暴露API

项目搭建具体步骤

1. 首先进入亚马逊云科技控制台,点击Cloud 9云端IDE服务

2. 点击Open进入云端IDE

3. 创建一个空网页前端文件index.html,复制以下代码

<!doctype html>
<html lang="en">

<head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css"
        integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

    <title>Lab Example</title>
    <script>


            // on page loaded
    document.addEventListener('DOMContentLoaded', (event) => {

        document.getElementById("send").addEventListener("click", async function(){
            var qs = new URLSearchParams({
                id: document.getElementById("id").value,
                firstname: document.getElementById("firstname").value,
                lastname: document.getElementById("lastname").value,
            })

            const apiEndpoint = document.getElementById("apiEndpoint").value;
            const before = document.getElementById("send").textContent;
            document.getElementById("send").textContent="...";
            fetch(`${apiEndpoint}SaveCustomer?${qs}`, {method: "POST"})
            .then(response => response.json())
            .then(json => {
                document.getElementById("send").textContent=before;
                refreshTable();
            });
        });

        function refreshTable() {
            const apiEndpoint = document.getElementById("apiEndpoint").value;
            fetch(`${apiEndpoint}ListCustomers`)
            .then(response => response.json())
            .then(jsonData => {
                var tbody = document.getElementById("results")
                tbody.innerHTML = '';
                jsonData.result.forEach(element => {
                    var tr = document.createElement('tr');
                    tbody.appendChild(tr);
                    element.forEach(cell => {
                        var td1 = document.createElement('td');
                        td1.appendChild(document.createTextNode(cell));
                        tr.appendChild(td1);
                    });
                });
            });
        }

        refreshTable();
    });
    </script>
</head>

<body>
    <main role="main" class="container">
        <div class="pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center"></div>
        <div class="card-deck mb-3">
            <div class="card mb-4 box-shadow">
              <!-- <div class="card-header">
                <h4 class="my-0 font-weight-normal">Save Customer</h4>
              </div> -->
              <div class="card-body">
                    <div class="form-group">
                      <label for="apiEndpoint">API Endpoint</label>
                      <input type="text" readonly="readonly" class="form-control" id="apiEndpoint" value="https://r2ks79x6p1.execute-api.us-east-1.amazonaws.com/">
                    </div>
                    <div class="form-group">
                        <label for="id">Customer ID</label>
                        <input type="text" class="form-control" id="id" value="ABC123">
                    </div>
                    <div class="form-group">
                        <label for="firstname">First Name</label>
                        <input type="text" class="form-control" id="firstname" value="TestFirst">
                    </div>
                    <div class="form-group">
                        <label for="lastname">Last Name</label>
                        <input type="text" class="form-control" id="lastname" value="TestLast">
                    </div>

                <button type="button" class="btn btn-lg btn-block btn-outline-primary" id="send">Put Item</button>
              </div>
            </div>
          </div>

          <div class="card-deck mb-3 text-center">
            <div class="card mb-4 box-shadow">
              <!-- <div class="card-header">
                <h4 class="my-0 font-weight-normal">Save Customer</h4>
              </div> -->
              <div class="card-body">

                <table class="table">
                    <thead>
                      <tr>
                        <th scope="col">Customer ID</th>
                        <th scope="col">First Name</th>
                        <th scope="col">Last Name</th>
                      </tr>
                    </thead>
                    <tbody id="results">

                    </tbody>
                  </table>

              </div>
            </div>
          </div>


    </main><!-- /.container -->

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
        integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
        crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.14.7/dist/umd/popper.min.js"
        integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
        crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/js/bootstrap.min.js"
        integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
        crossorigin="anonymous"></script>
</body>

</html>

3. 创建一个空python文件“app.py”,用于构建代码逻辑从DynamoDB数据库读取数据,并用云原生服务Lambda托管该代码

import boto3

dynamodb = boto3.client("dynamodb")


def lambda_handler(event, context):
    query_response = dynamodb.scan(TableName="LabCustomers")

    lists = [ [item["ID"]["S"], item["Firstname"]["S"], item["Lastname"]["S"]] for item in query_response["Items"]]

    return { "result": lists } 

4. 创建一个空python文件“app_solution”,用于构建代码逻辑向DynamoDB数据库存入数据,并用云原生服务Lambda托管该代码

import boto3

dynamodb = boto3.client("dynamodb")


def lambda_handler(event, context):
    print(event)
    id = event["queryStringParameters"]["id"]
    firstname = event["queryStringParameters"]["firstname"]
    lastname = event["queryStringParameters"]["lastname"]

    #####
    # Solution...
    #####
    put_response = dynamodb.put_item(
        TableName="LabCustomers",
        Item={
            "ID": {"S": id},
            "Firstname": {"S": firstname},
            "Lastname": {"S": lastname},
        },
    )

    return {"result": "Saved"}

5. 创建一个云原生资源部署脚本“template.yaml”,复制以下内容,该脚本用于创建云资源基础设施,包括Lambda、API Gateway和Dynamodb数据库表。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31


Resources:
  SaveCustomer:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: SaveCustomer/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
      Policies:
        - DynamoDBWritePolicy:
            TableName: !Ref LabCustomers
      Events:
        Sum:
          Type: HttpApi
          Properties:
            Path: /SaveCustomer
            Method: post
            ApiId: !Ref HttpApi

  ListCustomers:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ListCustomers/
      Handler: app.lambda_handler
      Runtime: python3.9
      Architectures:
        - x86_64
      Policies:
        - DynamoDBReadPolicy:
            TableName: !Ref LabCustomers
      Events:
        Sum:
          Type: HttpApi
          Properties:
            Path: /ListCustomers
            Method: get
            ApiId: !Ref HttpApi

  HttpApi:
    Type: AWS::Serverless::HttpApi
    Properties:
      StageName: "$default"
      CorsConfiguration:
        AllowOrigins:
          - "*"
        AllowHeaders:
          - "*"
        AllowMethods:
          - GET
          - POST

  LabCustomers:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: LabCustomers
      AttributeDefinitions:
      - AttributeName: "ID"
        AttributeType: "S"
      KeySchema:
      - AttributeName: "ID"
        KeyType: "HASH"
      ProvisionedThroughput:
        ReadCapacityUnits: 1
        WriteCapacityUnits: 1

Outputs:
  SaveCustomer:
    Description: URL of your API
    Value:
      Fn::Sub: 'https://${HttpApi}.execute-api.${AWS::Region}.${AWS::URLSuffix}/SaveCustomer'
  
  ListCustomers:
    Description: URL of your API
    Value:
      Fn::Sub: 'https://${HttpApi}.execute-api.${AWS::Region}.${AWS::URLSuffix}/ListCustomers'

  ApiGatewayEndpoint:
    Description: URL for API only
    Value:
      Fn::Sub: 'https://${HttpApi}.execute-api.${AWS::Region}.${AWS::URLSuffix}/'

6. 在Cloud9控制台中运行以下Shell命令“sam build”和“sam deploy”部署基础设施

cd ~/environment/sam-backend; sam build; sam deploy

部署成功后会收到如下回复,分别返回读取、写入DynamoDB的API节点URL。

******************************
**** This is OUTPUT ONLY. ****
******************************

Building codeuri: /home/ec2-user/environment/sam-backend/SaveCustomer runtime: python3.9 metadata: {} architecture: x86_64 functions: SaveCustomer
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Building codeuri: /home/ec2-user/environment/sam-backend/ListCustomers runtime: python3.9 metadata: {} architecture: x86_64 functions: ListCustomers
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource

Build Succeeded

Initiating deployment
=====================
Changeset created successfully. 

CloudFormation outputs from deployed stack
----------------------------------------------------------------------------------------
Outputs                                                                                                                                                                                                                     
----------------------------------------------------------------------------------------
Key                 ListCustomers                                                                                                                                                                                            
Description         URL of your API                                                                                                                                                                                          
Value               https://rz3hwd1vjl.execute-api.us-west-2.amazonaws.com/ListCustomers                                                                                                                                     

Key                 ApiGatewayEndpoint                                                                                                                                                                                       
Description         URL for API only                                                                                                                                                                                         
Value               https://rz3hwd1vjl.execute-api.us-west-2.amazonaws.com/                                                                                                                                                  

Key                 SaveCustomer                                                                                                                                                                                             
Description         URL of your API                                                                                                                                                                                          
Value               https://rz3hwd1vjl.execute-api.us-west-2.amazonaws.com/SaveCustomer                                                                                                                                      
----------------------------------------------------------------------------------------


Successfully created/updated stack - customer-app in us-west-2

7. 最后我们打开部署好的前端URL,在网页UI上对数据库交互模块进行功能测试。点击“Put Item”开始存入数据,网页末尾显示出数据已经成功写入到数据库中,测试成功。

以上就是在亚马逊云科技上利用云原生服务Lambda,开发NoSQL数据库交互模块的全部步骤。欢迎大家关注0基础5分钟上手AWS系列,未来获取更多国际前沿的AWS云开发/云架构方案。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/872460.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

调度台在现代社会中发挥哪些重要作用

在当今这个高度信息化、快节奏的社会中&#xff0c;调度台作为各行各业运行管理的中枢神经&#xff0c;正发挥着日益重要的作用。它不仅是一个物理上的工作平台&#xff0c;更是信息汇聚、指令发出、资源调配的核心节点&#xff0c;对于保障社会正常运转、提升服务效率、应对突…

tkcalendar中的DateEntry

tkcalendar中的DateEntry可进行时间选择&#xff0c;在Python环境中可以直接使用&#xff0c;但是打包过程中&#xff0c;pyinstaller -F -w -i nss.ico xxx.py,DateEntry是用不了&#xff0c;不显示&#xff0c;打包使用pyinstaller -F -w -i nss.ico --hidden-import babel.n…

spring boot(学习笔记第十九课)

spring boot(学习笔记第十九课) Spring boot的batch框架&#xff0c;以及Swagger3(OpenAPI)整合 学习内容&#xff1a; Spring boot的batch框架Spring boot的Swagger3&#xff08;OpenAPI&#xff09;整合 1. Spring boot batch框架 Spring Batch是什么 Spring Batch 是一个…

dp练习【4】

最长数对链 646. 最长数对链 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i] [lefti, righti] 且 lefti < righti 。 现在&#xff0c;我们定义一种 跟随 关系&#xff0c;当且仅当 b < c 时&#xff0c;数对 p2 [c, d] 才可以跟在 p1 [a, b…

Ubuntu环境的MySql下载安装

下载压缩包 此文章下载的mysql版本位5.7.29 sudo wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar解压缩 sudo tar -xvf mysql-server_5.7.29-1ubuntu18.04_amd64.deb-bundle.tar命令解释 -x&#xff1a;…

鸿蒙MPChart图表自定义(四)短刻度线

对于图表中的x轴效果&#xff0c;我们有时想要实现如图所示的特定刻度线。若需绘制x轴的短刻度线&#xff0c;我们可以利用现有资源&#xff0c;将原本的网格线稍作修改&#xff0c;只需绘制一条简洁的短线即可达到目的。 具体的方法就是写一个类MyXAxisRender继承自XAxisRend…

【补-网络安全】日常运维(二)终端端口占用排查

文章目录 一、利用ipconfig、netstat 命令行统计二 、策略封禁IP 引言:检查频繁,第一步我们梳理完资产,第二步应该对资产终端进行一个排查,诊断把脉,了解清楚系统的端口占用及开放情况 一、利用ipconfig、netstat 命令行统计 1.先用ipconfig定位该终端的IP地址 2.明确IP地址后…

汇编语言在虚拟机中输出“Hello World!”

1.软件 Nasmide64.exe(李忠老师编写) Fixvhdw64.exe(李忠老师编写) VirtualBox虚拟机(免费 开源) 2.过程 01.Fixvhdw64.exe输入以下代码: mov ax,0xb800 mov ds,ax mov byte [0x00],H mov byte [0x02],e mov byte [0x04],l mov byte [0x06],l mov byte [0x08],o mov byte…

x-cmd pkg | tig - 基于 nucurses 的 git 文本模式界面

目录 简介首次用户快速实验指南功能特点类似工具与竞品进一步探索 简介 tig 由 Jonas Fonseca 于 2006 年使用 C 语言创建的 git 交互式文本命令行工具。旨在开启交互模式快速浏览 git 存储库的信息以及 git 命令的运行。 首次用户快速实验指南 本文的 demo 展现了如何通过 …

2024年高教杯国赛(D题)数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

2024国赛数学建模ABC题思路模型

完整的思路模型请查看文末名片 完整的思路模型请查看文末名片 完整的思路模型请查看文末名片

精通Transformer,从零开始构建最先进的NLP模型(附PDF)

国内第1本Transformer——变形金刚红书 如果一定要说未来谁能引领人工智能世界&#xff0c;是Transformer而非chatGPT&#xff01; 编辑推荐★★★★★ ChatGPT红得发紫&#xff0c;强得让人类心悸。 但在它的背后&#xff0c;还隐藏着一位真正的大佬。 它的名字叫做——T…

科研绘图系列:R语言PCoA图(PCoA plot)

文章目录 介绍PCoA图的作用:说明的问题:加载R包导入数据数据预处理画图参考介绍 PCoA(主坐标分析,Principal Coordinate Analysis)是一种多维数据的降维技术,它用于探索高维空间中样本之间的关系。PCoA通常用于生态学、遗传学和其他领域的数据分析,以揭示样本或个体之间…

基于.NET6的WPF基础总结(上)

目录 一.常用属性介绍 二、 程序退出方式 三、布局样式 3.1 Panel的附加属性ZIndex 3.2 Grid(网格)布局 3.3 UniformGrid&#xff08;均分布局&#xff09; 3.4 StackPanel&#xff08;堆积面板&#xff09; 3.5 WrapPanel&#xff08;换行面板&#xff09; 3.6 Doc…

在模板中使用 Django 会话

在 Django 中使用会话&#xff08;session&#xff09;可以让你在用户访问网站的过程中存储和访问临时数据。我们可以利用会话在速度计算器的例子中存储和显示上次计算的结果。 1、问题背景 在 Django 中&#xff0c;可以使用会话来存储用户数据。在某些情况下&#xff0c;我们…

俄罗斯版微信遭遇大规模数据泄露,安全问题再引关注

据报道&#xff0c;俄罗斯最大的社交媒体和网络服务VK&#xff08;VKontakte&#xff09;遭遇了大规模的数据泄露事件&#xff0c;该事件对大量用户造成了影响。据非法市场BreachForums上一位名为Hikki-Chan的威胁行为者声称&#xff0c;2024年9月&#xff0c;VK的数据在论坛上…

Stream 流式编程

优质博文&#xff1a;IT-BLOG-CN 大家都知道可以将Collection类转化成流Stream进行操作&#xff08;Map并不能创建流&#xff09;&#xff0c;代码变得简约流畅。我们先看下流的几个特点&#xff1a; 1、流并不存储元素。这些元素可能存储在底层的集合中&#xff0c;或者是按需…

VMwareWorkstation安装Kali系统教程

Kali系统&#xff0c;全名为Kali Linux&#xff0c;为渗透测试和网络安全领域提供一个全面的工具集合。Kali系统预装了各种用于渗透测试和漏洞利用的工具&#xff0c;包括端口扫描、密码破解、网络嗅探、漏洞分析等。这些工具可以帮助安全专业人员评估和测试网络的安全性&#…

实例讲解Simulink应用层开发CAN报文解包及CAN信号设置方法

在VCU应用层开发中&#xff0c;在输入信号中主要包括开关信号、模拟信号、CAN信号、PWM信号等&#xff0c;其中CAN通讯由于通讯质量高&#xff0c;传输数据量大&#xff0c;采用总线通讯方式节省大量线束&#xff0c;在汽车上尤其是电动汽车上大量应用&#xff0c;当然&#xf…

数图亮相第三届中国区域零售创新峰会:共绘零售新蓝图,携手迈向新征程

8月31日&#xff0c;备受瞩目的第三届中国区域零售创新峰会在历史悠久的湖北襄阳圆满落下帷幕。在这场零售行业的盛会上&#xff0c;数图信息科技作为重要参会企业&#xff0c;积极参与其中&#xff0c;与众多行业精英共聚一堂&#xff0c;共同擘画零售业的宏伟蓝图。以下是本次…