CloudFormation mette a disposizione una serie di tipi non atomici, cioè non corrispondenti ad un singolo servizio, ma che permettono di costruire applicazioni o infrastrutture che comprendono più elementi, l’esempio più evidente è la gestione dell’API Gateway che necessità di diversi elementi (stage, risorse, deploy) ma che può essere raggruppato in un unica risorsa nel template di CloudFormation.
I tipo messi a disposizione sono:
- AWS::Serverless::Api
- AWS::Serverless::Application
- AWS::Serverless::Connector
- AWS::Serverless::Function
- AWS::Serverless::GraphQLApi
- AWS::Serverless::HttpApi
- AWS::Serverless::LayerVersion
- AWS::Serverless::SimpleTable
- AWS::Serverless::StateMachine
ben descritti nella documentazione ufficiale. In realtà questi tipo sono stati usato anche in precedenti esempi senza dar particolare attenzione alla differenza tra i tipi atomici e i tipi “serverless”, questo perché spesso risultano più semplici da imparare ed usare questi tipi rispetto ai tipi elementari.
Il primo tipo messo a disposizione dal framwork è studiato per creare API di tipo RESTful, questo permette di creare tutta l’infrastuttura (risorse, metodi e stage) in un unico componente indicando lo stage come parametro, i metodi in un elenco specifico e le risorse come funzioni Lambda esterne, infatti questo tipo di risorsa funziona solo se combinato con il tipo AWS::Serverless::Function. Un esempio completo e funzionante:
ApiGateway: Type: AWS::Serverless::Api Properties: StageName: !Ref Stage OpenApiVersion: 3.0.2 CacheClusterEnabled: false CacheClusterSize: '0.5' Cors: AllowMethods: "'POST, GET, DELETE, OPTIONS'" AllowOrigins: "'*'" AllowHeaders: "'*'" MaxAge: "'600'" MethodSettings: - ResourcePath: / HttpMethod: GET CachingEnabled: false CacheTtlInSeconds: 300 ApiGetFunction: Type: AWS::Serverless::Function Properties: Role: !GetAtt APIRole.Arn Events: ApiEvent: Type: Api Properties: Path: / Method: get RestApiId: Ref: ApiGateway CodeUri: lambda Handler: dynamo_crud.get_handler Runtime: python3.8 MemorySize: 128 Environment: Variables: DynamoName: !Ref DynamoName Timeout: 500
L’esempio completo e funzionante di questo esempio (con API che esegue una chiamata ad una Lambda) è disponibile al solito repository;
https://github.com/alnao/AWSCloudFormationExamples/tree/master/Esempio11dynamoApiCrud
Per maggior informazioni sui tipi Serverless di CloudFormation si rimanda la documentazione ufficiale e agli articoli del blog ufficiale, perché bisogna sempre ricordare che questo tipo di risorse hanno dei parametri specifici studiati apposta per la creazione di applicazioni Serverless.
Per quanto riguarda la creazione delle Lambda con il tipo specifico AWS::Serverless::Function
bisogna ricordare che questo tipo è diverso dal tipo base AWS::Lambda::Function
, alcuni parametri sono uguali come ReservedConcurrentExecutions mentre altri sono diversi come il ProvisionedConcurrencyConfig, si rimanda sempre alla documentazione ufficiale per i dettagli di quali parametri sono previsti dal tipo serverless.