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

news2024/11/28 1:43:38

简介:

欢迎来到小李哥全新亚马逊云科技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云开发/云架构方案。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交换机自动化获取诊断(H3C_无人值守)

介绍 在网络遇到个人无法处理的问题时&#xff0c;需要下载诊断信息发送给400处理&#xff0c;而通过传统的方式获取诊断信息需要通过多个步骤来获取&#xff0c;步骤繁琐&#xff0c;在设备数量过多的情况下&#xff0c;严重影响工作效率&#xff0c;而通过python自动化的方式…

情感分析——中文金融情感词典

情感分析——中文金融情感词典 [1]姜富伟,孟令超,唐国豪.媒体文本情绪与股票回报预测[J].经济学(季刊),2021,21(04):1323-1344.DOI:10.13821/j.cnki.ceq.2021.04.10. 该文章在Loughranand MacDonald(2011)词典的基础上通过人工筛选和Word2vec算法扩充&#xff0c;构建了一个更新…

数据结构——初始数据结构!!!

本章将简单介绍数据结构&#xff0c;欢迎大家点赞➕收藏&#xff0c;蟹蟹&#xff01;&#xff01;&#xff01;&#x1f495; &#x1f308;个人主页&#xff1a;404_NOT_FOUND ​1.简介 是一门基础学科研究的是数据如何在计算机中进行组织和存储&#xff0c;使得我们可以高效…

安捷伦Agilent E8362B,E8362C 20G/PNA高性能网络分析仪

安捷伦Agilent E8362B、E8362C PNA 网络分析仪&#xff0c;10 MHz - 20 GHz ​Agilent E8362B PNA&#xff08;高性能网络分析仪&#xff09;为您提供出色的性能、先进的自动化功能、灵活的连接性&#xff0c;并且易于使用。设计师和工程师喜欢 Agilent E8362B&#xff0c;因为…

深入探讨元学习(Meta-Learning):从“学习如何学习”到机器智能的飞跃

深入探讨元学习&#xff08;Meta-Learning&#xff09;&#xff1a;从“学习如何学习”到机器智能的飞跃 随着人工智能技术的飞速发展&#xff0c;传统机器学习模型在面对新任务时的局限性日益凸显。据研究&#xff0c;平均而言&#xff0c;一个深度学习模型在全新任务上达到可…

IPC机制(三)--共享内存和信号灯

目录 前言 一、什么是共享内存 二、创建一个共享内存 三、信号灯/信号集 1、临界资源 2、同步互斥机制 1、互斥机制&#xff1a; 2、同步&#xff1a; 3、信号灯的机制 4、信号灯的函数 四、信号灯控制进程对共享内存的访问 进程1&#xff1a; 进程2&#xff1a; …

通过G2++利率模型来模拟短期和长期利率的随机路径

G2利率模型是一种用于描述和预测利率变化的数学模型&#xff0c;它属于随机利率模型的一种。随机利率模型主要用于研究一段时间内利率的随机波动。 G2模型的核心在于它能够通过两个因子来捕捉短期和长期利率的动态变化。这两个因子通常与宏观经济变量相关联&#xff0c;能够更…

网络安全宗旨和目标

网络安全涉及网络和相关数据及信息的保护与保障。它已从物理技术发展到防病毒和反网络钓鱼平台等软件方法。 在本章中&#xff0c;我们将详细讨论网络安全的主要目标和原则&#xff0c;并提供与之相关的具体示例。所以&#xff0c;让我们从网络安全的目标开始。 网络安全的目的…

二手Agilent N6705B+N6781A电源模块N6705C

二手Agilent N6705BN6781A电源模块N6705C 产品概述 AgilentN6705B是可集成多达4个具有数字万用表、示波器、任意波形发生器和数据记录器特性的xj电源&#xff0c;可显著提高产生和测量输送到被测件中的直流电压和电流的效率。可使您无需开发和调试程序来控制大量仪器&#xf…

BaseCTF高校联合新生赛Week1复现(Web)

目录 A Dark Room Aura 酱的礼物 HTTP 是什么呀 md5绕过欸 喵喵喵•&#xfecc;• A Dark Room 打开环境 先查看源码&#xff0c;拉到最后看到flag Aura 酱的礼物 第一层看见file_get_contents()函数&#xff0c;想到文件包含&#xff0c;可以用伪协议&#xff0c;一般是…

