如何从AWS Lambda检索数据并将其显示在AWS S3托管的静态网站上?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从AWS Lambda检索数据并将其显示在AWS S3托管的静态网站上?相关的知识,希望对你有一定的参考价值。

我正在尝试使用AWS DynamoDB,Lambda,API Gateway和S3创建一个简单的网站。 DDB有一个表,并且该表中有一个条目。 S3有一个用于网站html的简单文件。目的是在网站中显示位于DDB中的条目,如果我更新DDB中的值,则刷新网站应更改数字以反映DDB中的更新。目前,我有一个lambda函数,该函数可以从DDB成功检索条目。我一直试图告诉HTML文件调用lambda函数并取回数据(使用API​​ Gateway)。我以前从未使用过AWS,如果这不是实现此目标的正确方法,请原谅我。

下面是lambda函数的代码:

'use-strict';

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region: 'us-location-x'});

exports.handler = (event, context, callback) => {
    let tableToRead = {
        TableName: 'dataStore',
        Limit: 10
    };

    docClient.scan(tableToRead, function(err,data){
       if(err){
           callback(err,null);
       } else {
           callback(null,data);
       }
    });
};

这是S3上的HTML:

<html>
    <head>
    </head>

    <body>
        <h1> This number that's in DDB </h1>

        <div id="entries">
        </div>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
        <script type="text/javascript">
            //This is the link generated by API Gateway
            var API_URL = 'https://xxxxxxxxxx.execute-api.us-location-x.amazonaws.com/prod/retrieveDDB';
            $(document).ready(function(){
                $.ajax({
                    type: 'GET',
                    url: API_URL,

                    success: function(data){
                        $('#entries').html('');
                        data.Items.forEach(function(tableItem){
                            $('#entries').append('<p>' + tableItem.Row + '</p>');
                        })
                    }
                });
            });
        </script>
    </body>
</html>

当我使用“测试”按钮运行lambda函数时,它成功地从DDB中检索了数据。但是,当我尝试运行HTML时,它确实说了标题文本,但随后没有附加DDB中的值。我假设我只是不了解如何调用/解析lambda数据(如果我已经正确设置的话)。预先感谢您的帮助!

答案

cross-origin request blocked错误发生,因为您正尝试从其他域(例如www.example.com)访问api。这是称为CORS(跨源资源共享请求)的浏览器的安全功能。浏览器将向API发送pre-light请求,以检查是否应允许该调用。

预照式请求作为http options请求发送到api方法。

有两个步骤。

  1. 您需要启用Cors到API网关的资源方法。这样它将启用资源的Options方法。简而言之,您需要选择特定的资源,然后从操作中单击Enable Cors

参考:请阅读https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html的“在REST API资源上启用CORS支持”部分>

  1. 您应该从lambda返回原始标头。

    const docClient = new AWS.DynamoDB.DocumentClient({ region: 'us-location-x' });
    
    exports.handler = async (event) => {
      let tableToRead = {
        TableName: 'dataStore',
        Limit: 10
      };
    
      const headers = {
        "Access-Control-Allow-Origin": '*'
        // other headers 
      }
    
      try {
        const data = docClient.scan(tableToRead).promise();
        return {
          statusCode: 200,
          body: JSON.stringify(data),
          headers: headers
        }
      } catch (error) {
        return {
          statusCode: 400,
          body: error.message,
          headers: headers
        }
      }
    };      
    
  2. 希望这会有所帮助。 @Ashish Modi,感谢您分享链接。

以上是关于如何从AWS Lambda检索数据并将其显示在AWS S3托管的静态网站上?的主要内容,如果未能解决你的问题,请参考以下文章

AWS SDK (PHP):异步调用 lambda 函数,检索状态

如何使用 jdbc 连接从数据库中检索数据并将其显示在 jsp 文本字段中

如何使用 java servlet 从 mysql 数据库中检索图像并将其显示在 HTML img 标签中? [关闭]

aws 如何从生产环境中的 lambda 函数访问 ECS 服务

我如何设置在流程开始后24小时触发一次AWS Lambda?

使用nodejs中的AWS Lambda函数上传音频文件