开始使用 AWS

构建无服务器 Web 应用程序

(利用 AWS Lambda、Amazon API Gateway、AWS Amplify、Amazon DynamoDB 和 Amazon Cognito)

构建无服务器 Web 应用程序

模块 4:部署 RESTful API

您将使用 Amazon API Gateway 将您在上一模块中构建的 Lambda 函数公开为 RESTful API

概览

在本模块中,您将使用 Amazon API Gateway 将您在上一模块中构建的 Lambda 函数公开为 RESTful API。此 API 可在公共 Internet 上访问,并通过您在上一模块中创建的 Amazon Cognito 用户池获得保护。使用此配置,您可以将静态托管的网站转变为动态 Web 应用程序,具体方法是:将进行 AJAX 调用的客户端 JavaScript 添加到已公开的 API。

架构概览

上图展示了您将在本模块中构建的 API Gateway 组件如何与您之前构建的现有组件相集成。灰色项为您在之前的步骤中已经实施的组件。

您在第一个模块中部署的静态网站已经配置了一个页面,可与您将在本模块中构建的 API 进行交互。/ride.html 上的此页面拥有一个基于地图的简单界面,可用于发出独角兽骑行请求。使用 /signin.html 页面进行身份验证后,您的用户将能够单击地图上的一个地点选择他们的出发位置,然后选择右上角的“Request Unicorn”按钮发出骑行请求。

本模块将着重介绍构建 API 云组件所需的步骤,但是,如果您对浏览器代码调用此 API 的工作原理感兴趣,也可以查看此网站的 ride.js 文件。在本示例中,应用程序使用 jQuery 的 ajax() 方法发出远程请求。

 完成时间

15 分钟

 使用的服务

