通过直接 AWS Lambda 调用简化内部 API(简化.调用.AWS.Lambda.API...)

wufei123 2025-01-05 阅读:7 评论:0
这是文档的改进和完善版本: 通过直接 aws lambda 调用简化内部 api 使用面向服务的架构 (soa) 系统时,您可能需要一个内部 api 来进行服务之间的通信。一种常见的方法是将 aws lambda 与 api 网关结合使...

通过直接 aws lambda 调用简化内部 api

这是文档的改进和完善版本:
通过直接 aws lambda 调用简化内部 api

使用面向服务的架构 (soa) 系统时,您可能需要一个内部 api 来进行服务之间的通信。一种常见的方法是将 aws lambda 与 api 网关结合使用。然而,对于内部 api,有一个更简单、更高效的选择:直接调用 aws lambda。

为什么直接调用aws lambda?
  1. 内置 iam 身份验证
    aws lambda 与 aws identity and access management (iam) 原生集成,让您无需额外的身份验证层即可安全地访问内部 api。

  2. 更简单的配置和整体架构
    直接 lambda 调用无需配置 api 网关、自定义标头或复杂的服务器设置。这是专为内部用例量身定制的轻量级解决方案。

示例:使用 aws lambda 将两个数字相加 第 1 步:创建 lambda 函数

我们首先在 python 中创建一个简单的 lambda 函数来将两个数字相加。代码如下:

def lambda_handler(event, context):

    if 'number1' not in event:
        return {'status':'error','msg':"number1 is missing"}

    if 'number2' not in event:
        return {'status':'error','msg':"number1 is missing"}

    result = int(event['number1']) + int(event['number2'])

    return {"status":"success","result":result}

这是文档的改进和完善版本:
通过直接 aws lambda 调用简化内部 api

使用面向服务的架构 (soa) 系统时,您可能需要一个内部 api 来进行服务之间的通信。一种常见的方法是将 aws lambda 与 api 网关结合使用。然而,对于内部 api,有一个更简单、更高效的选择:直接调用 aws lambda。
为什么直接调用aws lambda?

built-in authentication with iam
aws lambda natively integrates with aws identity and access management (iam), allowing you to secure access to your internal api without additional layers of authentication.

simpler configuration
direct lambda invocation eliminates the need to configure api gateways, custom headers, or complex server setups. it’s a lightweight solution tailored for internal use cases.

示例:使用 aws lambda 将两个数字相加
第 1 步:创建 lambda 函数

我们首先在 python 中创建一个简单的 lambda 函数来将两个数字相加。代码如下:

def lambda_handler(事件, 上下文):
如果“number1”不在活动中:
return {'status': 'error', 'msg': "number1 丢失"}
如果“number2”不在活动中:
return {'status': 'error', 'msg': "number2 丢失"}

result = int(event['number1']) + int(event['number2'])
return {"status": "success", "result": result}

此 lambda 函数:

  • 验证输入以确保同时提供 number1 和 number2。
  • 将两个数字相加,并将结果以字典形式返回到 a 中。

我们使用 api 的应用程序的输入直接提供到事件中。这里没有花哨的对象,只有简单的 dict,没有 post,not get,没有任何标题。如上所述,访问权限是由 iam 本身定义的。

使用 aws sam 在本地运行

要在本地测试 lambda 函数,请使用 aws 无服务器应用程序模型 (sam)。以下是 sam 模板示例:

awstemplateformatversion: '2010-09-09'
transform: aws::serverless-2016-10-31
description: >
  dummy lambda that adds 2 numbers

# more info about globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
globals:
  function:
    timeout: 3
    memorysize: 128

resources:
  addtwonumbersfunction:
    type: aws::serverless::function # more info about function resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    properties:
      codeuri: hello_world/
      handler: app.lambda_handler
      runtime: python3.10
      architectures:
        - x86_64

步骤2:直接调用lambda函数(php示例)

我们可以通过这个脚本运行我们的 lambda

<?php

require 'vendor/autoload.php'; // autoload the aws sdk

use awslambdalambdaclient;

try {

    // define the custom endpoint, ommit upon production
    $customendpoint = 'http://172.17.0.1:3001';

    // create a lambda client with a custom endpoint
    $lambda = new lambdaclient([
        'region' => 'us-east-1', // replace with your lambda's region
        'version' => 'latest',
        'endpoint' => $customendpoint,
        // dummy keys work upon sam but in realyty you mau need to provide your own
        'credentials' => [
            'key'    => 'your-access-key-id',
            'secret' => 'your-secret-access-key',
        ],
    ]);

    // define the payload to send to the lambda function
    $payload = json_encode([
        'number1' => 1,
        'number2' => 2,
    ]);

    // invoke the lambda function
    $result = $lambda->invoke([
        'functionname' => 'addtwonumbersfunction', // replace with your lambda's name
        'invocationtype' => 'requestresponse', // options: 'event', 'requestresponse', 'dryrun'
        'payload' => $payload,
    ]);

    // print the response from lambda
    $responsepayload = $result->get('payload');
    echo "response from lambda: ". php_eol;
    var_dump(json_decode($responsepayload));

} catch (exception $e) {
    // handle exceptions
    echo "error: " . $e->getmessage() . php_eol;
    echo $e->gettraceasstring();
}

如您所见,lambda 输入被编码为 json string number1 和 number2 参数。 (上面示例中的代码)

 $payload = json_encode([
        'number1' => 1,
        'number2' => 2,
    ]);

