I denne vejledning vil jeg gerne vise dig, hvordan du implementerer et eksempel på en Rails-app ved hjælp af Amazon Elastic Container Service (ECS).
Lad os oprette den ved at køre rails new sample-rails-appog derefter generere en grundlæggende controller-handling skinner g controller Velkommen indeks og indstiller ruter til rodstien som en "rod til: welcome#index".
Vores mål er at se denne velkomstside implementeret ved hjælp af ECS.
Opret et repository med Amazon Elastic Container Registry (ECR)
Amazon ECR er et container-register. Vi vil bruge det til at gemme vores apps images og trække dem ud af det, så de kan køre på ECS.
Gå til din AWS-panelse efter Elastisk beholder Register og klik på Kom godt i gang. Du vil se nedenstående skærm:
Vi opretter et privat repository og navngiver det prøve-skinner-app.
Repository'et er der, men det er tomt. Vi ønsker, at det skal indeholde vores apps image. Dette er det næste skridt.
# smider fejl, hvis Gemfile er blevet ændret siden Gemfile.lock
RUN bundle config --global frozen 1
WORKDIR /app
COPY Gemfile Gemfile.lock ./
KØR bundle-installation
COPY .
CMD ["rails", "server", "-b", "0.0.0.0"].
Så skal vi bygge et billede og sende det til ECR-repository'et.
Før det skal vi prækompilere aktiver med `rails assets:precompile`.
Gå nu til det oprettede repository. Øverst på skærmen ser du en Se push-kommandoer med detaljer om, hvordan du gør det.
I mit tilfælde (Linux) kører jeg det med disse AWS-anvisninger:
Sørg for, at din bruger har tilladelse til at udføre denne handling. Jeg tilføjede AmazonElasticContainerRegistryPowerUser-politikken til min bruger, som ser sådan her ud:
Jeg ønsker, at omverdenen kun skal kunne forbinde til min Application Load Balancer. Den vil sende trafik til containere, der kører i vores ECS-klynge.
Gå til EC2-tjenester -> Udligning af belastning -> Load balancere, klik Opret Load Balancer, vælg Load Balancer til applikationer og klik på Opret knap.
Sæt dens navn til prøve-skinner-app-albBrug din standard-VPC og vælg alle dens subnet.
Vi står tilbage med Sikkerhedsgrupper og Lyttere og routing sektioner.
Sikkerhedsgrupper
Vi opretter en ny sikkerhedsgruppe til vores load balancer. Den fungerer som en firewall; vi indstiller reglerne for indgående og udgående trafik. Vi vil acceptere indgående http-trafik (TCP-port 80) og tillade al udgående trafik.
For at gøre dette skal du klikke på "Opret en ny sikkerhedsgruppe" link.
I afsnittet "Grundlæggende detaljer", indstil navn og beskrivelse, lad standard-VPC'en stå.
I mit tilfælde - navn: "prøve-skinner-app-alb-sg", beskrivelse: "http udefra, alt indefra"
Tilføj den indgående regel med Type: HTTP og Kilde: Hvor som helst-IPv4. Lad udgående regler være, som de er.
Klik på Opret sikkerhedsgruppeGå derefter tilbage til den fane, hvor du oprettede Application Load Balancer, opdater sikkerhedsgrupper og tilføj den, vi lige har oprettet, og fjern standardgruppen.
Lyttere og routing
I dette afsnit definerer vi, hvor vi ønsker, at load balanceren skal sende trafikken hen. Lad være LytterProtokol og Havn som HTTP og 80, da det er præcis, hvad vi ønsker, og klik på "Skab en målgruppe" link.
Sæt navnet til "prøve-skinner-app-alb-tg". Den eneste ændring er portnummeret. Vi sender det til port 3000, da det er den, vores Rails-app skal bruge. Ignorer det næste trin (Registrerede mål) og opret målgruppen.
Gå nu tilbage til den fane, hvor vi oprettede Application Load Balancer, opdater målgruppen, og vælg den, vi lige har oprettet.
Vi har vores Application Load Balancer klar, så lad os nu lege med ECS.
Oprettelse af en ECS-klynge
Der er mange skræmmende udtryk, du vil se - klynge, opgaver, opgavedefinition, tjenester. For at gøre det mere enkelt kan du tænke på klyngen som en gruppe servere (EC2-instanser). På hver af dem kører vi opgaver, som bare er en gruppe containere, der kører sammen. Opgavedefinitionen beskriver, hvilke containere der er i en given gruppe, og hvilke ressourcer vi gerne vil give dem (hukommelse, cpu). Services holder øje med disse opgaver for at sikre, at der altid er det korrekte antal sunde opgaver, der kører i vores klynge.
Med dette i tankerne, lad os oprette vores klynge.
Gå til ECS-siden, og klik på Klynger link og Opret klynge knap. Vælg knappen "EC2 + Linux-netværk" et og klik Næste skridt.
Indstil klyngenavnet til "eksempel-rails-app-klynge". Vælg EC2-instanstypen, jeg tog t2-micro, da den er tilgængelig i Free Tier-planen. Lad antallet af instanser være 1.
I netværkssektionen skal du bruge din standard-VPC og vælge alle dens undernet. Klik på Opret, vent lidt, og voila, vi har oprettet en ny ECS-klynge.
Definition af opgaver
Klik på Definitioner af opgaver link, så Opret en ny opgavedefinition knap. Vælg knappen EC2 og klik på Næste skridt. Den app, vi skal køre, er meget enkel, så vi har kun brug for nogle få muligheder her.
Sæt Definition af opgaver navn til "Eksempel på jernbane-app", og gå derefter direkte til Definitioner af beholdere sektion og klik på "Tilføj beholder". Navngiv containeren som "Eksempel på jernbane-app", og indstil billedets placering i formatet "repository-url/billede:tag". I den nye browserfane skal du gå til ECR for at kopiere billedets URI. I mit tilfælde var det: "212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
Sæt din hukommelsesgrænse til de anbefalede 300-500MiB. Nu kommer det sværeste - porttilknytning.
Vores app kører i en container på port 3000. Så sæt 3000 som containerport. Vi indtaster 0 som værtsport, hvilket dybest set betyder, at den vælger en tilfældig port. Heldigvis kender vores Application Load Balancer denne porttilknytning og vil være i stand til at dirigere trafikken korrekt. Vi kan endda køre flere opgaver på denne ene instans.
Tilføj miljøvariablen RAILS_ENV og sæt den til produktion.
Klik nu på Tilføj for at tilføje vores containerdefinition, og klik på Opret for at afslutte opsætningen af opgavedefinitionen.
Service
Vi har vores klynge, load balancer og opgavedefinition. Nu skal vi på en eller anden måde køre disse opgaver i vores klynge. Det er tjenesternes opgave. Gå til den nyoprettede klynge, vælg Serviceydelser og klik på fanen Opret knap.
Indstil starttypen til EC2, tilføj navnet "Eksempel på jernbane-app-service". Indstil antallet af opgaver til 1, og klik på Næste skridt. På denne side skal du vælge alternativknappen Application Load Balancer og vælge den eksisterende IAM-rolle for den. I afsnittet "Container to load balance" bør du allerede have indtastet en korrekt container "sample-rails-app:0:3000", og klik derefter på "Add to load balancer".
For "Production listener port" skal du vælge 80:HTTP; som målgruppenavn skal du bruge det, vi oprettede før - "prøve-skinner-app-alb-tg" og klik på Næste skridt. Lad være Automatisk skalering indstillinger, som de er, klik på Næste skridt og Opret tjeneste.
Opdater ECS-sikkerhedsgruppen
Du kan gå til siden med oprettede klynger og tjekke Opgaver faner, bør der være en opgave, der kører. Tjenesten har startet den. Gå nu til EC2-servicesiden, klik på Load Balancers og se vores Application Load Balancers detaljer. Der skulle du gerne have dens DNS-navn. Kopier det, og åbn det i browseren. Det burde lede dig til vores app. Desværre får vi meddelelsen "504 gateway time-out" fejl.
Problemet ligger i sikkerhedsgruppen i vores klynge. Dens indgående regler tillader ikke trafik, der kommer fra load balanceren. For at løse det skal du gå tilbage til EC2-panelet og klikke på Sikkerhedsgrupper link. Der er en ny gruppe, som blev oprettet under oprettelsen af klyngen. Den bør have et navn, der starter med "EC2C-containerService-eksempel-rails-app-klynge". Klik på den, og rediger de indgående regler. Da vi ønsker at tillade al trafik fra vores VPC, skal du gå til Amazon VPC-panelet og tjekke, hvad din VPC IPv4 CIDR er. Indstil regeltypen til "Al trafik" og kilden til IPv4 CIDR. Gem denne regel, og prøv at indlæse balancerens DNS-navn.