Kuinka luoda palvelimeton URL-lyhennyslaite AWS Lambdan ja S3: n avulla

Grafiikan käyttäminen SAP Scenes Pack -sovelluksesta

Koko tämän viestin ajan rakennamme palvelimettomia URL-ohennuksia Amazon Web Services (AWS) Lambdan ja S3: n avulla. Vaikka et vaadi aiempaa kokemusta AWS: stä, oletan tuntevan jonkin verran ES6 JavaScriptiä ja Node.js.

Ironista kyllä, URL-osoittimistamme luodut URL-osoitteet ovat usein pidempiä kuin URL-osoitteet, joihin ne uudelleenohjaavat - tämä johtuu siitä, että käytämme S3-ämpäri-oletusverkkosivuston oletusosoitetta. Viestin loppua kohden keskustelen siitä, kuinka voit lisätä mukautetun verkkotunnuksen tämän rajoituksen kiertämiseksi.

Katso demo

Katso koodi Githubista

AWS: n aloittaminen on suhteellisen helppoa, ja silti havaitaan monimutkaisuus. Käytettävissä olevien palvelujen määrä voi olla pelottava, koska monet niistä ovat toiminnallisesti päällekkäisiä. Hidas ja intuitiivinen AWS-hallintakonsoli ei auta, eikä tekstiä raskas online-dokumentaatio. Toivon kuitenkin, että koko tämän viestin ajan voin osoittaa, että paras tapa ottaa käyttöön AWS-palveluita on käyttää inkrementaalista lähestymistapaa ja voit aloittaa aloittamalla vain kourallisilla palveluilla.

Käytämme palvelimettomia puitteita vuorovaikutuksessa AWS: n kanssa, joten AWS-hallintakonsoliin ei tarvitse kirjautua. Serverless Framework tarjoaa abstraktiot AWS: stä ja auttaa tarjoamaan projektirakennetta ja järkeviä kokoonpanoasetuksia. Jos haluat oppia lisää ennen kuin aloitamme, sinun pitäisi lukea heidän asiakirjansa.

Arkkitehtuuri

Ennen kuin siirrymme kehitykseen, tarkastellaan ensin AWS-palveluita, joita me rakennamme URL-lyhenteemme luomiseen.

Käytämme verkkosivustomme isäntänä Amazon S3-tiedostojen tallennuspalvelua. Konfiguroimme S3-ämpärimme, jota voidaan pitää korkean tason kansiona, palvelemaan staattista verkkosivustoa. Verkkosivusto koostuu staattisesta sisällöstä ja asiakaspuolen komentosarjoista. Palvelinpuolen koodia (kuten esimerkiksi PHP, Ruby tai Java) ei voida suorittaa, mutta se on hieno tapauksemme kannalta.

Käytämme myös vähän tunnettua S3-ominaisuutta, jonka avulla voit määrittää S3-kauhojen sisäisten objektien edelleenlähetyksen lisäämällä vain verkkosivuston uudelleenohjaus-sijainti -arvon kohteen objektin metatietoihin. Asettamalla tämä URL-osoitteeksi selaimet ohjataan HTTP 301 -vastauksen ja sijaintiotsikon kautta.

S3-objektin URL-osoite koostuu S3-kauhaosoitteesta, jota seuraa kohteen nimi.

http: // [ämpäri-name] .s3-sivusto-EU-länsi-1.amazonaws.com / [kohde-name]

Seuraava on esimerkki S3-kauhaobjektin muodosta eu-länsi-1-alueelle.

http://serverless-url-shortener.s3-website-eu-west-1.amazonaws.com/6GpLcdl

Tästä objektinimestä ”6GpLcdl” yllä olevan esimerkin URL-osoitteen lopussa tulee lyhennettyjen URL-osoitteidemme lyhytkoodi. Tätä toimintoa käyttämällä saadaan alkuperäisen URL-osoitteen uudelleenohjaus ja tallennusominaisuudet. Emme vaadi tietokantaa, jotta voidaan tallentaa yksityiskohdat siitä, mihin lyhytkoodi osoittaa mihin URL-osoitteeseen, koska nämä tiedot tallennetaan sen sijaan itse esineelle.

Luomme Lambda-toiminnon näiden S3-objektien tallentamiseksi asianmukaisilla metatiedoilla S3-ämpäriomme.

