如何找到 lambda 函数的 API 端点?

How do I find the API endpoint of a lambda function?

我有一个 Lambda 函数,它有一个公开的 API 网关端点,我可以通过 AWS 控制台获取 URL 。但是,我想通过 API 调用获得 URL。 Lambda API documentation nor the API Gateway documentation 似乎都没有该信息(或者我可能错过了),所以这是否可能首先出现?

您的 API 网关端点 URL 不会通过 API 调用公开。但是,由于 API 的 URL 遵循一定的结构,您可以获得所有必要的部分并在您的代码中创建 URI。

https://API-ID.execute-api.REGION.amazonaws.com/STAGE

您可以使用apigateway:rest-apis to get your API-ID and restapi:stages来获取阶段对应的标识符。

我不是很理解上面的答案(也许它已经过时了?)。

绝对最简单的方法:

  1. 在 AWS 中选择 "Services" 下的 "API Gateway"。
  2. 点击您的API。
  3. 单击 "Stages"。
  4. 选择您要使用的舞台
  5. 现在您可以看到整个 URL 在顶部的蓝色框内非常明显,标题为 "Invoke URL"

根据@larschanders 的评论,如果您使用 CloudFormation 创建网关,端点 URL 将作为堆栈输出之一出现。

我没有看到 OP 问题的直接答案(使用 API 获取端点 URL)。这是 Python 代码片段,我希望它能为您提供指导,即使您使用的是其他语言绑定或 CLI。请注意获取内部端点与获取任何关联的自定义域端点的方法的区别。

import boto3

apigw = boto3.client('apigateway')

def get_rest_api_internal_endpoint(api_id, stage_name, region=None):
    if region is None:
        region = apigw.meta.region_name
    return f"https://{api_id}.execute-api.{region}.amazonaws.com/{stage_name}"

def get_rest_api_public_endpoints(api_id, stage_name):
    endpoints = []
    for item in apigw.get_domain_names().get('items',[]):
        domain_name = item['domainName']
        for mapping in apigw.get_base_path_mappings(domainName=domain_name).get('items', []):
            if mapping['restApiId'] == api_id and mapping['stage'] == stage_name:
                path = mapping['basePath']
                endpoint = f"https://{domain_name}"
                if path != "(none)":
                    endpoint += path
                endpoints.append(endpoint)
    return endpoints

如果您使用 CloudFormation,您可以使用 Python 和 Boto3:

import boto3

cloudformation = boto3.resource('cloudformation')
stack = cloudformation.Stack(name=stack_name)
api_url = next(
    output['OutputValue'] for output in stack.outputs
    if output['OutputKey'] == 'EndpointURL')

这是我在 GitHub 上使用 Chalice 的 REST 服务的工作示例。这是相关代码的 link,在上下文中:aws-doc-sdk-examples.

非常精确转到 AWS 控制台搜索:

  1. 服务中的 Lambda
  2. 搜索要查找的函数名称。
  3. 在功能概览中,您会找到 API 网关(单击此处)
  4. 在 API 网关下,单击详细信息(向下箭头)
  5. 在详细信息下,您会找到所有详细信息,例如 API 端点: API 类型: 授权 : 方法 : 资源路径: 舞台:

转到您的 lambda 主页 -> 单击“应用程序”[功能概述部分] -> 资源部分 -> LambdaAPIDefinition -> 阶段选项卡 -> [Select 所需阶段] -> [调用 URL] 您可以看到 api 端点可见。

如果知道函数名称,可以通过获取策略获取 apigw 端点:

aws lambda get-policy --function-name <name> \
  | jq -r '.Policy | fromjson | .Statement[0].Condition.ArnLike."AWS:SourceArn"'

那么这只是提取 api_id 并构建像 建议的端点的问题