Uvod u AWS Model bez poslužitelja

1. Pregled

U našem prethodnom članku već smo implementirali aplikaciju bez poslužitelja s kompletnim hrpom na AWS, koristeći API Gateway za REST krajnje točke, AWS Lambda za poslovnu logiku, kao i DynamoDB kao bazu podataka.

Međutim, implementacija se sastoji od mnogih ručnih koraka, koji mogu postati neugodni sa sve većom složenošću i brojem okruženja.

U ovom uputstvu sada ćemo razgovarati o tome kako koristiti AWS Model bez poslužitelja (SAM) koji omogućuje opis temeljen na predlošku i automatizirano postavljanje aplikacija bez poslužitelja na AWS.

Detaljno ćemo pogledati sljedeće teme:

  • Osnove aplikacijskog modela bez poslužitelja (SAM), kao i osnovne tvorbe oblaka
  • Definicija aplikacije bez poslužitelja, koristeći sintaksu predloška SAM
  • Automatizirano postavljanje aplikacije, koristeći CloudFormation CLI

2. Osnove

Kao što je prethodno spomenuto, AWS nam omogućuje implementaciju aplikacija potpuno bez poslužitelja, koristeći API Gateway, Lambda funkcije i DynamoDB. Nesumnjivo, to već nudi mnoge prednosti u pogledu izvedbe, cijene i skalabilnosti.

Međutim, nedostatak je taj što nam trenutno treba puno ručnih koraka u AWS konzoli, poput izrade svake funkcije, prijenosa koda, izrade tablice DynamoDB, stvaranja IAM uloga, izrade API-ja i API strukture itd.

Za složene aplikacije i u više okruženja poput testa, postavljanja i produkcije, taj se napor brzo množi.

Tu dolazi do izražaja CloudFormation za aplikacije na AWS-u općenito i Model bez aplikacija (SAM), posebno za aplikacije bez poslužitelja.

2.1. AWS CloudFormation

CloudFormation je AWS usluga za automatsko pružanje resursa AWS infrastrukture. Korisnik definira sve potrebne resurse u nacrtu (koji se naziva predložak), a AWS se brine za pripremu i konfiguraciju.

Sljedeći su pojmovi i koncepti bitni za razumijevanje CloudFormationa i SAM-a:

Predložak je opis aplikacije, kako treba biti strukturiran za vrijeme izvođenja. Možemo definirati skup potrebnih resursa, kao i kako će se ti resursi konfigurirati. CloudFormation pruža zajednički jezik za definiranje predložaka, podržavajući JSON i YAML kao format.

Resursi su gradivni blokovi u CloudFormationu. Resurs može biti bilo što, poput RestApi, Stage of RestApi, Batch Job, DynamoDB tablica, EC2 instanca, mrežno sučelje, IAM uloga i mnogi drugi. Službena dokumentacija trenutno navodi oko 300 vrsta resursa za CloudFormation.

Stog je instancija predloška. CloudFormation brine se za pripremu i konfiguraciju stoga.

2.2. Model aplikacije bez poslužitelja (SAM)

Kao i često, upotreba moćnih alata može postati vrlo složena i neugodna, što je slučaj i s CloudFormationom.

Zbog toga je Amazon predstavio Model bez poslužitelja (SAM). SAM je započeo s tvrdnjom da pruža čistu i izravnu sintaksu za definiranje aplikacija bez poslužitelja. Trenutno ima samo tri vrste resursa, a to su Lambda funkcije, DynamoDB tablice i API-ji.

SAM se temelji na sintaksi predloška CloudFormation, tako da možemo definirati naš predložak pomoću jednostavne sintakse SAM, a CloudFormation će taj obrazac dalje obraditi.

Više detalja dostupno je u službenom spremištu GitHub, kao i unutar AWS dokumentacije.

3. Preduvjeti

Za sljedeći vodič trebat će nam AWS račun. Besplatni račun na razini trebao bi biti dovoljan.

Osim toga, moramo imati instaliran AWS CLI.