Voit myös vaihtoehtoisesti käyttää selaimen AWS SDK -asiakaspuolta objektien tallentamiseen. Mutta on parempi, että tämä toiminto erotetaan erilliseksi palveluksi. Se tarjoaa etuna siitä, että sinun ei tarvitse huolehtia turvatietojen paljastamisesta, ja se on laajennettavissa tulevaisuudessa. Karttamme Lambda-toiminnon päätepisteeksi API-yhdyskäytävässä, jotta siihen pääsee API-puhelun kautta.

Päästä alkuun

Siirry Serverless Framework -asiakirjojen luo ja suorita niiden pikaoppaat. Osana asennusprosessia sinun on asennettava AWS CLI ja määritettävä AWS käyttöoikeustiedot.

Aloita luomalla package.json-tiedosto projektin juureen.

{
  "name": "serverless-url-shortener",
  "skriptit": {},
  "riippuvuudet": {}
}

Tiedämme, että meidän on käytettävä AWS SDK: ta, joten siirry eteenpäin ja asenna se NPM: stä nyt kirjoittamalla seuraava komento.

npm install aws-sdk --save

Luo nyt config.json-tiedosto myös projektin juureen. Käytämme tätä tallentaaksemme muokattavissa olevat käyttäjän asetukset JSON-muodossa.

Lisää seuraavat avaimet asetusarvoillesi sopivilla arvoilla.

  • BUCKET - nimi, jota haluat käyttää S3-kauhaasi. Siitä tulee osa lyhyttä URL-osoitetta, jos et halua lisätä mukautettua verkkotunnusta. Sen on oltava ainutlaatuinen käytettävälle alueelle, jotta älä valitse jotain liian yleistä. Mutta älä huolestu, jos valitsemasi ämpäri nimi on jo käytössä, sinua varoitetaan palvelimettoman CLI: n kautta käyttöönoton yhteydessä.
  • ALUE - AWS-alue, johon haluat ottaa käyttöön. Suorituskyvyn kannalta on parasta valita alue, joka on käyttäjillesi lähinnä. Jos seuraat vain opetusohjelmaa, käytän eu-länsi-1: tä.
  • STAGE - vaihe, johon asennetaan. Yleensä sinulla on lavastusympäristö, joka toistaa saman kokoonpanon kuin tuotantoympäristösi. Tämän avulla voit testata ohjelmistojulkaisuja tuhoamatta. Koska tämä on opetusohjelma, aion käyttää sitä dev-vaiheessa.

Config.json-tiedostosi pitäisi näyttää seuraavalta samanlaiselta, kun se on valmis.

{
  "BUCKET": "sinun-kauhasi nimi",
  "ALUE": "eu-länsi-1",
  "STAGE": "dev",
}

Luo seuraavaksi toinen tiedosto projektin juureen, serverless.yml. Tämä pitää yllä Serverless Framework -kokoonpanomme, joka on muotoiltu YAML-merkintäkielellä.

Tämän tiedoston sisällä aloitamme määrittelemällä ympäristömme. Huomaa, kuinka voimme viitata muuttujiin, jotka on aiemmin tallennettu config.json-tiedostoon.

palvelu: serverless-url-shortener

tarjoaja:
  nimi: aws
  ajonaika: nodejs6.10
  vaihe: $ {tiedosto (config.json): STAGE}
  alue: $ {tiedosto (config.json): REGION}
  iamRoleStatements:
    - Vaikutus: Salli
      Toiminta:
        - s3: PutObject
      Resurssi: "arn: aws: s3 ::: $ {tiedosto (config.json): BUCKET} / *"

IamRoleStatements-osio viittaa henkilöllisyyden ja pääsyn hallintaan, jota käytetään Lambda-käyttöoikeuksien asettamiseen. Täällä annamme Lambdalle kirjallisen pääsyn S3-kauhaan.

Objektien tallentamiseksi tarvitsemme luvan s3: PutObject-toiminnon suorittamiseen. Muita käyttöoikeuksia voidaan lisätä tähän, jos ne vaaditaan projektissa. Katso muut käytettävissä olevat toiminnot S3-asiakirjoista.

