In deze tutorial laat ik je zien hoe je een voorbeeld Rails app kunt implementeren met de Amazon Elastic Container Service (ECS).
Laten we het maken door het volgende uit te voeren rails nieuwe voorbeeld-rails-appen genereert dan een basisactie voor de controller rails g controller Welkom index en het instellen van routes naar het rootpad als `root to: welcome#index".
Ons doel is om deze welkomstpagina te implementeren met behulp van ECS.
Een archief aanmaken met Amazon Elastic Container Registry (ECR)
Amazon ECR is een containerregister. We zullen het gebruiken om de images van onze app op te slaan en ze eruit te halen zodat ze draaien op ECS.
Ga naar uw AWS-paneelzoeken naar Elastische container Register en klik op Aan de slag. U ziet het onderstaande scherm:
We maken een privé archief aan en geven het de naam voorbeeld-rails-app.
Het archief is er, maar het is leeg. We willen dat het de afbeelding van onze app bevat. Dit is de volgende stap.
# gooi fouten als Gemfile is gewijzigd sinds Gemfile.lock
RUN bundle config --global bevroren 1
WERKDIR /app
RUN bundel installeren
COPY .
CMD ["rails", "server", "-b", "0.0.0.0"]
Dan moeten we een image bouwen en het naar de ECR repository pushen.
Laten we eerst assets voorcompileren met `rails assets:precompile`.
Ga nu naar de aangemaakte repository. Bovenaan het scherm zie je een Pushopdrachten bekijken knop met details over hoe dit te doen.
In mijn geval (Linux) voer ik het uit met deze AWS instructies:
Zorg ervoor dat je gebruiker toestemming heeft om deze bewerking uit te voeren. Ik heb het AmazonElasticContainerRegistryPowerUser beleid toegevoegd aan mijn gebruiker, wat er als volgt uitziet:
Ik wil dat de buitenwereld alleen verbinding kan maken met mijn Application Load Balancer. Deze geeft verkeer door aan containers die binnen ons ECS-cluster draaien.
Ga naar EC2-services -> Lastenverdeling -> Laadbalancersklik Load Balancer makenkiezen Toepassingslading balancer en klik op de Maak knop.
Stel de naam in op voorbeeld-rails-app-albGebruik uw standaard VPC en selecteer alle subnetten.
We blijven achter met Beveiligingsgroepen en Luisteraars en routering secties.
Beveiligingsgroepen
We maken een nieuwe beveiligingsgroep aan voor onze loadbalancer. Het werkt als een firewall; we stellen de regels in voor inkomend en uitgaand verkeer. We willen inkomend http verkeer accepteren (TCP poort 80) en al het uitgaande verkeer toestaan.
Klik hiervoor op de "Nieuwe beveiligingsgroep maken" link.
In de sectie "Basisgegevens", stel de naam en beschrijving in en laat de standaard VPC staan.
In mijn geval - naam: "voorbeeld-rails-app-alb-sg", beschrijving: "http van buiten, alles van binnen"
Voeg de inkomende regel toe met Type: HTTP en Bron: Overal-IPv4. Laat de uitgaande regels zoals ze zijn.
Klik op beveiligingsgroep aanmakenGa dan terug naar het tabblad waar u de Application Load Balancer aan het maken was, ververs de beveiligingsgroepen en voeg degene toe die we zojuist hebben gemaakt, verwijder de standaardgroep.
Luisteraars en routering
In deze sectie definiëren we waarnaar we willen dat de loadbalancer verkeer doorstuurt. verlaten LuisteraarProtocol en Haven als HTTP en 80, omdat dit precies is wat we willen, en klik op "Doelgroep creëren" link.
Stel de naam in op "voorbeeld-rails-app-alb-tg". De enige verandering is het poortnummer. We geven het door aan poort 3000 omdat dit de poort is voor onze Rails app. Negeer de volgende stap (Geregistreerde doelen) en maak de doelgroep aan.
Ga nu terug naar het tabblad waar we de Application Load Balancer hebben gemaakt, vernieuw de doelgroep en selecteer degene die we zojuist hebben gemaakt.
We hebben onze Application Load Balancer klaar, laten we nu met ECS gaan spelen.
Een ECS-cluster maken
Je zult veel enge termen tegenkomen - cluster, taken, taakdefinitie, services. Om het eenvoudiger te maken, kun je het cluster zien als een groep servers (EC2-instanties). Op elke server draaien we taken, die gewoon een groep containers zijn die samen draaien. De taakdefinitie beschrijft welke containers zich in een bepaalde groep bevinden en welke resources we ze willen geven (geheugen, cpu). Services houden deze taken in de gaten om ervoor te zorgen dat er altijd het juiste aantal gezonde taken draait in ons cluster.
Laten we met dit in gedachten ons cluster aanmaken.
Ga naar de ECS-pagina en klik op de knop Clusters link en Cluster aanmaken knop. Kies de "EC2 + Linux netwerken"een en klik Volgende stap.
Stel de clusternaam in op "voorbeeld-rails-app-cluster". Kies het type EC2-instantie, ik heb de t2-micro gekozen omdat deze beschikbaar is in het Free Tier-plan. Laat het aantal instanties op 1 staan.
In de sectie netwerken gebruikt u uw standaard VPC en selecteert u alle subnetten. Klik op create, wacht even en voila, we hebben een nieuw ECS Cluster aangemaakt.
Taak Definitie
Klik op de Taakdefinities link, dan Nieuwe taakdefinitie maken knop. Selecteer de EC2 optie en klik op Volgende stap. De app die we gaan uitvoeren is heel eenvoudig, dus we hebben hier maar een paar opties nodig.
Stel in Taak Definitie naam naar "voorbeeld-rails-app", ga dan rechtstreeks naar de Container definities en klik op "Container toevoegen". Geef de Container de naam "voorbeeld-rails-app" en stel de afbeeldingslocatie in op het formaat "archief-url/afbeelding:tag". Ga in het nieuwe browsertabblad naar de ECR om de URI van de afbeelding te kopiëren. In mijn geval was het: "212516879399.dkr.ecr.eu-central-1.amazonaws.com/sample-rails-app:latest".
Stel je geheugenlimiet in op de aanbevolen 300-500MiB. Nu het meest lastige - Port Mapping.
Onze app draait in een container op poort 3000. Dus zet 3000 als containerpoort. We voeren 0 in als hostpoort, wat in feite betekent dat het een willekeurige poort selecteert. Gelukkig kent onze Application Load Balancer deze poorttoewijzing en kan het verkeer correct leiden. We kunnen zelfs meerdere taken uitvoeren op deze enkele instantie.
Voeg de omgevingsvariabele toe RAILS_ENV en stel het in op productie.
Klik nu op Voeg toe om onze containerdefinitie toe te voegen en klik op Maak om het instellen van de taakdefinitie te voltooien.
Service
We hebben onze cluster, loadbalancer en taakdefinitie. Nu moeten we deze taken op de een of andere manier uitvoeren binnen ons cluster. Dit is de taak van services. Ga naar het nieuw aangemaakte cluster, selecteer de Diensten tabblad en klik op de Maak knop.
Stel het Launch type in op EC2, voeg de naam "voorbeeld-rails-app-service". Stel het aantal taken in op 1 en klik op Volgende stap. Selecteer op deze pagina het keuzerondje Application Load Balancer en kies de bestaande IAM-rol ervoor. In het gedeelte "Container to load balance" moet je al een correcte container "sample-rails-app:0:3000" hebben ingevoerd en klik je op "Add to load balancer".
Kies voor "Production listener port" 80:HTTP; gebruik als Doelgroepnaam degene die we eerder hebben gemaakt - "voorbeeld-rails-app-alb-tg" en klik op Volgende stap. Laat Automatisch schalen opties zoals ze zijn, klik op Volgende stap en Service maken.
De ECS-beveiligingsgroep bijwerken
U kunt naar de gemaakte clusterpagina gaan en de Taken Tabbladen, er zou één taak moeten draaien. De service is gestart. Ga nu naar de EC2-servicepagina, klik op Load Balancers en bekijk de details van onze Application Load Balancer. Daar zou de DNS-naam moeten staan. Kopieer deze en open hem in de browser. Het zou je naar onze app moeten leiden. Helaas krijgen we het bericht "504 gateway time-out" fout.
Het probleem zit in de beveiligingsgroep van ons cluster. De inkomende regels staan geen verkeer toe dat binnenkomt van de loadbalancer. Om dit op te lossen, gaat u terug naar het EC2-paneel en klikt u op de knop Beveiligingsgroepen link. Er is een nieuwe groep aangemaakt tijdens het aanmaken van het cluster. Deze zou een naam moeten hebben die begint met "EC2ContainerService-voorbeeld-rails-app-cluster". Klik erop en bewerk de inkomende regels. Omdat we alle verkeer van onze VPC willen toestaan, ga je naar het Amazon VPC paneel en controleer je wat je VPC IPv4 CIDR is. Stel het type regel in op "Alle verkeer" en de bron naar IPv4 CIDR. Sla deze regel op en probeer de DNS-naam van de balancer te laden.