Konačno, potreban nam je S3 segment u našoj regiji, koji se može stvoriti putem AWS CLI-a sa sljedećom naredbom:

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

Dok tutorial koristi baeldung-sam-kanta u nastavku, imajte na umu da nazivi segmenata moraju biti jedinstveni, tako da morate odabrati svoje ime.

Kao demonstracijsku aplikaciju upotrijebit ćemo kôd iz Korištenje AWS Lambde s API pristupnikom.

4. Izrada predloška

U ovom ćemo odjeljku izraditi naš predložak SAM.

Prvo ćemo pogledati cjelokupnu strukturu, prije nego što definiramo pojedinačne resurse.

4.1. Struktura predloška

Prvo, pogledajmo cjelokupnu strukturu našeg predloška:

AWSTemplateFormatVersion: '2010-09-09' Transformacija: 'AWS :: Bez poslužitelja-2016-10-31' Opis: Baeldung Primjer modela bez poslužitelja Resursi: PersonTable: Tip: AWS :: Serverless :: SimpleTable Svojstva: # Ovdje definirajte svojstva tablice StorePersonFunction: Tip: AWS :: Bez poslužitelja :: Svojstva funkcije: # Ovdje definirajte svojstva funkcije GetPersonByHTTPParamFunction: Tip: AWS :: Bez poslužitelja :: Svojstva funkcije: # Ovdje definirajte svojstva funkcije MyApi: Tip: AWS :: Bez poslužitelja :: Api svojstva: # Ovdje definirajte svojstva API-ja

Kao što vidimo, predložak se sastoji od zaglavlja i tijela:

Zaglavlje navodi verziju predloška CloudFormation (AWSTemplateFormatVersion), kao i inačica našeg predloška SAM (Transformirati). Također možemo odrediti a Opis.

Tijelo se sastoji od skupa resursa: svaki resurs ima svoje ime, resurs Tip, i skup Svojstva.

Specifikacija SAM trenutno podržava tri vrste: AWS :: Bez poslužitelja :: Api, AWS :: Bez poslužitelja :: Funkcija kao i AWS :: Bez poslužitelja :: SimpleTable.

Kako želimo primijeniti naš primjer aplikacije, moramo ga definirati SimpleTable, dva Funkcije, kao i jedan Api u našem predlošku-tijelu.

4.2. Definicija tablice DynamoDB

Definirajmo sada našu DynamoDB tablicu:

AWSTemplateFormatVersion: '2010-09-09' Transformacija: 'AWS :: Bez poslužitelja-2016-10-31' Opis: Baeldung Primjer modela bez poslužitelja Resursi: PersonTable: Tip: AWS :: Bez poslužitelja :: Svojstva SimpleTable: PrimaryKey: Ime: id Tip: Broj TableName: Osoba

Trebamo definirati samo dva svojstva za naš SimpleTable: naziv tablice, kao i primarni ključ, koji se zove iskaznica i ima tip Broj u našem slučaju.

Potpuni popis podržanih SimpleTable svojstva se mogu naći u službenoj specifikaciji.

Napomena: Kako tablici želimo pristupiti samo pomoću primarnog ključa, AWS :: Bez poslužitelja :: SimpleTable je dovoljno za nas. Za složenije zahtjeve, izvorni tip CloudFormation AWS :: DynamoDB :: Tablica može se koristiti umjesto toga.

4.3. Definicija Lambda funkcija

Dalje, definirajmo naše dvije funkcije:

