Úvod do AWS Serverless Application Model

1. Prehľad

V našom predchádzajúcom článku sme už na serveri AWS implementovali aplikáciu s úplným zásobníkom bez servera, ktorá používa API Gateway pre koncové body REST, AWS Lambda pre obchodnú logiku a DynamoDB ako databázu.

Nasadenie však pozostáva z mnohých manuálnych krokov, ktoré by mohli byť s rastúcou zložitosťou a počtom prostredí nepochopiteľné.

V tomto výučbe si teraz povieme, ako používať AWS Serverless Application Model (SAM), ktorý umožňuje popis na základe šablón a automatické nasadenie aplikácií bez servera na AWS.

Podrobne sa pozrieme na nasledujúce témy:

  • Základy aplikačného modelu bez servera (SAM), ako aj základnej CloudFormation
  • Definícia aplikácie bez servera pomocou syntaxe šablóny SAM
  • Automatizované nasadenie aplikácie pomocou CLI CloudFormation

2. Základy

Ako sme už diskutovali, AWS nám umožňuje implementovať aplikácie úplne bez servera pomocou API Gateway, funkcií Lambda a DynamoDB. Nepochybne to už teraz ponúka veľa výhod z hľadiska výkonu, nákladov a škálovateľnosti.

Nevýhodou však je, že v súčasnosti v konzole AWS potrebujeme veľa manuálnych krokov, ako je vytvorenie každej funkcie, nahranie kódu, vytvorenie tabuľky DynamoDB, vytvorenie rolí IAM, vytvorenie API a štruktúry API atď.

V prípade zložitých aplikácií as rôznymi prostrediami, ako sú testovanie, testovanie a produkcia, sa toto úsilie rýchlo znásobí.

Tu prichádza na rad CloudFormation pre aplikácie na AWS všeobecne a Serverless Application Model (SAM) špeciálne pre aplikácie bez servera.

2.1. AWS CloudFormation

CloudFormation je služba AWS na automatické poskytovanie zdrojov infraštruktúry AWS. Užívateľ definuje všetky požadované zdroje v pláne (tzv. Šablóna) a AWS sa stará o zabezpečenie a konfiguráciu.

Nasledujúce pojmy a koncepty sú nevyhnutné pre pochopenie CloudFormation a SAM:

Šablóna je popis aplikácie, ako by mala byť štruktúrovaná za behu programu. Môžeme definovať množinu požadovaných zdrojov a tiež spôsob konfigurácie týchto zdrojov. CloudFormation poskytuje spoločný jazyk pre definovanie šablón a podporuje formát JSON a YAML.

Zdroje sú stavebnými kameňmi v službe CloudFormation. Zdrojom môže byť čokoľvek, napríklad RestApi, Stupeň RestApi, Dávková úloha, tabuľka DynamoDB, inštancia EC2, sieťové rozhranie, rola IAM a mnoho ďalších. Oficiálna dokumentácia v súčasnosti uvádza asi 300 typov zdrojov pre CloudFormation.

Stoh je inštanciou šablóny. O zabezpečenie a konfiguráciu zásobníka sa stará CloudFormation.

2.2. Serverový aplikačný model (SAM)

Používanie výkonných nástrojov môže byť veľmi často veľmi zložité a nepríjemné, čo je prípad CloudFormation.

Preto spoločnosť Amazon predstavila Serverless Application Model (SAM). SAM začal požiadavkou na poskytnutie čistej a priamej syntaxe na definovanie aplikácií bez servera. V súčasnosti má iba tri typy zdrojov, ktorými sú funkcie Lambda, tabuľky DynamoDB a API.

SAM je založený na syntaxi šablóny CloudFormation, takže môžeme našu šablónu definovať pomocou jednoduchej syntaxe SAM a CloudFormation túto šablónu ďalej spracuje.

Viac podrobností je k dispozícii v oficiálnom úložisku GitHub, ako aj v dokumentácii AWS.

3. Predpoklady

V nasledujúcom tutoriáli budeme potrebovať účet AWS. Postačujúci by mal byť bezplatný účet.

Okrem toho musíme mať nainštalované rozhranie AWS CLI.

