Slik håndterer Amazon S3 filer ut av Server-Side Code


I denne opplæringen, vi skal se på håndtering av Amazon S3 fra din server-side kode. S3 (som står for Simple Storage Service) er en del av Amazon Web Services. Det er egentlig et sted å lagre filer. Amazon lagrer filene i sine massive datasentre som er fordelt over hele planeten. Filene blir automatisk sikkerhetskopiert og dupliseres for å bidra til at de ikke får tapt og er alltid tilgjengelig. Du kan beholde filene privat, slik at bare du kan laste dem ned, eller offentligheten slik at alle kan få tilgang til dem.

Når det gjelder utvikling av programvare, gir S3 et fint sted å lagre filene dine uten å måtte knele din egne servere. Prisen er ekstremt lav (øre per GB lagring og overføring), som gjør det til et godt alternativ for å redusere demans på egne servere. Det er API-er for å legge S3 tilgang til applikasjoner som kjører på webservere, samt fra dine mobile apps.

For å få tilgang til S3, bruker du en fredfylt service og tilgang til den gjennom HTTP samtaler, selv om du kan dess koble fra serveren din, og vanligvis ikke med nettleseren. Det er ikke å si at du ikke tilgang til den fra nettleseren; men det er sikkerhetsproblemer fra å bruke den fra nettleseren. For å få tilgang AWS, trenger du en privat nøkkel. Du ønsker ikke å passere denne private nøkkelen rundt og ved å få tilgang AWS fra nettleseren, det er egentlig ingen måte å holde den private nøkkelen skjult, noe som gjør at andre folk til å begynne å bruke S3 kontoen uten ditt permisson. I stedet vil du vanligvis vil ha tilgang til AWS fra din server, hvor du holder din private nøkkel, og da vil du gi en nettleser-grensesnitt i din server, ikke direkte inn AWS.

Nå som sagt, vi må bestemme på server-side språk. Min favoritt språket i år er node.js, så det er hva jeg skal bruke. Men begrepene gjelde for andre språk

Vanligvis når jeg lære en ny RESTful API, jeg først prøve å lære den direkte HTTP-grensesnittet.; og deretter etter at jeg bestemme om du vil bruke en SDK. Tanken er at ofte RESTful API seg selv kan være litt tungvint, og som sådan utviklerne av API deretter gi SDK på forskjellige språk. Disse SDK gi klasser og funksjoner for å forenkle bruken av API. Men noen ganger APIene seg selv er ganske enkelt å bruke, og jeg vet ikke engang bry med SDK. Andre ganger, SDK-ene virkelig hjelp

AWS har en API som ikke er for vanskelig å bruke direkte, bortsett fra en del, etter min mening. Sikkerheten. For å ringe inn i AWS API, må du registrere hver HTTP kall. Signaturen er egentlig en krypterings hash av parametrene du passerer, sammen med din private nøkkel. På denne måten Amazon kan vite samtalen sannsynlig kom fra personen eller programmet den hevder å komme fra. Men sammen med de nevnte parametre, du også gi et tidsstempel med samtalen. AWS vil sjekke at tidsstempel og hvis mer enn 15 minutter har gått siden den tidsstempel, vil AWS utstede en feil. Med andre ord, API-kall utløper. Når du konstruere et API-kall, må du ringe det raskt, eller AWS vil ikke akseptere det.

Legge i kryptering hasj er litt komplisert uten noen helper kode. Og det er en grunn til at jeg foretrekker å bruke SDK-ene når du bruker Amazon, heller enn å foreta direkte HTTP samtaler. SDK inkluderer koden for å registrere samtalene for deg. Så mens jeg vanligvis liker å mestre HTTP samtaler direkte og deretter bare bruke SDK hvis jeg finner det hjelper, i dette tilfellet, jeg hopper rett til SDK.

Bruke AWS SDK
< p> La oss komme i gang. Lag en katalog å holde en test app i node.js. Nå la oss legge til AWS SDK. Type:

 NPM installere AWS-SDK 

For å bruke SDK, må du lagre legitimasjon. Du kan enten lagre dem i en egen konfigurasjonsfil, eller du kan bruke dem riktig i koden. Nylig en sikkerhetsekspert vet jeg fikk veldig opprørt om programmerere lagring tastene rett i koden sin; men siden dette er bare en test, kommer jeg til å gjøre det uansett. Dokumentasjonen AWS-SDK viser deg hvordan du lagrer legitimasjon i en egen fil