实施

    1. Amazon API Gateway 控制台中,选择左侧导航窗格中的 API。 
    2. REST API 下,选择构建
    3. 选择协议部分中,选择 REST。 
    4. 创建新 API 部分中,选择新建 API
    5. 设置部分中,输入 WildRydes 作为 API 名称,然后在端点类型下拉列表中选择边缘优化
      注意:对于通过 Internet 访问的公共服务,请使用边缘优化的端点类型。区域端点通常用于主要从相同 AWS 区域访问的 API。
    6. 选择创建 API
  • 您必须创建 Amazon Cognito 用户池授权方。Amazon API Gateway 使用 Amazon Cognito 用户池(在模块 2 中创建)返回的 JSON Web 令牌(JWT)对 API 调用进行身份验证。在本节中,我们将为 API 创建授权器,以便我们可以使用用户池。

    使用以下步骤在 Amazon API Gateway 控制台中配置授权方:

    1. 在您刚刚创建的 WildRydes API 的左侧导航窗格中,选择授权方
    2. 选择创建新授权方。 
    3. 授权方名称字段中输入 WildRydes
    4. 选择 Cognito 作为类型。 
    5. Cognito 用户池下方的区域下拉列表中,选择您在本教程其余部分中使用的相同区域。在 Cognito 用户池名称字段中输入 WildRydes
    6. 令牌来源中输入 Authorization。 
    7. 选择创建
    8. 要验证授权方配置,请选择测试。 
    9. 将从模块 2 的“验证您的实施”部分中的 ride.html 网页复制的授权令牌粘贴到授权(标头)字段中,并验证 HTTP 状态响应代码是否为 200。 

     

     

  • 在本节中,您将在 API 中创建新资源。然后,为该资源创建一个 POST 方法并对其进行配置,以使用 Lambda 代理集成,该集成由您在本模块第一步中创建的 RequestUnicorn 函数提供支持。

    1. 在 WildRydes API 的左侧导航窗格中,选择资源
    2. 操作下拉菜单中,选择创建资源
    3. 输入 ride 作为资源名称,这将自动创建资源路径 /ride
    4. 选中启用 API Gateway CORS 复选框。
    5. 选择创建资源
    6. 在选中新创建的 /ride 资源的情况下,从操作下拉列表中选择创建方法
    7. OPTIONS 下显示的新下拉列表中选择 POST,然后选择选中标记图标。
    8. 选择 Lambda 函数作为集成类型
    9. 选中使用 Lambda 代理集成复选框。
    10. 选择您在整个教程中为 Lambda 区域使用的相同区域。
    11. 输入 RequestUnicorn 作为 Lambda 函数
    12. 选择保存
      注意:如果您收到错误提示表示此函数不存在,请检查您选择的地区是否与您在上一模块中使用的地区相一致。
    13. 当系统提示您授予 Amazon API Gateway 权限以调用您的函数时,请选择确定
    14. 选择方法请求卡。
    15. 选择授权旁的铅笔图标。
    16. 从下拉列表中,选择 WildRydes Cognito 用户池授权方,然后选择选中标记图标。
  • 在本节中,您将从 Amazon API Gateway 控制台部署您的 API 。 

    1. 操作下拉列表中,选择部署 API
    2. 部署阶段下拉列表中,选择 [新阶段]
    3. 为​​​​阶段名称输入 prod
    4. 选择部署
    5. 复制调用 URL。您将在下一部分中使用它。
  • 在此步骤中,您将更新网站部署中的 /js/config.js 文件,以包含刚创建的阶段的调用 URL。您需要直接从 Amazon API Gateway 控制台阶段编辑器页面的顶部复制此调用 URL,并将其粘贴到站点 config.js 文件的 invokeUrl 键中。您的配置文件仍将包含您在上一个模块中对 Amazon Cognito userPoolIDuserPoolClientIDregion 所做的更新。

    1. 在本地计算机上,导航到 js 文件夹,然后在所选的文本编辑器中打开 config.js 文件
    2. ��您在上一部分中从 Amazon API Gateway 控制台复制的调用 URL 粘贴到 config.js 文件的 invokeUrl 值中。 
    3. 保存文件。

    参见以下已完成的 config.js 文件的示例。请注意,文件中的实际值可能有所不同。

    window._config = {
    
        cognito: {
    
            userPoolId: 'us-west-2_uXboG5pAb', // e.g. us-east-2_uXboG5pAb         
    
            userPoolClientId: '25ddkmj4v6hfsfvruhpfi7n4hv', // e.g. 25ddkmj4v6hfsfvruhpfi7n4hv
    
            region: 'us-west-2' // e.g. us-east-2 
    
        }, 
    
        api: { 
    
            invokeUrl: 'https://rc7nyt4tql.execute-api.us-west-2.amazonaws.com/prod' // e.g. https://rc7nyt4tql.execute-api.us-west-2.amazonaws.com/prod, 
    
        } 
    
    };

        3.添加、提交更新后的 config.js 文件并将其推送到您的 Git 存储库,以将其自动部署至 Amplify 控制台。

    $ git add .
    $ git commit -m "new_configuration"
    $ git push
    
  • 注意:您可能会发现,在更新 S3 存储桶中的 config.js 文件与更新的内容呈现在您的浏览器中之间可能存在延迟。您还应该确保在执行以下步骤前清除浏览器缓存。

    1. ride.html 文件中的 ArcGIS JS 版本从 4.3 更新到 4.6(新版本不适用于本教程),如下所示:
    <script src="https://js.arcgis.com/4.6/"></script>
     <link rel="stylesheet" href="https://js.arcgis.com/4.6/esri/css/main.css">

    下面提供了完整的 ride.html 文件的示例。请注意,文件中的某些值可能有所不同。

    <div id="noApiMessage" class="configMessage" style="display: none;">
            <div class="backdrop"></div>
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">Successfully Authenticated!</h3>
                </div>
                <div class="panel-body">
                    <p>This page is not functional yet because there is no API invoke URL configured in <a href="/js/config.js">/js/config.js</a>. You'll configure this in Module 3.</p>
                    <p>In the meantime, if you'd like to test the Amazon Cognito user pool authorizer for your API, use the auth token below:</p>
                    <textarea class="authToken"></textarea>
                </div>
            </div>
        </div>
    
        <div id="noCognitoMessage" class="configMessage" style="display: none;">
            <div class="backdrop"></div>
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h3 class="panel-title">No Cognito User Pool Configured</h3>
                </div>
                <div class="panel-body">
                    <p>There is no user pool configured in <a href="/js/config.js">/js/config.js</a>. You'll configure this in Module 2 of the workshop.</p>
                </div>
            </div>
        </div>
    
        <div id="main">
            <div id="map">
            </div>
        </div>
    
        <div id="authTokenModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="authToken">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                        <h4 class="modal-title" id="myModalLabel">Your Auth Token</h4>
                    </div>
                    <div class="modal-body">
                        <textarea class="authToken"></textarea>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                    </div>
                </div>
            </div>
        </div>
    
    
        <script src="js/vendor/jquery-3.1.0.js"></script>
        <script src="js/vendor/bootstrap.min.js"></script>
        <script src="js/vendor/aws-cognito-sdk.min.js"></script>
        <script src="js/vendor/amazon-cognito-identity.min.js"></script>
        <script src="https://js.arcgis.com/4.6/"></script>
        <script src="js/config.js"></script>
        <script src="js/cognito-auth.js"></script>
        <script src="js/esri-map.js"></script>
        <script src="js/ride.js"></script>
    </body>
    
    </html>

        2.保存修改后的文件。 添加、提交修改后的文件并将其 git 推送到您的 Git 存储库,以将其自动部署至 AWS Amplify 控制台。

        3.访问您的网站域下的 /ride.html

        4.如果您被重定向到 ArcGIS 登录页面,请使用之前在简介部分创建的用户凭证进行登录,这是本教程的先决条件。

        5.地图成功加载后,单击地图上的任意位置以设置出发位置。

        6.选择请求 Unicorn。您将看到右侧边栏中有一条通知,告知您独角兽正在途中,然后您将看到一个独角兽图标正在朝着您的出发位置飞奔。

此页内容对您是否有帮助?