Nakoniec potrebujeme v našom regióne segment S3, ktorý je možné vytvoriť pomocou rozhrania AWS CLI pomocou nasledujúceho príkazu:

$> aws s3 mb s3: // baeldung-sam-bucket

Zatiaľ čo tutoriál používa baeldung-sam-vedro v ďalšom texte nezabudnite, že názvy segmentov musia byť jedinečné, takže si musíte zvoliť svoje meno.

Ako ukážkovú aplikáciu použijeme kód z Používania AWS Lambda s API Gateway.

4. Vytvorenie šablóny

V tejto časti vytvoríme našu šablónu SAM.

Pred definíciou jednotlivých zdrojov sa najskôr pozrieme na celkovú štruktúru.

4.1. Štruktúra šablóny

Najprv sa pozrime na celkovú štruktúru našej šablóny:

AWSTemplateFormatVersion: '2010-09-09' Transformácia: 'AWS :: Serverless-2016-10-31' Popis: Baeldung Príklad serverového modelu aplikácie Zdroje: PersonTable: Typ: AWS :: Serverless :: SimpleTable Vlastnosti: # Definujte vlastnosti tabuľky tu StorePersonFunction: Typ: AWS :: Serverless :: Vlastnosti funkcií: # Definujte vlastnosti funkcií tu GetPersonByHTTPParamFunction: Typ: AWS :: Serverless :: Vlastnosti funkcií: # Definujte vlastnosti týchto funkcií MyApi: Typ: AWS :: Serverless :: Vlastnosti API: # Tu definujte vlastnosti API

Ako vidíme, šablóna sa skladá z hlavičky a tela:

Hlavička určuje verziu šablóny CloudFormation (AWSTemplateFormatVersion), ako aj verziu našej šablóny SAM (Transformácia). Môžeme určiť aj a Popis.

Telo sa skladá zo sady zdrojov: každý zdroj má svoj názov, zdroj Typa súbor Vlastnosti.

Špecifikácia SAM v súčasnosti podporuje tri typy: AWS :: Bez serverov :: Api, AWS :: Bez serverov :: Funkcia ako aj AWS :: Bez serverov :: SimpleTable.

Pretože chceme nasadiť našu ukážkovú aplikáciu, musíme si jednu definovať SimpleTable, dva Funkcie, ako aj jeden Api v našom tele šablóny.

4.2. Definícia tabuľky DynamoDB

Definujme teraz našu tabuľku DynamoDB:

AWSTemplateFormatVersion: '2010-09-09' Transformácia: 'AWS :: Serverless-2016-10-31' Popis: Baeldung Príklad serverového aplikačného modelu Zdroje: PersonTable: Typ: AWS :: Serverless :: SimpleTable Vlastnosti: PrimaryKey: Meno: id Typ: Číslo TableName: Osoba

Potrebujeme len definovať dve vlastnosti pre našu SimpleTable: názov tabuľky a primárny kľúč, ktorý sa volá id a má typ Číslo v našom prípade.

Celý zoznam podporovaných SimpleTable vlastnosti nájdete v oficiálnej špecifikácii.

Poznámka: Pretože chceme do tabuľky vstúpiť iba pomocou primárneho kľúča, znaku AWS :: Serverless :: SimpleTable je pre nás postačujúce. Pre zložitejšie požiadavky natívny typ CloudFormation AWS :: DynamoDB :: tabuľka môže byť použitý namiesto toho.

4.3. Definícia lambda funkcií

Ďalej definujeme naše dve funkcie:

AWSTemplateFormatVersion: '2010-09-09' Transformácia: 'AWS :: Serverless-2016-10-31' Popis: Baeldung Príklad serverového aplikačného modelu Zdroje: StorePersonFunction: Typ: AWS :: Serverless :: Vlastnosti funkcie: Handler: com.baeldung .lambda.apigateway.APIDemoHandler :: handleRequest Runtime: java8 Časový limit: 15 Veľkosť pamäte: 512 CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar Pravidlá: DynamoDBCrudPolicy Prostredie: Premenné: TABLE_NAME:! Udalosti PersonTable: Ref. StoreApi: Typ: Api Vlastnosti: Cesta: / osoby Metóda: PUT RestApiId: Ref: MyApi GetPersonByHTTPParamFunction: Typ: AWS :: Serverless :: Vlastnosti funkcií: Obsluha: com.baeldung.lambda.apigateway.APIDemoHandler :: handleGetByParam Runtime: java8 Timeout : 15 MemorySize: 512 CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar Politiky: DynamoDBReadPolicy Prostredie: Premenné: TABLE_NAME:! Ref Udalosti PersonTable: GetByPathApi: Typ: Vlastnosti API: Cesta: / osob / { id} Metóda: GET RestApiId: Ref: MyApi GetByQueryApi: Typ: Správne API s: Cesta: / osoby Metóda: GET RestApiId: Ref: MyApi