Resurssi-arvoksi asetetaan S3-kauhan Amazon-resurssin nimi, jota käytetään tietyn AWS-resurssin yksilöimiseen. Tämän tunnisteen muoto riippuu AWS-palvelusta, johon viitataan, mutta yleensä niiden muoto on seuraava.

arn: osio: palvelu: alue: tili-ID: resurssi

Palveluntarjoajan alla on toimintojen konfiguraatiomme.

toiminnot:
  store:
    hoitaja: api.handle
    Tapahtumat:
      - http:
          polku: /
          menetelmä: post
          Cors: totta

Tässä määrittelemme sovellusliittymäkokoonpanon ja kartoitamme lambdamme HTTP POST -tapahtumaan API: n perus-URL-osoitteessa. Käsittelijä, jonka arvo on api.handle, viittaa funktioon nimeltä hand, joka viedään api.js: stä (emme tarvitse js-tiedostotunnistetta, koska aiemmin serverless.yml: ssä asetimme ajonaikaiseksi nodejs6.10).

Lambda on tapahtumapohjainen, joten toiminnot suoritetaan vain ennalta määritettyjen liipaisimien perusteella. Tässä määrittelimme HTTP-tapahtuman, mutta tämä olisi voinut olla myös DynamoDB-taulukon tai SQS-jonon laukaisema tapahtuma.

Seuraavaksi määritämme serverless.yml: ssä AWS-resurssit, jotka meidän on toteutettava käyttöönoton yhteydessä CloudFormaation avulla. On syytä mainita, että sinun ei tarvitse välttämättä määrittää resursseja tällä tavalla, voit luoda ne myös AWS-hallintakonsolin avulla. Oikeiden käyttöoikeuksien antaminen ei ole väliä kuinka resurssit luodaan. Mutta määritellessäsi palvelimelle serverless.yml vaadittavat palvelut määrittelet infrastruktuurisi koodiksi ja saat monia etuja tekemällä niin.

”Infrastruktuuri koodina on lähestymistapa laskennan ja verkkoinfrastruktuurin määrittelemiseen lähdekoodilla, jota voidaan sitten käsitellä kuten mitä tahansa ohjelmistojärjestelmää. Tällaista koodia voidaan pitää lähteenhallinnassa, jotta auditoitavuus ja ReproducibleBuilds olisivat testauskäytäntöjen alaisia ​​ja jatkuvan toimituksen täysi kurinalaisuus. "
- Martin Fowler

Lisää ja lisää resurssien määritykset.

resurssit:
  resurssit:
    ServerlessRedirectS3Bucket:
      Tyyppi: AWS :: S3 :: Kauha
      ominaisuudet:
        BucketName: $ {tiedosto (config.json): BUCKET}
        AccessControl: PublicRead
        WebsiteConfiguration:
          IndexDocument: index.html
    ServerlessRedirectS3BucketPolicy:
      Tyyppi: AWS :: S3 :: BucketPolicy
      ominaisuudet:
        Kauha: $ {tiedosto (config.json): BUCKET}
        PolicyDocument:
          Statement:
          - Toiminta:
            - s3: GetObject
            Vaikutus: Salli
            Resurssi:
            - arn: aws: s3 ::: $ {tiedosto (config.json): BUCKET} / *
            Rehtori: "*"

Pyydämme S3-ämpäriresurssia, joka on määritetty käyttämään staattista sivuston isännöintiä, jonka juurdokumenttina on index.html. Hyvästä syystä S3-kauhat ovat oletuksena yksityisiä, joten meidän on luotava S3-kauhatkäytäntö, joka sallii yleisön käyttää sitä. Ilman tätä käytäntöä verkkosivustolla kävijät näyttäisivät sen sijaan todentamattoman virhesanoman.

API: n rakentaminen

Lambda-toimintomme vastaa neljästä tehtävästä.

  1. Tartu URL-osoitteeseen lyhentääksesi käyttäjän lomakkeen lähettämistä.
  2. Yksilöivän lyhytkoodin luominen URL-osoitteelle.
  3. Tallennetaan sopiva uudelleenohjausobjekti S3: een.
  4. Objektin polun palauttaminen asiakkaalle.

Luo käsittelijä

