Serverless: Comment partager les ids d’un API Gateway existant

La documentation de serverless indique comment partager les ids d’un API Gateway, mais la technique qui y est décrite ne semble fonctionner que pour un nouveau déploiement. (Dans mon cas, suivre cette technique a crée un 2è API Gateway vide dont les ids étaient partagés, ce qui, évidemment, ne répondait pas à mes besoins.)

Voici comment faire pour un déploiement existant.

Trouvez le manifeste de déploiement de votre pile existante dans CloudFormation, ou encore générez-le avec serverless en exécutant sls package <vos paramètres>. Ensuite, le fichier est sous .serverless/cloudformation-template-update-stack.json. Ouvrez-le.

Cherchez pour la définition de la ressource racine ApiGateway. Dans mon cas, c’est un API REST donc elle se trouve en cherchant pour "Type": "AWS::ApiGateway::RestApi". (C’est probablement quelque chose comme AWS::ApiGateway::Http pour un API de type Http.)

"ApiGatewayRestApi": {
  "Type": "AWS::ApiGateway::RestApi",
  "Properties": {
    "Name": "prod-api",
    "EndpointConfiguration": {
      "Types": [
        "REGIONAL"
      ]
    },
    "Policy": ""
  }
},

La valeur à noter ici est le nom de la clé de ce blob: ApiGatewayRestApi.

On peut retourner à la documentation serverless et ne faire que la portion Outputs en utilisant cette valeur de référence.

Outputs:
    apiGatewayRestApiId:
      Value:
        Ref: ApiGatewayRestApi
      Export:
        Name: MyApiGateway-restApiId
 
    apiGatewayRestApiRootResourceId:
      Value:
        Fn::GetAtt:
          - ApiGatewayRestApi
          - RootResourceId
      Export:
        Name: MyApiGateway-rootResourceId

ATTENTION: Cette approche est peut-être fragile. S’il s’avère techniquement possible de changer le nom de la variable d’une pile existante, une mise à jour de serverless pourrait briser cette configuration.

Mécanismes d’autorisation

Vous pouvez également réutiliser les mécanismes d’autorisation avec la même technique. Dans la pile principale, exportez la référence à votre mécanisme d’autorisation. Vous la trouverez en cherchant "Type": "AWS::ApiGateway::Authorizer". La valeur dont vous avez besoin est la clé du blob. Ensuite, dans la pile qui où vous souhaitez le réutiliser, ajoutez ceci sous les routes:

functions:
  ma_route:
    ...
    events:
    - http:
        ...
        authorizer:
          type: <type> # c'est requis, sans quoi le déploiement va échouer
          authorizerId:
            'Fn::ImportValue': <référence à la valeur à importer>

Leave a Reply

Ce site utilise Akismet pour réduire le pourriel. En savoir plus sur comment les données de vos commentaires sont utilisées.