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>