AWSTemplateFormatVersion: '2010-09-09' Transformacija: 'AWS :: Bez poslužitelja-2016-10-31' Opis: Baeldung Primjer modela bez poslužitelja Resursi: StorePersonFunction: Tip: AWS :: Bez poslužitelja :: Svojstva funkcije: Rukovatelj: com.baeldung .lambda.apigateway.APIDemoHandler :: handleRequest Runtime: java8 Timeout: 15 MemorySize: 512 CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar Politike: DynamoDBCrudPolicy Okruženje: Varijable: TABLE_NAME:! Ref PersonTable Events:! Ref PersonTable StoreApi: Tip: Api Svojstva: Put: / persons Metoda: PUT RestApiId: Ref: MyApi GetPersonByHTTPParamFunction: Tip: AWS :: Bez poslužitelja :: Svojstva funkcije: Rukovatelj: com.baeldung.lambda.apigateway.APIDemoHandler :: handleGetByParam8 Runtime: jantime : 15 MemorySize: 512 CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar Pravila: DynamoDBReadPolicy Okruženje: Varijable: TABLE_NAME:! Ref PersonTable Events: GetByPathApi: Type: Api Properties: Path: / persons / { id} Metoda: GET RestApiId: Ref: MyApi GetByQueryApi: Tip: Api Propertie s: Put: / osobe Metoda: GET RestApiId: Ref: MyApi

Kao što vidimo, svaka funkcija ima ista svojstva:

Rukovatelj definira logiku funkcije. Kako koristimo Javu, to je naziv klase, uključujući paket, u vezi s nazivom metode.

Vrijeme izvođenja definira kako je funkcija implementirana, što je u našem slučaju Java 8.

Pauza definira koliko dugo može trajati izvršenje koda prije nego što AWS prekine izvršenje.

MemorySizedefinira veličinu dodijeljene memorije u MB. Važno je znati da AWS dodjeljuje CPU resurse proporcionalno MemorySize. Dakle, u slučaju funkcije koja zahtijeva CPU, moglo bi se zatražiti povećanje MemorySize, čak i ako funkciji ne treba toliko memorije.

CodeUridefinira mjesto funkcijskog koda. Trenutno se odnosi na ciljnu mapu u našem lokalnom radnom prostoru. Kad kasnije prenesemo našu funkciju pomoću CloudFormation, dobit ćemo ažuriranu datoteku s referencom na S3 objekt.

Politikemože sadržavati skup IAM pravila kojima upravlja AWS ili predloške politika specifičnih za SAM. Koristimo politike specifične za SAM DynamoDBCrudPolicy za StorePersonFunction i DynamoDBReadPolicy za GetPersonByPathParamFunction i GetPersonByQueryParamFunction.

Okolišdefinira svojstva okoline tijekom izvođenja. Koristimo varijablu okruženja za držanje imena naše DynamoDB tablice.

Događajimože sadržavati skup AWS događaja koji će moći aktivirati funkciju. U našem slučaju definiramo Događaj tipa Api. Jedinstvena kombinacija staza, HTTP Metodai a RestApiId povezuje funkciju s metodom našeg API-ja, koju ćemo definirati u sljedećem odjeljku.

Potpuni popis podržanih Funkcija svojstva se mogu naći u službenoj specifikaciji.

4.4. Definicija API-ja kao datoteka Swagger

Nakon definiranja DynamoDB tablice i funkcija, sada možemo definirati API.

Prva je mogućnost definirati naš API ugrađen pomoću Swagger formata:

AWSTemplateFormatVersion: '2010-09-09' Transformacija: 'AWS :: Serverless-2016-10-31' Opis: Baeldung Primjer bezuslužnog modela aplikacije Resursi: MyApi: Tip: AWS :: Serverless :: Api Svojstva: StageName: test EndpointConfiguration: REGIONALNI DefinitionBody: swagger: "2.0" info: title: "TestAPI" staze: / persons: get: parameters: - name: "id" u: "query" required: true type: "string" x-amazon-apigateway-request -validator: "Provjeri parametre niza upita i \ \ zaglavlja" x-amazon-apigateway-integracija: uri: Fn :: Sub: arn: aws: apigateway: $ {AWS :: Region}: lambda: path / 2015-03- 31 / functions / $ {GetPersonByHTTPParamFunction.Arn} / invocations response: {} httpMethod: "POST" type: "aws_proxy" put: x-amazon-apigateway-integracija: uri: Fn :: Sub: arn: aws: apigateway: $ {AWS :: Region}: lambda: path / 2015-03-31 / functions / $ {StorePersonFunction.Arn} / invocations response: {} httpMethod: "POST" type: "aws_proxy" / persons / {id}: get: parametri: - naziv: "id" u: "potreban" put: true vrsta: "string" odgovori: {} xa mazon-apigateway-integracija: uri: Fn :: Sub: arn: aws: apigateway: $ {AWS :: Region}: lambda: path / 2015-03-31 / functions / $ {GetPersonByHTTPParamFunction.Arn} / invocations response: { } httpMethod: "POST" tip: "aws_proxy" x-amazon-apigateway-request-validators: Provjera parametara niza upita i zaglavlja: validateRequestParameters: true validateRequestBody: false