参数必须是 json 字符串,而不是数组。仅当 lambda 返回字典时,或者在 javascript lamda 为对象的情况下,结果也可以解码为 json。

返回值始终是一个字符串并且必须解码为所需的形式。

生产注意事项 基于 php 脚本的 aws cli 配置

如果 php 脚本是在生产环境中部署的,或者脚本正在调用 aws 本身上的部署的 lambda,则应在没有端点设置的情况下配置客户端:

$lambda = new lambdaclient([
        'region' => 'us-east-1', // replace with your lambda's region
        'version' => 'latest',
        // dummy keys work upon sam but in realyty you mau need to provide your own
        'credentials' => [
            'key'    => 'your-access-key-id',
            'secret' => 'your-secret-access-key',
        ],
    ]);

当然,将密钥和秘密与在 aws iam 上配置的密钥一起放置。

iam 角色配置

调用脚本需要 iam 权限才能访问 lambda 函数。使用以下 iam 政策:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunctionUrl",
            "Resource": "arn:aws:lambda:eu-west-1:XXXXXX:function:AddTwoNumbersFunction"
        }
    ]
}

替换:

  • xxxxxx 为您的 aws 账户 id。
  • 使用您的 lambda 函数名称添加twonumbersfunction。

policy 应该拥有的权限是 lambda:invokefunctionurl 权限。您可以使用图形权限编辑器并将 lambda 的 arn 放置在上面策略中提到的资源部分。

结论

直接调用 aws lambda 简化了内部 api 设置。通过利用 iam 进行身份验证并删除不必要的中间件,这种方法既高效又易于实施。无论您是构建微服务还是处理内部任务,这种方法都可以节省时间和精力。

以上就是通过直接 AWS Lambda 调用简化内部 API的详细内容,更多请关注知识资源分享宝库其它相关文章!

版权声明

本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com

分享:

扫一扫在手机阅读、分享本文

发表评论
热门文章
  • 华为 Mate 70 性能重回第一梯队 iPhone 16 最后一块遮羞布被掀

    华为 Mate 70 性能重回第一梯队 iPhone 16 最后一块遮羞布被掀
    华为 mate 70 或将首发麒麟新款处理器,并将此前有博主爆料其性能跑分将突破110万,这意味着 mate 70 性能将重新夺回第一梯队。也因此,苹果 iphone 16 唯一能有一战之力的性能,也要被 mate 70 拉近不少了。 据悉,华为 Mate 70 性能会大幅提升,并且销量相比 Mate 60 预计增长40% - 50%,且备货充足。如果 iPhone 16 发售日期与 Mate 70 重合,销量很可能被瞬间抢购。 不过,iPhone 16 还有一个阵地暂时难...
  • 酷凛 ID-COOLING 推出霜界 240/360 一体水冷散热器,239/279 元

    酷凛 ID-COOLING 推出霜界 240/360 一体水冷散热器,239/279 元
    本站 5 月 16 日消息,酷凛 id-cooling 近日推出霜界 240/360 一体式水冷散热器,采用黑色无光低调设计,分别定价 239/279 元。 本站整理霜界 240/360 散热器规格如下: 酷凛宣称这两款水冷散热器搭载“自研新 V7 水泵”,采用三相六极马达和改进的铜底方案,缩短了水流路径,相较上代水泵进一步提升解热能力。 霜界 240/360 散热器的水泵为定速 2800 RPM 设计,噪声 28db (A)。 两款一体式水冷散热器采用 27mm 厚冷排,...
  • 惠普新款战 99 笔记本 5 月 20 日开售:酷睿 Ultra / 锐龙 8040,4999 元起

    惠普新款战 99 笔记本 5 月 20 日开售:酷睿 Ultra / 锐龙 8040,4999 元起
    本站 5 月 14 日消息,继上线官网后,新款惠普战 99 商用笔记本现已上架,搭载酷睿 ultra / 锐龙 8040处理器,最高可选英伟达rtx 3000 ada 独立显卡,售价 4999 元起。 战 99 锐龙版 R7-8845HS / 16GB / 1TB:4999 元 R7-8845HS / 32GB / 1TB:5299 元 R7-8845HS / RTX 4050 / 32GB / 1TB:7299 元 R7 Pro-8845HS / RTX 2000 Ada...
  • python中def什么意思

    python中def什么意思
    python 中,def 关键字用于定义函数,这些函数是代码块,执行特定任务。函数语法为 def (参数列表)。函数可以通过其名字和圆括号调用。函数可以接受参数作为输入,并在函数体中使用参数名访问。函数可以使用 return 语句返回一个值,它将成为函数调用的结果。 Python 中 def 关键字 在 Python 中,def 关键字用于定义函数。函数是代码块,旨在执行特定任务。 语法 def 函数定义的语法如下: def (参数列表): # 函数体 示例 定义...
  • python中int函数的用法

    python中int函数的用法
    int() 函数将值转换为整数,支持多种类型(字符串、字节、浮点数),默认进制为 10。可以指定进制数范围在 2-36。int() 返回 int 类型的转换结果,丢弃小数点。例如,将字符串 "42" 转换为整数为 42,将浮点数 3.14 转换为整数为 3。 Python 中的 int() 函数 int() 函数用于将各种类型的值转换为整数。它接受任何可以解释为整数的值作为输入,包括字符串、字节、浮点数和十六进制表示。 用法 int(object, base=10) 其中...