web-dev-qa-db-fra.com

Comment trouver le point de terminaison API d'une fonction lambda?

J'ai une fonction Lambda qui a un point de terminaison API Gateway exposé, et je peux obtenir l'URL pour cela via la console AWS. Cependant, je voudrais obtenir cette URL via un appel API. Ni le documentation de l'API Lambda ni le documentation de la passerelle API ne semblent avoir cette information (ou peut-être que je l'ai manquée), est-ce même possible en premier lieu?

26
howcheng

L'URL de votre point de terminaison API Gateway n'est pas exposée via un appel API. Cependant, comme l'URL de l'API suit une certaine structure, vous pouvez obtenir toutes les pièces nécessaires et créer l'URI dans votre code.

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

Vous pouvez utiliser apigateway: rest-apis pour obtenir votre ID API et restapi: stages pour obtenir l'identifiant correspondant à l'étape.

9
Jurgen

Je ne comprends pas vraiment la réponse ci-dessus (peut-être qu'elle est dépassée?).

La manière la plus simple absolue:

  1. Choisissez "API Gateway" sous "Services" dans AWS.
  2. Cliquez sur votre API.
  3. Cliquez sur "Etapes".
  4. Choisissez l'étape que vous souhaitez utiliser
  5. Vous pouvez maintenant voir l'URL entière très visible à l'intérieur d'une boîte bleue en haut avec le titre "Invoke URL"
36
larschanders

Dans le prolongement du commentaire de @larschanders, si vous créez la passerelle à l'aide de CloudFormation, l'URL du point de terminaison apparaît comme l'une des sorties de la pile.

0
Peter Halverson

Je ne vois pas de réponse directe à la question du PO (obtenir l'URL du point de terminaison à l'aide de l'API). Voici un extrait de code Python qui, je l'espère, guidera le chemin, même si vous utilisez d'autres liaisons de langage ou la CLI. Notez la différence d'approche pour obtenir le point de terminaison interne par rapport à tout associé points de terminaison de domaine personnalisés.

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
0
Peter Halverson