Sådan bygger du din egen Infura på AWS ved hjælp af serverløse rammer

I en af ​​tidligere artikler har vi demonstreret, hvordan man kører en enkelt mainnet Parity-knude på AWS. I mange tilfælde vil en paritetsknudepunkt være tilstrækkelig, det slår helt sikkert et behov for at stole på ekstern offentlig infrastruktur, ligesom Infura.

Ulemper ved kun at have en knude

I mange situationer er en knude imidlertid simpelthen ikke nok. Jeg kan tænke på flere grunde til, at du muligvis har brug for mere end en knude.

  1. Nedetid. Hvis noden af ​​en eller anden grund skal fjernes for vedligeholdelse, er der ingen knude tilbage. Der vil være nedetid, når der f.eks. Er behov for at opgradere en version af Parity.
  2. Falder ud af synkronisering. Paritet er stor, men ikke fejlfri. Det kan lejlighedsvis falde ud af synkronisering af forskellige årsager. At have flere noder giver os mulighed for midlertidigt at omdirigere trafik fra noder, der er bagefter, og forespørgselsnoder, der er synkroniseret.
  3. Fordelingsbelastning. Der er kun et vist niveau af forespørgsler / sekund på json-rpc, som en enkelt paritetsnode kan opretholde. Json-rpc-grænsefladen bliver langsom over dette niveau, og paritetsnoden falder ud af synk. Dette er især vigtigt, hvis node (r) bruges fra web-dapp interface og antal, og du kan observere daglige pigge i brugerengagement.

Infrastruktur af jsonrpc-proxy

Stort billede af, hvad proxy gør, går som følger:

  1. En liste over URL til noderne for paritet ud skal opbevares i DynamoDB. Der er også en speciel URL kaldet leder, der peger på Infura.
  2. eth_getBlockNumber skal køres på hver af noder fra listen hvert 60. sekund. Resultatet sammenlignes med lederen. For at knudepunktet skal betragtes som sundt, skal det reagere og ikke være mere end 10 blokke bag Infura. Hver knudes sundhedsstatus gemmes på DynamoDB.
  3. Ændring af sundhedsstatus for enhver knude udløser regenerering af proxy config. Proxy-konfiguration er simpelthen en nginx .conf-fil, der konfigurerer en opstrøms-tjeneste, der belastningsbalancerer belastning mellem vores noder. Hvis ingen af ​​vores knudepunkter er sunde, er den genererede konfiguration alle anmodninger til Infura as fallback. Konfigurationsfilen uploades til S3-spand.
  4. Upload af konfigurationsfil til S3-spand udløser opdatering af ECS Service, der kører nginx-container med med genereret config.

Overvågningsknudepunkter

Ulempen ved at bruge AWS-tjenester er, at de leveres med standardmetriks uden for boksen

Anmodninger pr. Sekund

Ved hjælp af indbyggede ELB-målinger kan vi se nedbremsning af anmodninger, der kommer til proxy per responskodestatus.

Sidethed over for Infura

Jsonrpc-proxy-stak skubber også dets egne målinger, der viser diff mellem hvert nodeblokknummer og Infura.

Antal sunde knuder

En anden tilpasset beregning viser antallet af sunde knudepunkter.

Denne måling er meget nyttig til at indstille en CloudWatch-alarm.

Implementering af din egen jsonrpc-proxy

Koden til vores løsning kan findes i git-lageret.

Byg ECR-beholder med nginx

Vores service kører nginx-container på ECS-klynge, som henter sin config fra S3-spand. Billedet af denne service skal være tilgængeligt på nogle AWS-konti som jsonrpc-proxy. Du kan opbygge og uploade billede med følgende kommandoer:

$ cd-docker
$ AWS_DEFAULT_PROFILE = dinProfilnavn bash -x build_and_upload.sh

Dette skaber et ECR-arkiv, bygger billede og skubber på det. I resultatet vil du se ARN for det oprettede ECR-lager, som du har brug for at sætte i config-fil i det næste trin.

Skrevet ovenfor antager, at du bruger navngivne profiler til kommandolinjeadgang. Hvis du bruger sessionstoken, skal du springe profildelen over.

Opret konfigurationsfil

Stakken er udført, så den genbruger eksterne ressourcer, der skal overføres som parameter i konfigurationsfilen. Du kan starte med at oprette din egen konfigurationsfil fra den medfølgende skabelon:

$ cd-tjenester
$ cp config.yml.sample config.dev.yml # dette antager `dev 'som et scenenavn, der skal bruges senere

Rediger filen og angiv inde:

  • VPC, du kører i, og subnet-id'er til private subnet
  • Liste over sikkerhedsgrupper, der giver adgang til alle paritetsnoder
  • ECS Cluster og applikationsbelastningsbalancer. Stakken skaber hverken egen klynge eller belastningsbalancer, fordi du typisk ikke ønsker at betale for dedikerede ressourcer bare for at køre nginx inde. Bemærk: Det er nødvendigt, at ECS-klyngen tilføjes til sikkerhedsgrupper, der giver den adgang til paritetsnoder
  • ERC Image ARN oprettet i forrige trin

Indsæt stakken

Du skal have serverløs installeret på din maskine.

npm installation -g serverløs

End du skal installere stakafhængigheder:

cd-tjenester
npm installation

Når dette er gjort, kan du distribuere stack til din AWS-konto:

$ AWS_DEFAULT_PROFILE = yourProfileName sls-installations-dev

Endelig skal du konfigurere din DNS til at pege navnet, der bruges af stack, til din Application Load Balancer.

Tilføj noder til at overvåge

Næste trin er at faktisk fortælle proxy, hvilke noder, der skal overvåges:

Hvis alt fungerer fint på et minut, skal du være i stand til at se, at overvågningen starter, og at noderne nu er sunde: