I denne veiledningen vil jeg vise deg hvordan du distribuerer et eksempel på en Rails-app ved hjelp av Amazon Elastic Container Service (ECS).
La oss opprette den ved å kjøre rails new sample-rails-appog deretter generere en grunnleggende kontrollerhandling skinner g-kontroller Velkomstindeks og sette ruter til rotstien som en "root to: welcome#index".
Målet vårt er at denne velkomstsiden skal implementeres ved hjelp av ECS.
Opprett et depot med Amazon Elastic Container Registry (ECR)
Amazon ECR er et containerregister. Vi skal bruke det til å lagre avbildninger av appen vår og hente dem fra det, slik at de kjører på ECS.
Gå til din AWS-panel, se etter Elastisk beholder Register og klikk på Kom i gang. Du vil se skjermbildet nedenfor:
Vi oppretter et privat depot og gir det navnet sample-rails-app.
Repositoryet er der, men det er tomt. Vi vil at det skal inneholde appens image. Dette er neste trinn.
# kaster feil hvis Gemfile har blitt endret siden Gemfile.lock
RUN bundle config --global frozen 1
WORKDIR /app
COPY Gemfile Gemfile.lock ./
RUN bundle install
COPY .
CMD ["rails", "server", "-b", "0.0.0.0.0"]
Deretter bør vi bygge en avbildning og sende den til ECR-depotet.
Før det, la oss prekompilere assets med `rails assets:precompile`.
Gå nå til det opprettede depotet. Øverst på skjermen ser du en Vis push-kommandoer knappen med informasjon om hvordan du gjør dette.
I mitt tilfelle (Linux) kjører jeg det med disse AWS-instruksjonene:
Sørg for at brukeren din har tillatelse til å utføre denne operasjonen. Jeg la til AmazonElasticContainerRegistryPowerUser-policyen til brukeren min, som ser slik ut:
Jeg vil at omverdenen bare skal kunne koble seg til min Application Load Balancer. Den vil sende trafikk til containere som kjører inne i ECS-klyngen vår.
Gå til EC2-tjenester -> Lastbalansering -> Lastbalanserere, klikk Opprett lastbalansering, velg Lastbalansering av applikasjoner og klikk på Opprett knapp.
Sett navnet til sample-rails-app-albbruker du standard VPC og velger alle undernettene.
Vi sitter igjen med Sikkerhetsgrupper og Lyttere og ruting seksjoner.
Sikkerhetsgrupper
Vi oppretter en ny sikkerhetsgruppe for lastbalanseringen vår. Den fungerer som en brannmur; vi vil sette regler for innkommende og utgående trafikk. Vi ønsker å godta innkommende http-trafikk (TCP-port 80) og tillate all utgående trafikk.
Dette gjør du ved å klikke på "Opprett ny sikkerhetsgruppe" lenke.
I avsnittet "Grunnleggende detaljer", angi navn og beskrivelse, og la standard VPC stå igjen.
I mitt tilfelle - navn: "sample-rails-app-alb-sg", beskrivelse: "http fra utsiden, alt fra innsiden"
Legg til den innkommende regelen med Type: HTTP og kilde: Hvor som helst-IPv4. La utgående regler være som de er.
Klikk opprette sikkerhetsgruppeGå deretter tilbake til fanen der du opprettet Application Load Balancer, oppdater sikkerhetsgrupper og legg til den vi nettopp har opprettet, og fjern standardgruppen.
Lyttere og ruting
I denne delen definerer vi hvor vi vil at lastbalanseringen skal sende trafikken. La LytterProtokoll og Havn som HTTP og 80, siden det er akkurat det vi ønsker, og klikk på "Opprett målgruppe" lenke.
Sett navnet til "sample-rails-app-alb-tg". Den eneste endringen er portnummeret. Vi vil sende det til port 3000, siden dette er porten for Rails-appen vår. Ignorer det neste trinnet (Registrerte mål) og opprett målgruppen.
Gå nå tilbake til fanen der vi opprettet Application Load Balancer, oppdater målgruppen og velg den vi nettopp har opprettet.
Vi har Application Load Balancer klar, så la oss nå leke med ECS.
Opprette en ECS-klynge
Det er mange skumle begreper du kommer til å se - klynge, oppgaver, oppgavedefinisjon, tjenester. For å gjøre det enklere kan du tenke på klyngen som en gruppe servere (EC2-instanser). På hver av dem kjører vi oppgaver, som bare er en gruppe containere som kjører sammen. Oppgavedefinisjonen beskriver hvilke containere som er i en gitt gruppe, og hvilke ressurser vi ønsker å gi dem (minne, cpu). Tjenester holder øye med disse oppgavene for å sikre at det alltid er riktig antall sunne oppgaver som kjører i klyngen vår.
Med dette i tankene, la oss opprette klyngen vår.
Gå til ECS-siden og klikk på Klynger lenke og Opprett klynge knappen. Velg "EC2 + Linux-nettverk" ett og klikk Neste trinn.
Angi klyngenavnet til "sample-rails-app-klynge". Velg EC2-instanstype, jeg valgte t2-micro ettersom den er tilgjengelig i Free Tier-abonnementet. La antall forekomster være 1.
I nettverksdelen bruker du standard VPC og velger alle undernettene. Klikk på Opprett, vent litt og voila, vi har opprettet en ny ECS-klynge.
Oppgavedefinisjon
Klikk på Oppgavedefinisjoner lenke, så Opprett ny oppgavedefinisjon knappen. Velg EC2 alternativet og klikk på Neste trinn. Appen vi skal kjøre, er veldig enkel, så vi trenger bare noen få alternativer her.
Sett Oppgavedefinisjon navn til "sample-rails-app", og gå deretter rett til Definisjoner av beholdere delen og klikk på "Legg til beholder". Navngi beholderen som "sample-rails-app", og angi bildeplassering i formatet "repository-url/image:tag". I den nye nettleserfanen går du til ECR for å kopiere bilde-URI-en. I mitt tilfelle var det "212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
Sett minnegrensen til de anbefalte 300-500MiB. Nå kommer det vanskeligste - porttilordning.
Appen vår kjører i en container på port 3000. Så sett 3000 som containerport. Vi skriver inn 0 som vertsport, noe som i utgangspunktet betyr at den velger en tilfeldig port. Heldigvis vil vår Application Load Balancer kjenne til denne porttilordningen og være i stand til å dirigere trafikken riktig. Vi kan til og med kjøre flere oppgaver på denne ene forekomsten.
Legg til miljøvariabelen RAILS_ENV og sett den til produksjon.
Klikk nå Legg til for å legge til containerdefinisjonen vår, og klikk på Opprett for å fullføre oppsettet av oppgavedefinisjonen.
Service
Vi har klyngen, lastbalanseringen og oppgavedefinisjonen. Nå må vi på en eller annen måte kjøre disse oppgavene i klyngen vår. Dette er jobben til tjenestene. Gå til den nyopprettede klyngen, velg Tjenester og klikk på fanen Opprett knapp.
Sett lanseringstypen til EC2, legg til navnet "eksempel på jernbane-app-tjeneste". Sett antall oppgaver til 1, og klikk på Neste trinn. På denne siden velger du alternativknappen Application Load Balancer og velger den eksisterende IAM-rollen for den. I delen "Container to load balance" bør du allerede ha angitt en korrekt container "sample-rails-app:0:3000", og deretter klikker du på "Add to load balancer".
For "Production listener port" velger du 80:HTTP; som målgruppenavn bruker du det vi opprettet tidligere - "sample-rails-app-alb-tg" og klikk på Neste trinn. La Automatisk skalering alternativene som de er, klikker du på Neste trinn og Opprett tjeneste.
Oppdater ECS-sikkerhetsgruppen
Du kan gå til siden for opprettede klynger og sjekke Oppgaver skal det være én oppgave som kjører. Tjenesten har startet den. Gå nå til EC2-tjenestesiden, klikk på Load Balancers og se detaljene til vår Application Load Balancer. Du bør ha DNS-navnet der. Kopier det og åpne det i nettleseren. Det skal lede deg til appen vår. Dessverre får vi "504 tidsavbrudd for gateway" feil.
Problemet ligger i sikkerhetsgruppen i klyngen vår. Reglene for innkommende trafikk tillater ikke trafikk som kommer fra lastbalanseringen. For å fikse det, går du tilbake til EC2-panelet og klikker på Sikkerhetsgrupper kobling. Det er en ny gruppe som ble opprettet under opprettelsen av klyngen. Den bør ha et navn som begynner med "EC2Containertjeneste-eksempel-rails-app-klynge". Klikk på den og rediger de innkommende reglene. Ettersom vi ønsker å tillate all trafikk fra vår VPC, går du til Amazon VPC-panelet og sjekker hva som er din VPC IPv4 CIDR. Sett regeltypen til "All trafikk" og kilden til IPv4 CIDR. Lagre denne regelen, og prøv å laste inn balansererens DNS-navn.
Forhåpentligvis ser du akkurat det samme som meg 🙂 .