For å få legitimasjon, klikk på navnet ditt i øverste høyre hjørne av konsollen.; deretter i rullegardin klikk sikkerhetsinformasjon. Herfra kan du administrere og opprette sikkerhetsnøklene. Du må utvide hurtigtaster seksjon og få eller opprette både en Access Key ID og en hemmelig tilgangsnøkkel.

Ved hjelp av din favoritt teksteditor, opprette en fil som heter test1.js. I denne koden, kommer vi til å lage en S3 bøtte. S3 bucket navn må være unikt blant alle brukere. Siden jeg nettopp opprettet en bøtte kalt s3demo2015, vil du ikke være i stand til. Erstatte et navn som du ønsker å prøve, og du kan komme til å se feilkoden du får tilbake. Legg denne koden til filen:

 Var AWS = krever ('AWS-SDK'); aws.config.update ({accessKeyId: 'ABCDEF ", secretAccessKey:' 123456 ', region:« oss-vest -2 '});. 

men erstatt abcdef med tilgangsnøkkel ID, og ​​123 456 med din hemmelige tilgangsnøkkel

Formålet returnert av require (' AWS-SDK ') samtalen inneholder flere funksjoner som tjene som konstruktører for ulike AWS tjenester. En er for S3. Legg til følgende linje til slutten av filen din til å ringe S3 konstruktør og lagre nytt objekt i en variabel kalt s3:

 Var s3 = new aws.S3 (); 

Og så legge til denne linjen slik at vi kan inspisere medlemmene av vår nye s3 objekt:

 console.log (s3); 

Nå kjører det vi har så langt:

 node test1.js 

Du bør se en utgang som inkluderer flere medlemmer som inneholder data, for eksempel din påloggingsinformasjon og endepunktene. Siden dette er en fredfylt grensesnitt, som gjør det bruk av nettadresser som er kjent som endepunkter. Disse er nettadresser som din app skal ringe for å manipulere S3 bøtter.

Siden vi egentlig ikke trenger denne produksjonen å bruke S3, gå videre og ta av console.log linje.

Lag en bøtte

Neste vi kommer til å legge til kode for å lage en bøtte. Du kan bare bruke de medfølgende endepunktene og foreta en HTTP-forespørsel selv. Men, siden vi bruker SDK og det gir wrapper funksjoner, vil vi bruke wrapper funksjoner.

Funksjonen for å skape en bøtte er ganske enkelt kalt createBucket. (Denne funksjonen er en del av prototypen for den aws.S3 konstruktør det er derfor det ikke dukket opp i console.log utgang.) Fordi node.js er synkron, å ringe createBucket funksjon, du gir sammen med andre parametere en tilbakeringingsfunksjon. Legg til følgende kode i kildefilen, men ikke endre navnet s3demo2015 til din egen bøtte; denne måten kan du se feilen du får hvis du prøver å lage en bøtte som allerede eksisterer:

 s3.createBucket ({Bucket: 's3demo2015'}, funksjon (err, resp) {if (err ) {console.log (err);}}); 

Nå kjører det du har, igjen med:

 node test1.js 

Du vil se resultatet av feilen. Vi bare skriver ut den rå gjenstand; i en faktisk app, vil du sannsynligvis ønske å returnere bare feilmeldingen til brukeren, noe som er err.message, og deretter skrive den fulle err objektet til dine feilloggfiler. (Du kan holde loggfiler, ikke sant?)

Også, hvis du setter på feil taster, i stedet for å få en melding om bøtte allerede eksisterende, vil du se en feilmelding om sikkerhetsnøkkelen blir galt.

Nå endrer s3demo2015 strengen til et navn du ønsker å faktisk lage og oppdatere koden for å skrive ut svaret:

 s3.createBucket ({Bucket: 's3demo2015'}, funksjon ( err, resp) {if (err) {console.log (err); avkastning;} console.log (resp);}); 

Kjør det igjen, og hvis du har funnet et unikt navn, får du tilbake en Javascript-objekt med et enkelt medlem:

 {Sted: 'http://s3demo2015.s3.amazonaws.com/'} 

Dette objektet inneholder URL for den nylig opprettede bøtte. Lagre denne nettadressen, fordi du skal bruke det senere i denne opplæringen.

Kommentar bøtte kode