Naše Api ima tri svojstva: StageNamedefinira stupanj API-ja, EndpointConfigurationdefinira je li API regionalni ili rubno optimiziran, i DefinicijaTijelo sadrži stvarnu strukturu API-ja.

U DefinicijaTijelo, definiramo tri parametra: šepurenje inačica kao “2.0”, info: naslov: kao "TestAPI", kao i skup staze.

Kao što vidimo, staze predstavljaju strukturu API-ja, koju smo prije morali definirati ručno. The staze u Swaggeru jednaki su resursima u AWS konzoli. Baš tako, svaki staza može imati jedan ili više HTTP glagola, koji su ekvivalentni metodama u AWS konzoli.

Svaka metoda može imati jedan ili više parametara, kao i validator zahtjeva.

Najuzbudljiviji dio je atribut x-amazon-apigateway-integracija, što je AWS-ovo proširenje za Swagger:

uri određuje koja će se Lambda funkcija pozivati.

odgovori odredite pravila kako transformirati odgovore koje vraća funkcija. Kako koristimo Lambda Proxy Integration, ne trebamo nikakva posebna pravila.

tip definira da želimo koristiti Lambda Proxy Integration i stoga moramo postaviti httpMethod do "OBJAVI", jer to je ono što Lambda funkcije očekuju.

Potpuni popis podržanih Api svojstva se mogu naći u službenoj specifikaciji.

4.5. Implicitna definicija API-ja

Druga opcija je definiranje API-ja implicitno unutar resursa funkcije:

AWSTemplateFormatVersion: '2010-09-09' Transformacija: 'AWS :: Bez poslužitelja-2016-10-31' Opis: Primjer modela aplikacije bez servera Baeldung s implicitnom API definicijom Globali: Api: EndpointConfiguration: REGIONAL Naziv: "TestAPI" Resursi: StorePersonFunction: Tip: AWS :: Bez poslužitelja :: Svojstva funkcije: Rukovatelj: com.baeldung.lambda.apigateway.APIDemoHandler :: handleRequest Runtime: java8 Timeout: 15 MemorySize: 512 CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT .jar politike: - DynamoDBCrudPolicy: TableName:! Ref PersonTable Environment: Varijable: TABLE_NAME:! Ref PersonTable Događaji: StoreApi: Tip: Api Svojstva: Put: / persons Metoda: PUT GetPersonByHTTPParamFunction: Type: AWS :: Serverless :: Function Properties: Rukovatelj: com.baeldung.lambda.apigateway.APIDemoHandler :: handleGetByParam Runtime: java8 Timeout: 15 MemorySize: 512 CodeUri: ../target/aws-lambda-0.1.0-SNAPSHOT.jar Politike: - DynamoDBReadPolicy: TableName: TableName! Okružje PersonTable: Promjenjive: TABLE_NAME:! Ref PersonTable E vents: GetByPathApi: Type: Api Properties: Path: / persons / {id} Metoda: GET GetByQueryApi: Type: Api Properties: Path: / persons Metoda: GET

Kao što vidimo, naš se predložak sada malo razlikuje: nema ga AWS :: Bez poslužitelja :: Api resursa više.

Međutim, CloudFormation uzima Događaji atributi tipa Api kao implicitna definicija i ionako stvara API. Čim testiramo našu aplikaciju, vidjet ćemo da se ponaša isto kao kad izričito definira API pomoću Swaggera.