Ako vidíme, každá funkcia má rovnaké vlastnosti:

Psovod definuje logiku funkcie. Pretože používame Java, je to názov triedy vrátane balíka v spojení s názvom metódy.

Beh programu definuje, ako bola funkcia implementovaná, čo je v našom prípade Java 8.

Čas vypršal definuje, ako dlho môže vykonanie kódu trvať najviac predtým, ako AWS ukončí vykonávanie.

MemorySizedefinuje veľkosť pridelenej pamäte v MB. Je dôležité vedieť, že AWS priraďuje zdroje CPU proporcionálne MemorySize. Takže v prípade funkcie náročnej na procesor bude možno potrebné zvýšiť MemorySize, aj keď funkcia toľko pamäte nepotrebuje.

CodeUridefinuje umiestnenie kódu funkcie. Momentálne odkazuje na cieľový priečinok v našom miestnom pracovnom priestore. Keď svoju funkciu nahráme neskôr pomocou CloudFormation, dostaneme aktualizovaný súbor s odkazom na objekt S3.

Postupymôže obsahovať sadu politík IAM spravovaných AWS alebo šablón politík špecifických pre SAM. Používame zásady špecifické pre SAM DynamoDBCrudPolicy pre StorePersonFunction a DynamoDBReadPolicy pre GetPersonByPathParamFunction a GetPersonByQueryParamFunction.

Životné prostrediedefinuje vlastnosti prostredia za behu. Na uchovanie názvu našej tabuľky DynamoDB používame premennú prostredia.

Dianiamôže obsahovať množinu udalostí AWS, ktoré musia byť schopné túto funkciu spustiť. V našom prípade definujeme Udalosť typu Api. Unikátna kombinácia cesta, HTTP Metódaa RestApiId spája funkciu s metódou nášho API, ktorú si zadefinujeme v nasledujúcej časti.

Celý zoznam podporovaných Funkcia vlastnosti nájdete v oficiálnej špecifikácii.

4.4. Definícia API ako súbor Swagger

Po definovaní tabuľky a funkcií DynamoDB môžeme teraz definovať API.

Prvou možnosťou je definovať naše API inline pomocou formátu Swagger:

AWSTemplateFormatVersion: '2010-09-09' Transformácia: 'AWS :: Serverless-2016-10-31' Popis: Baeldung príklad serverového modelu aplikácie Zdroje: MyApi: Typ: AWS :: Serverless :: Api Vlastnosti: StageName: test EndpointConfiguration: REGIONÁLNA DefiníciaBody: naparovanie: „2.0“ informácie: názov: „TestAPI“ cesty: / osoby: získanie: parametre: - meno: „id“ v: „dopyt“ povinný: true typ: „reťazec“ x-amazon-apigateway-request -validator: "Overiť parametre reťazca dotazu a \ \ hlavičky" x-amazon-apigateway integrácia: uri: Fn :: Sub: arn: aws: apigateway: $ {AWS :: Region}: lambda: cesta / 2015-03- 31 / functions / $ {GetPersonByHTTPParamFunction.Arn} / volanie odpovede: {} httpMethod: "POST" typ: "aws_proxy" put: x-amazon-apigateway integration: uri: Fn :: Sub: arn: aws: apigateway: $ {AWS :: Region}: lambda: path / 2015-03-31 / functions / $ {StorePersonFunction.Arn} / vyvolané odpovede: {} httpMethod: "POST" typ: "aws_proxy" / osobám / {id}: get: parametre: - name: "id" in: "path" required: true type: "string" odpovede: {} xa integrácia mazon-apigateway: uri: Fn :: Sub: arn: aws: apigateway: $ {AWS :: Region}: lambda: path / 2015-03-31 / functions / $ {GetPersonByHTTPParamFunction.Arn} / odpovede na volanie: { } httpMethod: typ „POST“: „aws_proxy“ x-amazon-apigateway-request-validátory: Overiť parametre a hlavičky reťazcov dotazu: validateRequestParameters: true validateRequestBody: false