Nå kunne vi sette ekstra kode på innsiden av tilbakeringing hvor vi bruke bøtte vi opprettet. Men fra et praktisk ståsted, kan vi ikke ha det. I dine egne apps, kan du bare tidvis å skape en bøtte, men for det meste ved hjelp av en bøtte som du allerede har opprettet. Så hva vi skal gjøre er å kommentere ut bøtte etableringen kode, lagre den slik at vi kan finne den senere som et eksempel, men ikke bruke det igjen her:

 Var AWS = krever ('AWS-SDK '); aws.config.update ({accessKeyId:' ABCDEF ", secretAccessKey: '123456', region: 'oss-vest-2'}); Var s3 = new aws.S3 (); /* s3.createBucket ( {Bucket: 's3demo2015'}, funksjon (err, resp) {if (err) {console.log (err); avkastning;} console.log (resp); for (navn på resp) {console.log (navn);}}); * /
Legg kode til bøtte

Nå vil vi legge til kode som bare bruker bøtte vi opprettet. S3 er ikke spesielt komplisert; det er hovedsakelig et lagringssystem, som gir måter å lagre filer, lese filer, slette filer, og liste opp filene i en bøtte. Du kan også liste bøtter og slett bøtter. Det er sikkerhetsalternativer, samt, som du kan konfigurere, for eksempel angi om en fil er tilgjengelig for alle eller ikke. Du finner hele listen her.

La oss legge til kode som vil laste opp en fil og gjøre filen tilgjengelig for alle. I S3 språkbruk, filene er objekter. Funksjonen vi bruker for opplasting er putObject. Se på denne siden for de som er tilgjengelige for denne funksjonen alternativer. Alternativene er gitt som verdier i et objekt; du deretter passere dette objektet som et parameter til funksjonen. Medlemmer av et objekt i Javascript ikke teknisk har en ordre (selv om Javascript tendens til å opprettholde den rekkefølgen de er opprettet, men du bør ikke stole på det som et faktum), slik at du kan gi disse medlemmene i den rekkefølgen du liker. De to første oppført i dokumentasjonen kreves: Navnet på bøtte og navnet tilordne filen. Filnavnet er gitt som Key:

 {Bucket: 'bucketname', Key: 'filnavn'} 

Du har også i dette objektet sikkerhetsinformasjonen hvis du ønsker å gjøre denne filen offentlig. Som standard kan filene kun leses av deg selv. Du kan lage filene leses eller skrives til av publikum; vanligvis vil du ikke ønsker å gjøre dem skrivbar av publikum. Men vi vil gjøre denne filen leses av publikum. Medlemmet for parameterobjektet for å angi sikkerhets kalles ACL, som står for Access Control List (i motsetning til ligament i vår kne som vi rive). ACL er en streng med angivelse av privilegier. Du kan se alternativene i documenation. Den vi ønsker er "offentlig-lese".

For å virkelig få mest mulig ut av S3, oppfordrer jeg deg til å se gjennom alle alternativene for putObject. Dette vil gi deg en god forståelse av hva alt du kan gjøre med S3. Sammen med det, lese over den generelle S3 dokumentasjon, ikke bare dokumentasjonen SDK. Ett alternativ jeg har brukt er den Oppbevaring. Noen ganger jeg bare trenger å dele en stor fil med et par folk, og ikke trenger de sky lagringskapasiteten på S3. For å spare penger, vil jeg lagre filen med Oppbevaring satt til 'REDUCED_REDUNDANCY'. Filen lagres ikke redundant over AWS skyen, og koster mindre å lagre. Alle disse kan konfigureres gjennom denne parameteren objektet.

Last opp en fil til S3

Nå, la oss gjøre det. Vi vil laste opp en fil til S3. Filen laster vi opp i dette tilfellet vil bare være litt HTML lagret i en tekststreng. På den måten kan vi lett se filen i en nettleser når den er lastet opp. Her er koden for å legge etter kommen-out kode:

 Var html = "< html > < body > < h1 > Velkommen til S3 < /h1 > < /body > < /html > '; s3.putObject ({Bucket:' s3demo2015 ', Key:' minfil.html ', ACL: "offentlig-lese', Body: html}, funksjon (err, resp) {if (err) {console.log (err), retur;} console.log (resp);}); 

Legg merke til det er på ekstra parameter som jeg inkludert; Jeg har lagt dette etter å ha kjørt test for denne artikkelen, og jeg skal forklare det på et øyeblikk

Hvis alt går bra, bør du få tilbake en streng som ligner på dette:.

 {ETAG : '"a8c49e10d2a2bbe0c3e662ee7557e79e"'} 

ETAG er en identifikator som kan brukes til å avgjøre om filen er endret. Dette brukes vanligvis i nettlesere. En nettleser kan være lurt å finne ut om en fil er endret, og hvis ikke, bare vise filen fra hurtigbufferen. Men hvis det er endret, så re-laste ned filen.

Men for å finne ut om filen er endret, vil nettleseren få tak i, sammen med den opprinnelige filen, kalt en lang heksadesimale tallet en ETAG. For å finne ut om filen er endret, vil nettleseren først spørre webserveren for den nyeste ETAG for filen. Serveren vil sende tilbake ETAG. Hvis ETAG er forskjellig fra hva nettleseren har lagret sammen med den lagrede filen, vil nettleseren vet at filen er endret. Men hvis ETAG er det samme, har nettleseren vil vite filen ikke endret og vil ikke bry re-laste det ned, og vil i stedet bruke det som er i cache. Dette gjør at nettet generelt og reduserer mengden av båndbredden som brukes.

Les opplastede fil

Nå at filen er lastet opp, kan du lese den. Bare for å være sikker, kan du gå over til AWS konsollen og se på bøtta. I bildet ovenfor, kan du se filen jeg lastet opp med den foregående kode, samt et par andre filer jeg laget mens han forberedte denne artikkelen, inkludert en jeg nevne senere.

La oss nå se på filen selv. Det er der vi trenger nettadressen som vi kom tilbake da vi skapte bøtte. I vårt eksempel heter vi vår fil minfil.html. Så la oss ta det ved å kombinere nettadressen og filnavnet. Åpne opp en ny fane nettleser og sette dette i adressefeltet, og erstatte den s3demo2015 med navnet på din bøtte:

 https://s3demo2015.s3.amazonaws.com/myfile.html 

(Du kan også få denne nettadressen ved å klikke på filen i AWS konsollen og deretter klikke på knappen Egenskaper) Du vil se HTML-formatert fil, som i følgende bilde:.



Bruk riktig innholdstype

Nå for den siste parameter jeg måtte legge til etter at jeg først opprettet dette eksemplet. Når jeg først har gjort eksempel og pekte min nettleser til URL, i stedet for å vise HTML, lastet ned nettleseren filen. Siden jeg har gjort webutvikling i lang tid, jeg visste hva det betydde: Jeg hadde innholdstypen satt feil. Innholdstypen i utgangspunktet forteller leseren hva slags filen er slik at nettleseren vet hva de skal gjøre med det. Jeg sjekket dokumentasjonen og så at den riktige parameteren objektets medlem kalles innholdstype. Så jeg har lagt den normale innholdstype for HTML, som er "text /html".

Innholdstypen er spesielt viktig her hvis du laster opp CSS og Javascript-filer. Hvis du ikke angir innholdstype for riktig, og legg i CSS eller Javascript fra en HTML-fil, vil nettleseren ikke behandle filene som CSS og Javascript hhv. Så alltid sørge for at du har riktig innholdstype.

Vær også oppmerksom på at vi ikke er begrenset til tekstfiler. Vi kan lagre binærfiler også. Hvis vi skulle kalle den RESTful API manuelt, vil dette bli litt vanskelig. Men Amazon gjorde en god jobb å skape SDK og det laster opp våre filer riktig selv om de er binære. Det betyr at vi kan lese en binær fil i gjennom nodes filsystem (fs) modul, og få tilbake en binær matrise. Vi kan bare passere denne matrisen inn i putObject funksjon, og det vil bli lastet opp på riktig måte.

Bare for å være sikker, jeg satt sammen en liten C ++ program som skriver ut tallet 1. Kompilatoren opprettet en binær fil som kalles en .ute. Jeg endret det foregående kode for å lese i filen og laste den opp til S3. Jeg deretter brukt wget til å trekke ned den opplastede filen og det matchet originalen; Jeg var også i stand til å utføre det, viser at det gjorde faktisk opplasting som en binær fil i stedet blir ødelagt gjennom noen tekstkonvertering.

Konklusjon

S3 er ganske enkel å bruke programmatisk. Nøkkelen er først vite hvordan S3 fungerer, inkludert hvordan å administrere filene dine gjennom bøtter, og hvordan å kontrollere sikkerheten til filene. Deretter finner SDK for språket ditt valg, installere det, og øve skape bøtter og opplasting av filer. Javascript er asynkron av design (fordi det er nødvendig for å slik at web-sider vil ikke fryse opp under nettverkssamtaler som AJAX), og som bærer frem til node. Andre språk bruker ulike tilnærminger, men SDK samtalene vil være lik.

Så når du mestrer S3 SDK, vil du være klar til å legge S3 lagringsplass til dine apps. Og etter det, kan du gå videre til andre AWS tjenester. Ønsker å utforske flere AWS tjenester? Del dine tanker i kommentarfeltet. Anmeldelser