Osim toga, postoji i Globali odjeljak, gdje možemo definirati naziv našeg API-ja, kao i da će naša krajnja točka biti regionalna.

Događa se samo jedno ograničenje: kada implicitno definiramo API, nismo u mogućnosti postaviti naziv pozornice. Zbog toga će AWS stvoriti pozornicu tzv Produkt u svakom slučaju.

5. Razmještanje i ispitivanje

Nakon izrade predloška, ​​sada možemo nastaviti s postavljanjem i testiranjem.

Za to ćemo prenijeti naš funkcijski kôd na S3 prije pokretanja stvarne implementacije.

Na kraju, našu aplikaciju možemo testirati pomoću bilo kojeg HTTP klijenta.

5.1. Prenos koda na S3

U prvom koraku moramo učitati funkcijski kod na S3.

To možemo učiniti pozivom CloudFormation putem AWS CLI:

$> aws paket za oblikovanje oblaka --template-file ./sam-templates/template.yml --s3-bucket baeldung-sam-bucket --output-template-file ./sam-templates/packaged-template.yml

Ovom naredbom pokrećemo CloudFormation da preuzme kôd funkcije naveden u CodeUri: i da ga prenesete na S3. CloudFormation će stvoriti upakirani-predložak.yml datoteku koja ima isti sadržaj, osim toga CodeUri: sada pokazuje na objekt S3.

Pogledajmo CLI izlaz:

Prijenos u 4b445c195c24d05d8a9eee4cd07f34d0 92702076 / 92702076.0 (100,00%) Uspješno spakirani artefakti i napisani izlazni predložak u datoteku Packaged-template.yml. Izvršite sljedeću naredbu za postavljanje pakiranog predloška aws cloudformation deploy --template-file c: \ zz_workspace \ tutorials \ aws-lambda \ sam-templates \ Packaged-template.yml --stack-name 

5.2. Raspoređivanje

Sada možemo pokrenuti stvarno postavljanje:

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

Kako naš stek također treba IAM uloge (poput uloga funkcija za pristup našoj DynamoDB tablici), moramo izričito priznati da specificiranjem –Parametar sposobnosti.

I CLI izlaz trebao bi izgledati ovako:

Čeka se stvaranje skupa promjena .. Čeka se završetak stvaranja / ažuriranja steka Uspješno kreiran / ažuriran stek - baeldung-sam-stack

5.3. Pregled raspoređivanja

Nakon implementacije možemo pregledati rezultat:

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

CloudFormation će navesti sve resurse koji su dio našeg stoga.

5.4. Test

Napokon, možemo testirati našu aplikaciju pomoću bilo kojeg HTTP klijenta.

Pogledajmo malo uzorka kovrča naredbe koje možemo koristiti za ove testove.

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 GET '//0skaqfgdw4.execute-api.eu-central-1.amazonaws.com/test/persons/1' \ -H 'vrsta sadržaja: application / json'

GetPersonByQueryParamFunction:

$> curl -X GET '//0skaqfgdw4.execute-api.eu-central-1.amazonaws.com/test/persons?id=1' \ -H 'vrsta sadržaja: application / json'

5.5. Počistiti

Na kraju možemo očistiti uklanjanjem stoga i svih uključenih resursa:

aws cloudformation delete-stack - naziv steka baeldung-sam-stack

6. Zaključak

U ovom smo članku pogledali AWS Model bez poslužitelja (SAM) koji omogućuje opis temeljen na predlošku i automatizirano postavljanje aplikacija bez poslužitelja na AWS.

Detaljno smo razgovarali o sljedećim temama:

  • Osnove aplikacijskog modela bez poslužitelja (SAM), kao i temeljna formacija oblaka
  • Definicija aplikacije bez poslužitelja, koristeći sintaksu predloška SAM
  • Automatizirano postavljanje aplikacije, koristeći CloudFormation CLI

Kao i obično, sav kôd za ovaj članak dostupan je na GitHubu.