Pubblicato il 18/11/2023 da alnao nella categoria AWS

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.

MENU