Luo uusi tiedosto, nimeltään api.js, ja vie nuolitoiminto, nimeltään kahva, joka vie kolme argumenttia: tapahtuma, konteksti ja takaisinsoitto. AWS tarjoaa nämä, kun käsittelijää kutsutaan. Tämä tiedosto on Node.js-skripti, ja nuolitoiminnon viemiseksi sinun on liitettävä se moduuliin.exports.

module.exports.handle = (tapahtuma, konteksti, takaisinsoitto) => {
}

Tätä käsittelijää kutsutaan, kun HTTP POST -pyyntö tehdään päätepisteeseemme. Palauttaaksesi API-vastauksen, meidän on käytettävä mukana toimitettua takaisinsoitto-toimintoa, joka on annettu kolmantena nuolifunktion argumentina. Se on virhe-ensimmäinen takaisinsoitto, joka vie kaksi argumenttia. Jos pyyntö on suoritettu onnistuneesti, nolla tulisi siirtää ensimmäiseksi argumentiksi. Toisena argumenttina ohitettu vastausobjekti määrittelee käyttäjälle palautettavan vastauksen tyypin. Vastauksen luominen on yhtä helppoa kuin statusCode- ja rungon tarjoaminen, kuten alla olevassa esimerkissä esitetään.

vakiovaste = {
  statusCode: 201,
  runko: JSON.stringify ({"shortUrl": "http://example.com"})
}
soittopyyntö (nolla, vastaus)

Toisena argumenttina käsittelijälle välitetty kontekstiobjekti sisältää ajonaikaista tietoa, jota emme tarvitse käyttää tässä opetusohjelmassa. Meidän on kuitenkin käytettävä ensimmäiseksi argumenttina siirrettyä tapahtumaa, koska se sisältää lomakkeen lähettämisen URL-osoitteen kanssa lyhennettäväksi.

Jäsentä pyyntö

Alla on esimerkki API-yhdyskäytävätapahtumasta, joka välitetään käsittelijällemme, kun käyttäjä lähettää lomakkeen. Koska rakennamme URL-lyhennysyksikköämme yhden sivun sovellukseksi, lähetämme lomakkeen JavaScriptin avulla, joten sisältötyyppi on sovellus / json eikä sovellus / x-www-muoto-urlenkoodattu.

{
   resurssi:'/',
   polku: '/',
   httpMethod: POST,
   otsikot: {
      Hyväksyä:'*/*',
      'Hyväksy-koodaus': 'gzip, deflate',
      Cache-ohjaus ': "ei-välimuisti,
      'CloudFront-Siirretty-Proto': https,
      'CloudFront-Is-Desktop-Viewer': 'true',
      'CloudFront-Is-Mobile-Viewer': false,
      'CloudFront-Is-SmartTV-Viewer': false,
      'CloudFront-Is-Tablet-Viewer': false,
      'CloudFront-Viewer-Maa': 'GB',
      'Content-type': 'application / json'
      Host: '',
      'Käyttäjä agentti':'',
      'X-Amz-CF Id': '',
      'X-AMZN-Trace-Id': '',
      'X-Siirretty-For': '',
      'X-Siirretty-Port': '443',
      'X-Siirretty-Proto': https
   },
   queryStringParameters: null,
   pathParameters: {},
   stageVariables: null,
   requestContext: {
      polku '/ dev'
      Tilin tunnus:'',
      RESOURCEID: '',
      vaihe: 'dev'
      requestId: '',
      identiteetti: {
         cognitoIdentityPoolId: null,
         ACCOUNTID: null,
         cognitoIdentityId: null,
         Soittaja: null,
         apikey: '',
         sourceIp: '',
         Accesskey: null,
         cognitoAuthenticationType: null,
         cognitoAuthenticationProvider: null,
         userArn: null,
         käyttäjä agentti:'',
         Käyttäjä: null
      },
      resourcePath: '/',
      httpMethod: POST,
      apiId: ''
   },
   kehon: '{ "url": "http://example.com"}',
   isBase64Encoded: false
}

