【问题标题】:Call aws Lambda function without using API Gateway and EC2 Instance在不使用 API Gateway 和 EC2 实例的情况下调用 aws Lambda 函数
【发布时间】:2017-05-04 10:06:52
【问题描述】:

我们可以在不使用 API 网关的情况下从 AWS 外部调用 lambda 函数吗?我想直接从外部 aws 服务调用 lambda 函数可以吗?

【问题讨论】:

  • 您所说的“外部 aws 服务”是什么意思?您是否尝试以某种语言以编程方式调用 aws lambda?
  • 如果您在最初的问题中包含完整的信息(例如,您想使用 Python),这将非常有帮助。写题技巧请见:How do I ask a good question?
  • 您为什么希望在不使用 SDK 和 API 网关的情况下使用 HTTP(s)?它们是最好的方法,所以你需要一个很好的理由不使用它们。
  • @JohnRotenstein 因为 API Gateway 对有效负载施加了 10MB 的限制,超时限制为 30 秒。当涉及到基于视觉的机器学习任务时,这些限制可能会造成严重后果。

标签: amazon-web-services aws-lambda


【解决方案1】:

AWS Lambda 函数可以通过以下方式触发:

  • 其他 AWS 服务上发生的事件(例如上传到 Amazon S3 存储桶的对象)
  • 正在发送到 AWS API Gateway 的消息(例如 REST 调用)
  • Amazon CloudWatch Events 中的计划
  • 直接 API 调用

来自Supported Event Sources 文档:

除了使用事件源调用 Lambda 函数外,您还可以按需调用 Lambda 函数。在这种情况下,您不需要预先配置任何事件源映射。但是,请确保自定义应用程序具有调用 Lambda 函数所需的权限。

例如,用户应用程序也可以生成事件(构建您自己的自定义事件源)。客户端、移动或 Web 应用程序等用户应用程序可以使用 AWS 开发工具包或 AWS 移动开发工具包(例如适用于 Android 的 AWS 移动开发工具包)发布事件和调用 Lambda 函数。

因此,互联网上的任何东西都可以调用 Lambda 函数,但它需要使用 AWS 凭证进行身份验证。

【讨论】:

  • 我的意思是我们可以在不使用 API 网关的情况下使用 http 或 https 从外部 aws 调用 lambda 函数吗?
  • 如上所述,您可以通过 API 调用来调用 Lambda 函数。此调用通过 HTTPS 发送,但您必须使用 AWS 开发工具包为您执行调用,因为身份验证语法很复杂。您没有提及您的首选语言,但作为示例,here is the call for Java
  • 我想在 python 中执行此操作,并且想在不使用 AWS SDKS 的情况下仅通过 http 或 https 调用 lambda 函数。
  • 我们可以制作一些只能调用给定 Lambda 函数的凭证吗?
  • 是的,您可以制作只能调用给定 Lambda 函数的凭证。只需使用等于 Lambda 函数的 ARN 的资源授予 lambda:invoke 权限。
【解决方案2】:

您还可以使用应用程序负载平衡器来调用 lambda。 当您的超时时间超过 30 秒时,此选项很有用。 要使用此选项,您需要向 lambda 函数添​​加触发器并选择 Application Load Balancer,然后继续进行配置,这并不难。

与使用 API 网关相比,这很糟糕,因为它为每个 lambda 创建了一个目标组,但是……它有时很有用。

【讨论】:

    【解决方案3】:

    这是在 Android 中不使用 API GateWay 的情况下调用 AWS lambda 函数的方式。

    接口类

     @LambdaFunction(functionName = "lambdafunctionName", invocationType = "RequestResponse")
     String lambdafunctionName(String str);
    

    Android 代码 (Java)

      new AsyncTask<Response, Void, String>() {
       @Override
        protected String doInBackground(Response... params) {
        try{
            CognitoCachingCredentialsProvider cognitoProvider = new 
            CognitoCachingCredentialsProvider(MainActivity.this, "#identitypoolID", #Region);     
        // creates an invocation factory
             LambdaInvokerFactory factory = new LambdaInvokerFactory(MainActivity.this,
                                        #Region, cognitoProvider);
    
        // create a proxied object of lambdafunctionName
              MyInterface lambdaFuction = factory.build(MyInterface.class,
                                        new LambdaJsonBinder());
    
       // invoke it just like a regular method
             String AWSResponse = lambdaFuction.lambdafunctionName(#Parameter to AWS lambda) ;
                                return AWSResponse;
    
         }catch(Exception e){
    
         Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
                              return null;
                            }
    
                        }
     @Override
      protected void onPostExecute(String result) {
       if (result == null) {
       Toast.makeText(MainActivity.this,"Error !", Toast.LENGTH_LONG).show();
       return;
       }
      Toast.makeText(MainActivity.this,"Response From AWS " +  result, Toast.LENGTH_LONG).show();
                        }
                    }.execute();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2015-04-25
      • 2017-12-07
      • 2015-07-13
      • 2017-09-03
      • 1970-01-01
      • 2020-08-21
      相关资源
      最近更新 更多