Náš Api má tri vlastnosti: Pseudonymdefinuje fázu API, EndpointConfigurationdefinuje, či je API regionálne alebo okrajovo optimalizované, a DefiníciaTelo obsahuje skutočnú štruktúru API.

V DefiníciaTelo, definujeme tri parametre: naparovať sa verzia ako “2.0”, info: nadpis: ako „TestAPI“, ako aj súbor cesty.

Ako vidíme, cesty predstavujú štruktúru API, ktorú sme predtým museli manuálne definovať. The cesty v Swagger sú ekvivalentné zdrojom v konzole AWS. Len tak, každý cesta môže mať jedno alebo viac slovies HTTP, ktoré sú ekvivalentné s metódami v konzole AWS.

Každá metóda môže mať jeden alebo viac parametrov, ako aj validátor požiadaviek.

Najzaujímavejšou časťou je atribút integrácia x-amazon-apigateway, čo je rozšírenie AWagger špecifické pre AWS:

uri určuje, ktorá funkcia Lambda sa má vyvolať.

odpovede určiť pravidlá, ako transformovať odpovede vrátené funkciou. Pretože používame integráciu Lambda Proxy, nepotrebujeme žiadne konkrétne pravidlo.

typu definuje, že chceme použiť integráciu Lambda Proxy, a tým musíme nastaviť httpMetóda do „POST“, pretože to očakávajú funkcie Lambda.

Celý zoznam podporovaných Api vlastnosti nájdete v oficiálnej špecifikácii.

4.5. Implicitná definícia API

Druhou možnosťou je definovať API implicitne v rámci prostriedkov funkcie:

AWSTemplateFormatVersion: '2010-09-09' Transformácia: 'AWS :: Serverless-2016-10-31' Popis: Príklad aplikačného modelu Baeldung bez servera s implicitnou definíciou API Globals: Api: EndpointConfiguration: REGIONÁLNY názov: "TestAPI" Zdroje: StorePersonFunction: Typ: AWS :: Bez servera :: Vlastnosti funkcie: Obsluha: com.baeldung.lambda.apigateway.APIDemoHandler :: handleRequest Runtime: java8 Časový limit: 15 Veľkosť pamäte: 512 CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT Politiky .jar: - DynamoDBCrudPolicy: TableName:! Ref PersonTable Prostredie: Premenné: TABLE_NAME:! Ref PersonTable Udalosti: StoreApi: Typ: Vlastnosti API: Cesta: / osob Metóda: PUT GetPersonByHTTPParamFunction: Typ: AWS :: Serverless :: Vlastnosti: Obslužný program: com.baeldung.lambda.apigateway.APIDemoHandler :: handleGetByParam Runtime: java8 Časový limit: 15 Veľkosť pamäte: 512 CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar Pravidlá: - DynamoDBReadPolicy: TableName:! Ref. Prostredie PersonTable: Premenné: TABLE_NAME:! Ref PersonTable E. vents: GetByPathApi: Typ: Vlastnosti API: Cesta: / osob / {id} Metóda: GET GetByQueryApi: Typ: Vlastnosti API: Cesta: / osôb Metóda: ZÍSKAŤ

Ako vidíme, naša šablóna sa teraz mierne líši: Nie je AWS :: Bez serverov :: Api zdroj.

CloudFormation však berie Diania atribúty typu Api ako implicitná definícia a aj tak vytvorí API. Hneď ako otestujeme našu aplikáciu, uvidíme, že sa správa rovnako ako pri explicitnom definovaní API pomocou Swagger.

Okrem toho existuje a Globály oddiel, kde môžeme definovať názov nášho API, ako aj to, že náš koncový bod bude regionálny.

Nastáva iba jedno obmedzenie: pri implicitnom definovaní API nemôžeme nastaviť názov scény. Preto AWS vytvorí scénu s názvom Prod v každom prípade.

