需要从JavaScript调用AWS Lambda的示例吗

需要从JavaScript调用AWS Lambda的示例吗,javascript,aws-lambda,Javascript,Aws Lambda,只需要一个例子,说明如何从浏览器中运行的JavaScript调用AWS Lambda,并在JavaScript控制台中显示函数结果。令人难以置信的是,我在谷歌或AWS文档中找不到任何例子 我的用例是我有一个HTML表单。提交表单时,我希望使用Lambda处理表单输入。假设Lambda函数完成时没有错误,那么我想让用户进入一个感谢页面 请包括一个完整的HTML示例,而不仅仅是一个代码片段。由于您需要从浏览器运行Lambda,您有两个选项可以实现它 使用AWS Javascript SDK,通过静态

只需要一个例子,说明如何从浏览器中运行的JavaScript调用AWS Lambda,并在JavaScript控制台中显示函数结果。令人难以置信的是,我在谷歌或AWS文档中找不到任何例子

我的用例是我有一个HTML表单。提交表单时,我希望使用Lambda处理表单输入。假设Lambda函数完成时没有错误,那么我想让用户进入一个感谢页面


请包括一个完整的HTML示例,而不仅仅是一个代码片段。

由于您需要从浏览器运行
Lambda
,您有两个选项可以实现它

  • 使用
    AWS Javascript SDK
    ,通过静态配置或
    Cognito
    使用
    IAM权限对
    Lambda
    进行设置。您还可以考虑将您的<代码> lambda < /代码>函数定义为<代码> SNS主题,并通过向主题发送消息来运行<代码> lambda < /Cord>。这种SNS方法还需要您通过单独的调用来存储和检索提交状态

  • 使用AWS API Gateway创建RESTful端点,该端点具有适当的CORS配置,可以使用AJAX从浏览器ping


  • 这两种选择各有利弊。关于您的用例的更多信息对于正确评估哪一个最适合您是必要的。

    我将使用AWS SDK for Javascript,步骤如下

  • 引用js文件

  • 初始化/配置SDK

    AWS.config.update({region:'region'});
    AWS.config.credentials=new AWS.CognitoIdentityCredentials({IdentityPoolId:'IdentityPool'})

  • 创建服务lambda对象等等

  • 您可以在此链接中看到接下来的步骤


    我看到有人使用AWS SDK来编写Javascript,但这并不是特别需要的,因为您需要创建Amazon Cognito身份池,并为未经身份验证的身份启用访问权限(至少对于像我这样的初学者)。下面的代码对我来说很好-

    <html>
        <head>
    <script>
        function callAwsLambdaFunction() {
            var xhttp = new XMLHttpRequest();
            xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                    document.getElementById("myDiv").innerHTML = this.responseText;
                }
            };
            xhttp.open("GET", "https://test123.ap-south-1.amazonaws.com/dev", true);
            xhttp.send();
    
        }
        </script>   
            <title>Hello World!</title>
        </head>
        <body>
            <h1>Hello world!</h1>
            <h1>Click below button to call API gatway and display result below!</h1>
            <h1><div id="myDiv"></div></h1>
            <button onclick="callAwsLambdaFunction()">Click me!</button><br>
            Regards,<br/>
            Aniket
        </body>
    </html>
    
    
    函数callAwsLambdaFunction(){
    var xhttp=newXMLHttpRequest();
    xhttp.onreadystatechange=函数(){
    if(this.readyState==4&&this.status==200){
    document.getElementById(“myDiv”).innerHTML=this.responseText;
    }
    };
    xhttp.open(“GET”https://test123.ap-south-1.amazonaws.com/dev“,对);
    xhttp.send();
    }
    你好,世界!
    你好,世界!
    单击下面的按钮调用API gatway并在下面显示结果!
    点击我
    问候,
    安妮特
    上面是示例index.html,我已经添加到我的S3 bucket中,并创建了一个静态站点。需要注意的几点-

  • 如果您使用S3进行静态站点托管,请从外部打开index.html
  • 如果您的网站域与API网关域不同,请确保为API网关启用CORS。否则你可能会-

  • 跨源请求被阻止:同一源策略不允许读取远程资源https://test123.ap-south-1.amazonaws.com/dev. (原因:CORS标题“Access Control Allow Origin”丢失)。

    对于2017年后看到此消息的人,您可以签出。示例代码取自Amplify API文档

    请注意
    1) 必须使用POST方法调用lambda函数。
    2) 确保添加策略,以便为未经身份验证(如果需要)和身份验证的角色调用lambda权限。
    3) 如果授予了权限策略,则用户无需登录即可调用lambda

    import Amplify, { API } from 'aws-amplify';
    
    Amplify.configure({
        Auth: {
        // REQUIRED - Amazon Cognito Identity Pool ID
            identityPoolId: 'XX-XXXX-X:XXXXXXXX-XXXX-1234-abcd-1234567890ab',
        // REQUIRED - Amazon Cognito Region
            region: 'XX-XXXX-X', 
        // OPTIONAL - Amazon Cognito User Pool ID
            userPoolId: 'XX-XXXX-X_abcd1234', 
        // OPTIONAL - Amazon Cognito Web Client ID
            userPoolWebClientId: 'XX-XXXX-X_abcd1234',
        },
        API: {
            endpoints: [ 
                {
                    name: "MyCustomLambdaApi",
                    endpoint: "https://lambda.us-east-1.amazonaws.com/2015-03-31/functions/yourFuncName/invocations",
                    service: "lambda",
                    region: "us-east-1"
                }
            ]
        }
    });
    
    这就是如何调用lambda函数

    let apiName = 'MyApiName'; // replace this with your api name.
    let path = '/path'; //replace this with the path you have configured on your API
    let myInit = {
        body: {}, // replace this with attributes you need
        headers: {} // OPTIONAL
    }
    
    API.post(apiName, path, myInit).then(response => {
        // Add your code here
    });
    

    我困惑的一部分是我不知道是“invoke”还是“invoke”(大写“I”)。文档显示小写,但JavaScript库显示大写I。我尝试了两种方法,但结果不一致。您是指从客户端还是从服务器?从浏览器中选择Browser或Node.js。我将对问题进行编辑以澄清。我没有将其标记为已接受,因为我要求的是一个独立的示例,而不是概念大纲。@JesseBarnum您解决了这个问题吗?如果是,如何。。你能把它作为一个答案吗?我正试着用IAM权限做1。我没有调用SNS,我尝试直接调用Lambda(在RequestResponse模式下使用invoke函数),但它不起作用。当我说“不工作”时,我的意思是我在表单中单击submit按钮,什么也没有发生,Java错误控制台中没有任何内容,所以我希望看到某人的工作示例。你所说的“直接”方式是什么意思?这不,这个:是的,这也是可能的。我更新了我的答案。你关于使用SNS的建议对他的用例无效,因为他想知道这个功能是否成功。如果您使用SNS,它将返回向主题发送消息的结果,而不是Lambda执行的结果。API网关额外收费,每百万请求3.5美元扫描我们使用AWS Amplify调用步骤函数?