You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需认证调用AWS Lambda函数遇阻,Python实现及Function URL求助

无需认证通过Python调用AWS Lambda函数的问题

我想实现无需认证即可通过Python调用AWS Lambda函数,写了如下代码:

from boto3 import client 
from botocore import UNSIGNED
from botocore.client import Config
from json import dumps

def invoke(functionName, params):
    lambda_client = client('lambda', 
                    aws_access_key_id='', 
                    aws_secret_access_key='', 
                    config=Config(signature_version=UNSIGNED),
                    region_name="us-east-2")

    response = lambda_client.invoke(FunctionName=functionName,
                     Payload=bytes(dumps(params), encoding='utf8'))
    return response["Payload"].read()

但运行后触发Missing Authentication Token错误(403)。我已经为Lambda函数配置了基于资源的策略语句,也给角色添加了允许FunctionURLPublicAccess的权限,但猜测还缺少额外配置来允许未认证用户调用。

另外我考虑过调用Lambda Function URL的方案,但没找到Python实现的相关文档,现在需要这两种方案的解决方案。

补充:尝试用Function URL的调用代码后,出现了内部服务器错误(502)。我给Lambda设置的策略如下:

  • 策略1:允许所有主体调用lambda:InvokeFunctionUrl动作,资源为目标函数的ARN,条件限制lambda:FunctionUrlAuthType为NONE
  • 策略2:允许lambda:InvokeFunction动作,主体为*,资源为目标函数ARN

我不确定是否需要API Gateway,个人认为不需要,但目前已经配置了一个关联该Lambda的API Gateway模板。


解决方案

方案一:boto3无认证调用Lambda(不可行)

Lambda的标准invoke API接口必须进行签名认证,boto3的UNSIGNED配置仅适用于S3等少数允许匿名访问的服务,无法用于Lambda的常规调用。因此这个方案无法实现无认证调用,建议采用Function URL方案。

方案二:使用Lambda Function URL实现无认证调用

Function URL是Lambda原生提供的HTTP访问入口,支持无认证访问,是最适合的方案。

1. 正确配置Function URL

  • 打开AWS Lambda控制台,进入目标函数页面
  • 切换到「配置」标签页,选择左侧「函数URL」,点击「创建函数URL」
  • 认证类型选择「NONE」,其余选项保持默认,点击「保存」
  • 添加资源策略(确保策略正确):
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": "*",
          "Action": "lambda:InvokeFunctionUrl",
          "Resource": "arn:aws:lambda:us-east-2:你的AWS账号ID:function:你的函数名称",
          "Condition": {
            "StringEquals": {
              "lambda:FunctionUrlAuthType": "NONE"
            }
          }
        }
      ]
    }
    

2. Python调用代码

使用requests库直接发送HTTP请求即可,示例代码:

import requests
import json

def invoke_lambda(function_url, params):
    headers = {"Content-Type": "application/json"}
    try:
        response = requests.post(
            function_url,
            data=json.dumps(params),
            headers=headers
        )
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"调用出错: {e}")
        return None

# 使用示例
FUNCTION_URL = "https://xxxx.lambda-url.us-east-2.on.aws/"  # 替换为你的Function URL
params = {"param1": "value1", "param2": "value2"}
result = invoke_lambda(FUNCTION_URL, params)
print(result)

3. 排查502错误

出现502通常是Lambda函数执行出错导致的,建议:

  • 查看CloudWatch日志:进入Lambda函数的「监控」标签页,点击「查看CloudWatch日志」,检查函数执行时的报错信息(比如代码异常、返回格式不符合要求)
  • 验证函数本身:在Lambda控制台的「测试」标签页,手动触发测试事件,确认函数能正常返回JSON格式的响应
  • 检查资源策略:确保策略中的Resource ARN与函数完全匹配,且条件lambda:FunctionUrlAuthType设置为NONE

关于API Gateway的说明

确实不需要API Gateway,Function URL已经能独立实现无认证的Lambda访问,配置更简单。如果已经配置了API Gateway,也可以通过设置API Gateway的「无认证」授权方式来实现,但Function URL是更轻量化的选择。


内容的提问来源于stack exchange,提问作者joysterling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 21:33:29