Tarvitsemme vain tapahtuman lomakkeen lähettämisen, jonka voimme saada tarkastelemalla pyyntöelintä. Pyyntöelin tallennetaan jaetuksi JavaScript-esineeksi, jonka voimme tarttua käsittelijemme sisäpuolelle käyttämällä JSON.parse () -sovellusta. Hyödyntämällä JavaScriptin oikosulkuarviointia voimme asettaa tyhjän merkkijonon oletusarvon tapauksissa, joissa URL-osoitetta ei ole lähetetty osana lomakkeen lähettämistä. Tämän avulla voimme käsitellä tapauksia, joissa URL puuttuu ja joissa URL on tyhjä merkkijono, yhtä lailla.

module.exports.handle = (tapahtuma, konteksti, takaisinsoitto) => {
  anna longUrl = JSON.parse (event.body) .url || ''
}

Vahvista URL-osoite

Lisäämme joitain perusvalidointeja varmistaaksemme, että toimitettu URL näyttää lailliselta. Tämän saavuttamiseksi voidaan käyttää useita lähestymistapoja. Mutta tätä opasta varten pidämme sen yksinkertaisena ja käytämme sisäänrakennettua Node.js URL-moduulia. Rakennamme validointimme palauttamaan ratkaisun lupauksen kelvolliselle URL-osoitteelle ja palauttamaan hylätyn lupauksen kelpaamattomalle URL-osoitteelle. JavaScriptin lupaukset voidaan ketjuttaa peräkkäin siten, että yhden lupauksen ratkaisu siirtyy seuraavan menestysten käsittelijälle. Käytämme tätä lupausten ominaisuutta rakentaaksemme hoitajamme. Kirjataan validointitoiminto lupausten avulla.

const url = vaadi ('url')
toiminnon validointi (longUrl) {
  if (longUrl === '') {
    palauta Promise.reject ({
      statusCode: 400,
      viesti: 'URL vaaditaan'
    })
  }
anna parsedUrl = url.parse (longUrl)
  if (parsedUrl.protocol === nolla || parsedUrl.host === nolla) {
    palauta Promise.reject ({
      statusCode: 400,
      viesti: 'URL on virheellinen'
    })
  }
palauta Promise.resolve (longUrl)
}

Vahvistamistoiminnossamme tarkistamme ensin, että URL-osoitetta ei ole asetettu tyhjälle merkkijonolle. Jos niin on, palautamme hylätyn lupauksen. Huomaa, kuinka hylätty arvo on objekti, joka sisältää tilakoodin ja viestin. Käytämme tätä myöhemmin rakentaaksesi sopivan API-vastauksen. Soittaminen jäsentämiseen Node.js-url-moduulista palauttaa URL-objektin, jolla on tiedot, jotka voidaan purkaa merkkijonoargumenttina välitetystä URL-osoitteesta. Osana URL-osoitteen perusvalidointia tarkistamme yksinkertaisesti, voidaanko protokolla (esimerkiksi http) ja isäntä (kuten esimerkki.com) purkaa. Jos jompikumpi näistä arvoista on nolla palautetussa URL-objektissa, oletetaan, että URL on virheellinen. Jos URL-osoite on kelvollinen, palautamme sen osana ratkaistua lupausta.

Palautetaan vastaus

Haarrettuaan URL-osoitteen pyynnöstä kutsumme vahvistusta ja palautamme jokaiselle vaaditulle lisäkäsittelijävaiheelle uuden lupauksen edellisen lupauksen menestyskäsittelijässä. Lopullinen menestyskäsittelijä on vastuussa API-vastauksen palauttamisesta kahvan soittopyynnön kautta. Sitä kutsutaan sekä hylätyistä lupauksista luotuihin virhe-API-vastauksiin että onnistuneisiin API-vastauksiin.

module.exports.handle = (tapahtuma, konteksti, takaisinsoitto) => {
  anna longUrl = JSON.parse (event.body) .url || ''
  vahvistaa (longUrl)
    . sitten (toiminto (polku) {
      anna vastaus = buildResponse (200, 'menestys', polku)
      return Promise.resolve (vastaus)
    })
    .catch (toiminto (virhe) {
      anna vastaus = buildResponse (err.statusCode, err.message)
      return Promise.resolve (vastaus)
    })
    . sitten (toiminto (vastaus) {
      soittopyyntö (nolla, vastaus)
    })
}
function buildResponse (statusCode, viesti, polku = epätosi) {
  anna kehon = {viesti}
  if (polku) runko ['polku'] = polku
  
  palauta {
    otsikot: {
      'Kulunvalvonta-Salli-Alkuperä': '*'
    },
    statusCode: statusCode,
    runko: JSON.stringify (body)
  }
}