5. Nasadenie a test

Po vytvorení šablóny môžeme teraz pokračovať v nasadení a testovaní.

Za týmto účelom nahráme náš funkčný kód do S3 pred spustením skutočného nasadenia.

Na záver môžeme našu aplikáciu otestovať pomocou ľubovoľného klienta HTTP.

5.1. Načítanie kódu do S3

V prvom kroku musíme nahrať funkčný kód do S3.

Môžeme to urobiť tak, že zavoláme CloudFormation cez AWS CLI:

$> aws cloudformation package --template-file ./sam-templates/template.yml --s3-bucket baeldung-sam-bucket --output-template-file ./sam-templates/packaged-template.yml

Týmto príkazom spustíme CloudFormation, aby prevzal funkčný kód uvedený v CodeUri: a nahrať ho na S3. CloudFormation vytvorí zabalený-šablóna.yml súbor, ktorý má rovnaký obsah, až na to CodeUri: teraz ukazuje na objekt S3.

Pozrime sa na výstup CLI:

Načítava sa do 4b445c195c24d05d8a9eee4cd07f34d0 92702076 / 92702076.0 (100,00%) Úspešne zabalené artefakty a výstupná šablóna bola zapísaná do súboru packaged-template.yml. Vykonajte nasledujúci príkaz na nasadenie zabalenej šablóny aws cloudformation deploy --template-file c: \ zz_workspace \ tutorials \ aws-lambda \ sam-templates \ packaged-template.yml --stack-name 

5.2. Nasadenie

Teraz môžeme spustiť skutočné nasadenie:

$> aws cloudformation deploy --template-file ./sam-templates/packaged-template.yml --stack-name baeldung-sam-stack --capability CAPABILITY_IAM

Pretože náš zásobník potrebuje aj roly IAM (napríklad roly funkcií pre prístup k našej tabuľke DynamoDB), musíme to výslovne potvrdiť uvedením –Parametre schopností.

A výstup CLI by mal vyzerať takto:

Čaká sa na vytvorenie sady zmien .. Čaká sa na dokončenie vytvárania / aktualizácie zásobníka Úspešne vytvorený / aktualizovaný zásobník - baeldung-sam-stack

5.3. Preskúmanie nasadenia

Po nasadení môžeme skontrolovať výsledok:

$> aws cloudformation describe-stack-resources --stack-name baeldung-sam-stack

CloudFormation zobrazí zoznam všetkých zdrojov, ktoré sú súčasťou nášho zásobníka.

5.4. Test

Na záver môžeme našu aplikáciu otestovať pomocou ľubovoľného klienta HTTP.

Pozrime sa na nejakú ukážku curl príkazy, ktoré môžeme pri týchto testoch použiť.

StorePersonFunction:

$> curl -X PUT '//0skaqfgdw4.execute-api.eu-central-1.amazonaws.com/test/persons' \ -H 'content-type: application / json' \ -d '{"id": 1, "name": "John Doe"} '

GetPersonByPathParamFunction:

$> curl -X ZÍSKAŤ '//0skaqfgdw4.execute-api.eu-central-1.amazonaws.com/test/persons/1' \ -H 'content-type: application / json'

GetPersonByQueryParamFunction:

$> curl -X ZÍSKAŤ '//0skaqfgdw4.execute-api.eu-central-1.amazonaws.com/test/persons?id=1' \ -H 'content-type: application / json'

5.5. Vyčistiť

Nakoniec to môžeme vyčistiť odstránením zásobníka a všetkých zahrnutých zdrojov:

AWS cloudformation delete-stack --stack-name baeldung-sam-stack

6. Záver

V tomto článku sme sa pozreli na AWS Serverless Application Model (SAM), ktorý umožňuje popis na základe šablón a automatické nasadenie aplikácií bez servera na AWS.

Podrobne sme diskutovali o nasledujúcich témach:

  • Základy aplikačného modelu bez servera (SAM), ako aj základná CloudFormation
  • Definícia aplikácie bez servera pomocou syntaxe šablóny SAM
  • Automatizované nasadenie aplikácie pomocou CLI CloudFormation

Ako obvykle je všetok kód tohto článku k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found