Spring框架的案例程序

Spring框架的案例程序通常涉及构建一个简单的应用程序&#xff0c;以展示Spring的核心功能&#xff0c;如依赖注入、面向切面编程、数据访问等。以下是一个基本的Spring案例程序&#xff0c;它包括一个Spring Boot应用程序&#xff0c;用于展示如何使用Spring构建RESTful服务。…

Elasticsearch 基于Windows环境安装

1、 Java 下载安装 1.1 下载地址 elasticsearch 8.x 版本需要jdk17及以上版本支持 JDK下载地址 2、下载和安装 ES 2.1 下载地址 Past Release 2.2 文件目录 3、启动服务 3.1 启动方式 Windows&#xff1a;双击 bin 目录下的 elasticsearch.bat 文件Mac&#xff1a;双击…

深度学习系列74:语音中的mel谱

1 mel谱介绍 一个人说一句话&#xff0c;其 waveform 可以很不一样&#xff0c;但是 spectrogram 基本上会相似&#xff0c;甚至有人可以通过 spectrogram 来判断说话的内容。语谱图的横坐标是时间&#xff0c;纵坐标是频率&#xff0c;坐标点值为语音数据能量。由于是采用二维…

计算机网络(一) —— 网络基础入门

目录 一&#xff0c;关于网络 二&#xff0c;协议 2.1 协议是什么&#xff0c;有什么用&#xff1f; 2.2 协议标准谁定的&#xff1f; 2.3 协议分层 2.4 OSI 七层模型 2.5 TCP/IP 四层模型 三&#xff0c;网络传输基本流程 3.1 局域网中两台主机通信* 3.2 报文的封装与…

智能化浪潮赋能工业制造与报废拆解,基于高精度YOLOv8全系列参数【n/s/m/l/x】模型开发构建工业生产场景下车辆不同部位智能化分割检测识别分系统

随着科技的飞速发展&#xff0c;数字化与智能化已成为推动社会进步的强大引擎。在工业生产制造与汽车报废处理这一传统领域中&#xff0c;这一变革尤为显著。曾经&#xff0c;流水线作业与人工拆解是这些行业的主要生产方式&#xff0c;它们不仅效率低下&#xff0c;且高度依赖…

如何从 AWS CodeCommit 迁移到极狐GitLab?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;可以私有化部署&#xff0c;对中文的支持非常友好&#xff0c;是专为中国程序员和企业推出的企业级一体化 DevOps 平台&#xff0c;一键就能安装成功。安装详情可以查看官网指南。 本文将分享如何从 AWS CodeCommit 服务无缝迁…

【无标题】XSS安全防护:responseBody (输入流可重复读) 配置

接上文:配置XSS过滤器 XXS 安全防护:拦截器+注解实现校验-CSDN博客XSS(跨站脚本)攻击是一种网络安全威胁,允许攻击者注入恶意脚本到看似安全的网站。当用户浏览这些被注入恶意代码的网页时,恶意脚本会在用户的浏览器环境中执行,这可能导致多种安全问题,如窃取敏感数据、…

链表算法题(上)

在之前单链表和双链表两个专题中我们学习了链表相关的概念和性质&#xff0c;同时了解了单链表和双链表各自的特征&#xff0c;那么接下来在本篇中我们就将使用这些链表的知识来解决链表相关的算法题&#xff0c;在本篇中这些算法题能强化我们的算法思想&#xff0c;会对我们之…

HTML5好看的花店商城源码2

文章目录 1.设计来源1.1 主界面1.2 界面效果11.3 界面效果21.4 界面效果31.5 界面效果41.6 界面效果51.7 界面效果61.8 界面效果71.9 界面效果8 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#…

postgresql数据库创建表分区和分区分区查询失效问题

postgresql数据库创建表分区和分区失效场景 一、前言二、分区表创建1、范围分区&#xff08;Range Partitioning&#xff09;2、列表分区&#xff08;List Partitioning&#xff09;3、hash分区&#xff08;hash Partitioning&#xff09; 三、表分区查询失效问题 一、前言 在…