Luo URL-lyhytkoodi

Sovellusliittymän on pystyttävä tuottamaan ainutlaatuisia URL-lyhytkoodeja, jotka esitetään tiedostoniminä S3-kauhassa. Koska lyhytkoodi on vain tiedostonimi, sen rakenteessa on suuri joustavuus. Lyhykoodissamme käytetään 7-numeroista aakkosnumeerista merkkijonoa, joka koostuu sekä isoista että pienistä kirjaimista. Tämä tarkoittaa 62 mahdollista yhdistelmää kullekin merkille. Käytämme rekursiota rakentaaksesi lyhytkoodin valitsemalla yhden merkin kerrallaan, kunnes seitsemän on valittu.

toiminto generPath (polku = '') {
  anna merkit = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
  anna sijainti = Math.floor (Math.random () * merkkiä.pituus)
  anna merkki = merkit.charAt (sijainti)
if (polku.pituus === 7) {
  paluu matka
}
returngenePath (polku + merkki)
}

Vaikka mahdollisuus luoda satunnaisesti sama lyhytkoodi on vähäinen (on tosiasiallisesti 0,0000000000000000000000008063365516 mahdollisuus, että kaksi lyhytkoodia on sama), meidän on tarkistettava, onko generoitu lyhytkoodi jo käytössä, minkä voimme tehdä käyttämällä AWS SDK: ta. S3-palvelussa on headObject-menetelmä, joka lataa objektin metatiedot. Voimme tämän avulla testata, onko samannimistä objektia jo olemassa kuin silloin, kun esineeltä ei löydy lupausta koodilla NotFound hylätään. Tämä hylätty lupaus osoittaa, että lyhytkoodi on ilmainen ja sitä voidaan käyttää. Soittaminen headObject-sovellukseen on suorittavampaa kuin sen testaaminen, onko objekti olemassa koko objektin lataavan getObject-tiedoston kautta.

const AWS = vaadi ('aws-sdk')
const S3 = uusi AWS.S3 ()
toiminto isPathFree (polku) {
  palauta S3.headObject (buildRedirect (polku)). lupaus ()
    . sitten (() => Promise.resolve (false))
    .catch (toiminto (virhe) {
      if (err.code == 'NotFound') {
        return Promise.resolve (totta)
      } muuta {
        return Promise.reject (virhe)
      }
    })
}
funktio buildRedirect (polku, longUrl = false) {
  anna uudelleenohjaus = {
    'Bucket': config.BUCKET,
    'Key': polku
  }
if (longUrl) {
    uudelleenohjaus ['WebsiteRedirectLocation'] = longUrl
  }
palauta uudelleenohjaus
}

Voimme käyttää isPathFree-sovellusta rekursiivisesti löytääksesi ainutlaatuisen objektipolun.

toiminto getPath () {
  palauta uusi lupaus (toiminto (ratkaise, hylkää) {
    anna polku = generoidaPath ()
    isPathFree (polku)
      . sitten (toiminto (isFree) {
        onko ilmainen? ratkaisu (polku): ratkaisu (getPath ())
      })
  })
}

Hyödyntämällä kykyä ketjuttaa lupaukset, palautamme uuden getPath-kutsun, jos isPathFree palauttaa vääriä.

Objektin tallentamiseksi, kun yksilöllinen lyhytkoodi on löydetty, meidän on vain soitettava putObject-menetelmälle AWS SDK S3 -palvelussa. Kääritään tämä funktioon, joka ratkaisee lyhytkoodi, jos putObject-menetelmäkutsu onnistui, ja palauttaa virheobjektin rakentaa API-vastaus, jos sitä ei ollut.

toiminto saveRedirect (uudelleenohjaus) {
  return S3.putObject (uudelleenohjaus) .promise ()
    . sitten (() => Promise.resolve (ohjaa ['avain']))
    .catch (() => Promise.reject ({
      statusCode: 500,
      viesti: 'Virhe tallennettaessa uudelleenohjausta'
  })
}

Edellä olevia toimintoja hyödyntämällä voimme lisätä kaksi uutta lupausmenestysten käsittelijää API-päätepisteemme viimeistelyyn. Meidän on palautettava getPath ensimmäisestä lupausmenestysten käsittelijästä, joka ratkaisee ainutlaatuisen URL-osoitteen lyhyen koodin. Palauttamalla saveRedirect uudelleenohjausobjektilla, joka on rakennettu käyttämällä tätä ainutlaatuista lyhytkoodia toisessa menestyskäsittelijässä, tallennetaan objekti S3-ämpäriin. Tämän objektin polku voidaan sitten palauttaa asiakkaalle osana API-vastausta. Hoitajamme pitäisi nyt olla valmis.

module.exports.handle = (tapahtuma, konteksti, takaisinsoitto) => {
  anna longUrl = JSON.parse (event.body) .url || ''
  vahvistaa (longUrl)
    . sitten (toiminto () {
      palauta getPath ()
    })
    . sitten (toiminto (polku) {
      anna uudelleenohjaus = buildRedirect (polku, longUrl)
      palauta saveRedirect (uudelleenohjaus)
    })
    . sitten (toiminto (polku) {
      anna vastaus = buildResponse (200, 'menestys', polku)
      return Promise.resolve (vastaus)
    })
    .catch (toiminto (virhe) {
      anna vastaus = buildResponse (err.statusCode, err.message)
      return Promise.resolve (vastaus)
    })
    . sitten (toiminto (vastaus) {
      soittopyyntö (nolla, vastaus)
    })
}

Asenna sovellusliittymä

Suorita palvelimittainen käyttöönotto päätteessäsi sovellusliittymän käyttöönottamiseksi AWS: ään. Tämä asettaa S3-kauhamme ja palauttaa päätepisteen URL-osoitteen. Pidä päätepisteen URL-osoite kätevänä, koska tarvitsemme sitä myöhemmin.

Palvelimeton: Pakkauspalvelu ...
Palvelimeton: lukuun ottamatta kehitysriippuvuuksia ...
Palvelimeton: CloudFormation-tiedoston lataaminen S3: een ...
Palvelimeton: esineiden lataaminen ...
Palvelimeton: palvelun .zip-tiedoston lataus S3: een (5,44 Mt) ...
Palvelimeton: Mallin validointi ...
Palvelimeton: Päivitetään pinoa ...
Palvelimeton: Pinopäivityksen etenemisen tarkistaminen ...
..............
Palvelimeton: pinon päivitys valmis ...
Palvelun tiedot
palvelu: serverless-url-shortener
vaihe: dev
alue: eu-länsi-1
pino: serverless-url-shortener-dev
api-avaimet:
  Ei mitään
tehomuuttujilla
  POST - https://t2fgbcl26h.execute-api.eu-west-1.amazonaws.com/dev/
toiminnot:
  myymälä: serverless-url-shortener-dev-store
Palvelimeton: vanhojen palveluversioiden poistaminen ...

Etuosan luominen

Autamme käyttöliittymäsuunnittelua hyödyntämällä PaperCSS-kehystä. Otamme myös jQueryn yksinkertaistamaan DOM: n kanssa työskentelyä ja AJAX-kyselyiden tekemistä. On syytä huomata, että tuotantoympäristöön haluat todennäköisesti vetää kaksi kevyempää riippuvuutta, mutta koska tämä on vain opetusohjelma, mielestäni se on hyväksyttävä.

Luo staattinen kansio, jotta meillä on jonkin verran tallentaa käyttöliittymäkoodimme.

Lataa riippuvuudet

Tallenna kopio paper.min.css ja jquery-3.2.1.min.js äskettäin luotuun staattiseen kansioon. Nämä ovat PaperCSS-kehyksen ja jQuery-kirjaston minimoidut versiot.

Lisää HTML

Luo uusi tiedosto nimeltä index.html staattisen kansion sisään ja lisää tarvittava HTML. Tarvitsemme lomakkeen, jossa on URL-syöttö ja painike lomakkeen lähettämiseen. Tarvitsemme myös jonnekin, jotta laitetaan kaikkien API-kutsujen tulos, mikä onnistuneelle API-puhelulle olisi lyhennetty URL ja epäonnistuneelle API-puhelulle tämä olisi virheviesti.




  
  
   Serverless url shortener