[Für Super-Anfänger (mehr Squeeze)] Automatische Bereitstellung in AWS ECR / ECS mit Ruby2.6 x Rails6 x CircleCi [Hands-on-Format]

Konfiguration in diesem Artikel

Untitled Diagram.png

① auf GitHub drücken ② Build läuft auf CircleCi ③ Wenn der Test (Rspec) bestanden wurde, erstellen Sie ein Docker-Image und senden Sie es an ECR. (4) Verwenden Sie das neueste Docker-Image, aktualisieren Sie die ECS-Aufgabendefinition und schließen Sie die Bereitstellung ab.

Zielgruppe

Schritte zum Bereitstellen einer einfachen Rails-App (zeigen Sie einfach "Hallo Welt!" An) für AWS ECS. Bitte beachten Sie, dass wir den nachfolgenden Vorgang nicht berücksichtigen und nur als Referenz dienen.

Je nach Person gibt es wahrscheinlich verschiedene Möglichkeiten. Wenn Sie den Fluss erfasst haben, stellen Sie ihn bitte nach Ihren Wünschen ein.

Ab der Phase der Vorbereitung der Anwendung für die Bereitstellung wird alles im praktischen Format (viele Spieße) beschrieben. Wenn Sie wie beschrieben vorgehen, sollte dies grundsätzlich funktionieren.

Es gibt einen Teil, um an wichtigen Stellen beliebige Werte (Profilname, Anwendungsname usw.) festzulegen. Wenn Sie sich also nicht sicher sind, ist es möglicherweise besser, sich mit "Beispiel-App" usw. wie dem Autor zu vereinen.

`* Obwohl es für Anfänger gekennzeichnet ist, erklärt es nicht jeden Begriff, da es dem Zweck gewidmet ist," zuerst die Hände zu bewegen, um ein Gefühl für die Atmosphäre zu bekommen ". ``

* Das Konzept ist, dass selbst ein Super-Anfänger von AWS so bereitstellen kann, wenn Sie vorerst die Anweisungen befolgen. Es wird empfohlen, dass theoretische Studenten das Konzept von ECR / ECS in anderen Artikeln lernen, bevor sie eintreten. (Weil ich mich mit meinem Körper daran erinnere ...)

`* Jeder Ressourcenname von AWS ist grundsätzlich beliebig, sodass Sie ihn nach Belieben verwenden können (wenn Sie jedoch einen Befehl mit ecs-cli eingeben oder die Beschreibung in der CircleCi-Konfiguration übereinstimmen müssen). Auch für die Teile, die nicht besonders erwähnt werden, denke ich, dass der Standardzustand oder die Leerzeichen vorerst in Ordnung sind. ``

* Die Revisionsnummer kann aufgrund unterschiedlicher Zeitangaben variieren, aber bitte ignorieren Sie sie (Schweiß)

Spezifikation

Vorbereitung

Bereiten Sie zunächst eine einfache Rails-App für die Bereitstellung in ECS vor.

Stichprobe

https://github.com/kazama1209/sample-app

$ git clone https://github.com/kazama1209/sample-app.git
$ cd sample-app

installieren

$ docker-compose build
$ docker-compose run web bundle exec rails webpacker:install

#Wenn mit dem Befehl ↑ ein Fehler auftritt
$ docker-compose run web yarn install --check-files

$ docker-compose up -d
$ docker-compose run web bundle exec rails db:create

Erstellen Sie master.key

Wenn Sie das Repository von ↑ geklont haben, sollte config / master.key nicht vorhanden sein. Wenn keine master.key vorhanden ist, tritt zum Zeitpunkt der Bereitstellung ein Fehler auf. Generieren Sie ihn daher hier gemäß dem folgenden Verfahren.

$ rm config/credentials.yml.enc
$ docker-compose run -e EDITOR=vim web rails credentials:edit

Referenz: Ich möchte Anmeldeinformationen mit Rails on Docker bearbeiten ActiveSupport::MessageEncryptor::InvalidMessage

Greifen Sie auf localhost zu

2202d539-1270-4db1-a75c-397be9b8a0c5.png

Wenn Sie auf "http: // localhost" zugreifen und der übliche Bildschirm angezeigt wird, ist dies in Ordnung.

Erstellt die Top-Seite "Hallo Welt!"

Erstellen Sie eine Top-Seite, die "Hello World!" Zurückgibt. Dies ist das Endziel dieser Zeit.

ruby:./app/controllers/home_controller.rb


class HomeController < ApplicationController
  def index
  end
end

erb:./app/views/home/index.html.erb


<h1>Hello World!</h1>

ruby:./config/routes.rb


Rails.application.routes.draw do
  root 'home#index'
end

スクリーンショット 2020-09-23 3.38.38.png

Wenn "Hello World!" Zurückgegeben wird, ist die Beispielanwendung bereit.

Bereitstellen

Nachdem die App fertig ist, stellen wir sie in ECS bereit.

Installieren Sie verschiedene Werkzeuge

Dieses Mal werden wir die folgenden zwei Tools für die Bereitstellung in ECS verwenden.

$ brew install awscli
$ brew install amazon-ecs-cli

konfigurieren aws konfigurieren

Richten Sie aws configure so ein, dass die oben genannten Tools verwendet werden.

IAM-Benutzer erstellen

7c16be50-b5d0-412b-be53-bd7b692fec3a.png

Wählen Sie in der AWS-Konsole Dienste → IAM aus und klicken Sie auf „Benutzer hinzufügen“.

スクリーンショット 2020-09-24 1.13.00.png

Geben Sie einen beliebigen Benutzernamen ein (diesmal "Beispiel-App"), aktivieren Sie "Zugriff per Programm" und fahren Sie mit dem nächsten Schritt fort.

5fd6a2b4-d332-4b99-bdf3-a75b5a185d2c.png

Fügen Sie unter "Vorhandene Richtlinie direkt anhängen" die folgenden beiden Richtlinien zum nächsten Schritt hinzu.

8f248761-358c-4a85-b5c4-f69d74e32b20.png

Ignorieren Sie diesmal die Tags und fahren Sie mit dem nächsten Schritt fort.

スクリーンショット 2020-09-24 1.14.02.png

Schließlich wird ein Bestätigungsbildschirm für Eingabeinformationen angezeigt. Wenn also keine besonderen Probleme auftreten, klicken Sie auf "Benutzer erstellen".

スクリーンショット 2020-09-24 1.14.29_censored.jpg

Wenn es Ihnen gelingt, einen Benutzer zu erstellen, erhalten Sie einen "Zugriffsschlüssel" und einen "geheimen Zugriffsschlüssel". Machen Sie sich also Notizen oder laden Sie die CSV-Datei herunter und bewahren Sie sie an einem sicheren Ort auf.

Führen Sie "aws configure" im Terminal aus

$ aws configure --profile <Der zuvor erstellte IAM-Benutzername (diesmal "Beispiel")-app」)>

AWS Access Key ID #Der zuvor erstellte Zugriffsschlüssel
AWS Secret Access Key #Der geheime Zugriffsschlüssel, den Sie zuvor erstellt haben
Default region name # ap-northeast-1 
Default output format # json 

Geben Sie jeweils wie oben ein.

Erstellen Sie zusätzliche Richtlinien

Als ich den IAM-Benutzer früher erstellt habe

Ich habe zwei Richtlinien angehängt, aber dies allein führt zu einem Berechtigungsfehler im Tool "ecs-cli", der später verwendet wird. Daher muss ich ihn hier separat hinzufügen.

a00a8b0d-964e-4fb5-9a28-bfcc03193c22.png

Wählen Sie in der AWS-Konsole Dienste → IAM → Richtlinien aus und klicken Sie auf Richtlinie erstellen.

6b1fb686-37e2-4882-a1d1-83506504bd46.png

Öffnen Sie die Registerkarte JSON und schreiben Sie Folgendes.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "iam:AttachRolePolicy",
                "iam:AddRoleToInstanceProfile",
                "iam:CreateInstanceProfile",
                "iam:CreateRole",
                "iam:DeleteInstanceProfile",
                "iam:DeleteRole",
                "iam:DetachRolePolicy",
                "iam:PassRole",
                "iam:RemoveRoleFromInstanceProfile",
                "ec2:DeleteInternetGateway",
                "ec2:DeleteSecurityGroup",
                "ec2:DeleteRouteTable"
            ],
            "Resource": "*"
        }
    ]
}

98bcb131-f696-42dd-a11b-0853f81dfc05.png

Geben Sie einen Namen und eine Beschreibung der Richtlinie ein und klicken Sie auf "Richtlinie erstellen".

Richtlinie an Benutzer anhängen

f204b7a2-5b8c-4d3b-8029-a4e131037496.png

Wählen Sie in der AWS-Konsole Dienste → IAM → Benutzer aus und klicken Sie auf "Zugriff hinzufügen".

2e033472-a7e7-4022-94be-fc40f57057c2.png

Wählen Sie die zuvor erstellte Richtlinie unter "Vorhandene Richtlinie anhängen" aus und fügen Sie die Zugriffsberechtigung hinzu.

Erstellen Sie ein Schlüsselpaar

Erstellen Sie ein Schlüsselpaar, wie Sie es später bei der Eingabe von EC2 benötigen.

25045ba0-973e-4270-922b-4ae9d8fc19aa.png

Wählen Sie in der AWS-Konsole Dienste → EC2 → Schlüsselpaar aus und klicken Sie auf „Schlüsselpaar erstellen“.

c36ab4a3-27ca-4439-9c53-f2e62e3030e7.png

Geben Sie den Namen und das Dateiformat ein und klicken Sie auf "Schlüsselpaar erstellen".

$ mv Downloads/sample-app.pem .ssh/
$ chmod 600 ~/.ssh/sample-app.pem

Wenn Sie fertig sind, wird eine Datei im ".pem" -Format heruntergeladen. Verschieben Sie sie in das Verzeichnis ".ssh" und ändern Sie die Berechtigungen.

Erstellen Sie einen Cluster

Es ist möglich, es manuell über die Konsole zu erstellen. Da es jedoch erforderlich ist, vpc und Subnetz zusammen zu erstellen, wird es diesmal gemeinsam mit ecs-cli erstellt.

Führen Sie den folgenden Befehl aus.

$ ecs-cli configure profile --profile-name <Beliebiger Profilname> --access-key <Der zuvor erstellte Zugriffsschlüssel> --secret-key <Der geheime Zugriffsschlüssel, den Sie zuvor erstellt haben>
$ ecs-cli configure --cluster <Beliebiger Clustername> --default-launch-type EC2 --config-name <Beliebiger Einstellungsname> --region ap-northeast-1
$ ecs-cli up --keypair <Das zuvor erstellte Schlüsselpaar> --capability-iam --size 2 --instance-type t2.samll --cluster-config <Beliebiger Einstellungsname> --ecs-profile <Beliebiger Profilname>

Jeder Wert wie ein Schlüssel ist anders. Im Fall des Autors sieht es wie folgt aus.

$ ecs-cli configure profile --profile-name sample-app --access-key ******************** --secret-key ****************************************
$ ecs-cli configure --cluster sample-app-cluster --default-launch-type EC2 --config-name sample-app-cluster --region ap-northeast-1
$ ecs-cli up --keypair sample-app --capability-iam --size 2 --instance-type t2.small --cluster-config sample-app-cluster --ecs-profile sample-app

INFO[0006] Using recommended Amazon Linux 2 AMI with ECS Agent 1.44.3 and Docker version 19.03.6-ce 
INFO[0007] Created cluster                               cluster=sample-app-cluster region=ap-northeast-1
INFO[0009] Waiting for your cluster resources to be created... 
INFO[0009] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0070] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0131] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS

VPC created: vpc-*****************
Security Group created: sg-*****************
Subnet created: subnet-*****************
Subnet created: subnet-*****************
Cluster creation succeeded.

Wenn alles gut geht, werden VPCs, Sicherheitsgruppen, Subnetze usw. für den Cluster automatisch erstellt, wie in ↑ gezeigt.

55a730be-fce1-40b5-9f8e-70f5ede20419.png

Wählen Sie in der AWS-Konsole Service-> Elastic Container Service-> Cluster aus. Wenn es erfolgreich erstellt wurde, ist es erfolgreich.

RDS erstellen

Erstellen Sie ein RDS, das als Datenbank verwendet werden soll.

4b3d00a9-6680-469d-bf81-fba2d93d5f0a.png

Wählen Sie in der AWS-Konsole Dienste → RDS aus und klicken Sie auf "Datenbank erstellen".

5d59f52f-b3a6-4d2e-be49-0c76722e028c.png

--Erstellungsmethode: Standarderstellung

6abaabd6-b44c-44f6-98e9-33b36251d297.png

--DB-Instanzkennung: sample-app-db

`* Dieser Bereich ist optional. ``

37879b71-73ff-4404-b6be-0bdce587d21f.png

--vpc: Der zuvor erstellte vpc --Subnetzgruppe: Erstellen Sie eine neue DB-Subnetzgruppe

`* Da dies eine Praxis ist, habe ich" Ja "ausgewählt, aber in einer Produktionsumgebung ist es möglicherweise besser, sie auf" Nein "zu setzen. ``

6f890dbf-3582-4a4b-9007-6622826b494c.png

Erster Datenbankname: sample_app_production

`* Bei Verwendung des am Anfang des Artikels vorbereiteten Beispiels (Beispiel-App) * Da der Datenbankname in" config / database.yml "der Beispiel-App definiert ist, ist er auf" sample_app_production "festgelegt

`* Leer lassen oder Standard für unberührte Teile. ``

Wenn es kein Problem gibt, klicken Sie auf "Datenbank erstellen".

スクリーンショット 2020-09-15 3.30.28_censored.jpg

↑ Erfolg, wenn es so erstellt wird.

スクリーンショット 2020-09-15 3.32.43.png

Sie müssen auch eine Sicherheitsgruppe festlegen. Klicken Sie daher auf den Link unter "VPC-Sicherheitsgruppe".

スクリーンショット 2020-09-15 3.33.10.png

Stellen Sie Folgendes unter "Eingehende Regel bearbeiten" ein.

--Typ: MYSQL / Aurora --Protokoll: TCP

400d93f6-48e9-4918-a06e-08360d608b18.png

$ mysql -h <RDS-Endpunkt> -u <RDS-Benutzername> -p

Versuchen Sie, den Befehl ↑ im Terminal zu drücken. Wenn Sie eine Verbindung herstellen können, sind Sie erfolgreich.

Erstellen Sie einen Load Balancer

f5713aaf-b79d-4a40-8397-d8a141841e07.png

Wählen Sie in der AWS-Konsole Dienste → EC2 → Load Balancer aus und klicken Sie auf „Load Balancer erstellen“.

19330f58-f800-4327-b5a8-c6ded7fb5582.png

Es gibt drei Typen, aber wählen Sie "Application Load Balancer".

b493adaf-4c11-41ec-acb0-99be877b09c8.png 44195828-7054-45b2-a6ea-3d9e9732fd99.png

--Name: sample-app-alb * Optional

08e422f3-1b33-4d93-abf4-ef3aecdb29d3.png

Wenn Sie fortfahren, wird der Einstellungsbildschirm für Sicherheitsgruppen angezeigt. Erstellen Sie daher unter "Neue Sicherheitsgruppe erstellen" eine entsprechende Sicherheitsgruppe.

b532da52-92e9-4994-8638-d151bcaa5b42.png 71847cd0-551a-4341-a433-0c7b8caefc90.png 8c6d09bb-18ca-442c-b039-8a63cb94d88c.png

Zielgruppeneinstellungen.

Registrieren Sie den EC2, der beim Erstellen des Clusters automatisch erstellt wurde. Wenn im Bestätigungsbildschirm keine Probleme auftreten, klicken Sie zum Abschluss auf "Erstellen".

Schieben Sie das Docker-Image auf ECR

d6678645-ca93-4a28-8195-1ed7f9141a7e.png

Wählen Sie in der AWS-Konsole Dienste → Amazon Elastic Container Registry aus und klicken Sie auf "Repository erstellen".

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3638383835342f61666361646565352d623963372d316261662d386532352d3330373238663433353338312e706e67_censored.jpg 68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3638383835342f32633938643366302d353166312d383934382d653430332d6535353230346565383562342e706e67_censored.jpg

Geben Sie jeweils einen geeigneten Repository-Namen ein und klicken Sie auf "Repository erstellen".

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3638383835342f63653130356164622d396230342d383661342d666363612d6364666464623137363036342e706e67_censored.jpg

Zeigen Sie den Push-Befehl an und führen Sie die vier in der angegebenen Reihenfolge von oben aus.

#Schienen (Produktions-Dockerfile verwenden)
$ docker build -f ./prod.Dockerfile . -t sample-app-rails 

# Nginx
$ cd containers/nginx
$ docker build -f ./Dockerfile . -t sample-app-nginx 

Dockerfile für die Produktion

$ touch prod.Dockerfile

dockerfile:./prod.Dockerfile


FROM ruby:2.6.6
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && \
apt-get install nodejs

RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn

RUN mkdir /sample-app
WORKDIR /sample-app

ADD Gemfile /sample-app/Gemfile
ADD Gemfile.lock /sample-app/Gemfile.lock

RUN gem install bundler:2.1.4
RUN bundle install

ADD . /sample-app

#Vorbereitung auf die Kommunikation mit Nginx
RUN mkdir -p tmp/sockets
VOLUME /sample-app/public
VOLUME /sample-app/tmp

RUN yarn install --check-files
RUN SECRET_KEY_BASE=placeholder bundle exec rails assets:precompile

Es ist im Grunde dasselbe wie das für die Entwicklung, aber die letzten Zeilen bereiten die Kommunikation mit Nginx vor.

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3638383835342f37656637363735612d323131382d633435662d373032302d6136653735303162353033612e706e67_censored.jpg

Nachdem Sie alles eingegeben haben, überprüfen Sie das Repository. Wenn das Bild hinzugefügt wird, ist es erfolgreich.

Eine Aufgabe erstellen

Erstellen Sie eine Aufgabe basierend auf dem Bild, das Sie zuvor gepusht haben.

$ mkdir ecs
$ touch ecs/docker-compose.yml

yml:./ecs/docker-compose.yml


version: 2
services:
  app:
    image: #ECR-Repository-URI (Rails)
    command: bash -c "bundle exec rails db:migrate && bundle exec rails assets:precompile && bundle exec puma -C config/puma.rb"
    environment: #Es ist eine Übung, also ein direkter Schreibstil, aber ich denke, es ist tatsächlich besser, dotenv zu verwenden.
      RAILS_ENV: production
      RAILS_MASTER_KEY: # config/master.Wert des Schlüssels
      DATABASE_NAME: sample_app_production
      DATABASE_USERNAME: root
      DATABASE_PASSWORD: password
      DATABASE_HOST: #RDS-Endpunkt
      TZ: Japan
    working_dir: /sample-app
    logging:
      driver: awslogs
      options:
        awslogs-region: ap-northeast-1
        awslogs-group: sample-app-production/app
        awslogs-stream-prefix: sample-app-production
  nginx:
    image: #ECR-Repository-URI (Nginx)
    ports:
      - 80:80
    links:
      - app
    volumes_from:
      - app
    working_dir: /sample-app
    logging:
      driver: awslogs
      options:
        awslogs-region: ap-northeast-1
        awslogs-group: sample-app-production/nginx
        awslogs-stream-prefix: sample-app-production

Führen Sie den folgenden Befehl aus.

$ ecs-cli compose --project-name sample-app-task -f ./ecs/docker-compose.yml up --create-log-groups --cluster-config sample-app-cluster --ecs-profile sample-app

スクリーンショット 2020-09-15 19.40.31.png

Bei Erfolg wird eine "1" für die laufende Aufgabe angezeigt.

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3638383835342f35333835383462302d613664332d336237642d663636372d3639656465346235393266392e706e67_censored.jpg

Zum Schluss können Sie den DNS-Namen des Load Balancers in die URL einfügen.

スクリーンショット 2020-09-23 3.32.44.png

Erfolg, wenn "Hallo Welt!" Auf die gleiche Weise angezeigt wird wie die in der lokalen Umgebung erstellte.

04a9c9de-a557-4252-9554-b7bcda1a8be5.png

Einen Service erstellen

Die App funktioniert nur mit dem Cluster und der Aufgabe. Wenn Sie jedoch in der Mitte einen sogenannten "Dienst" erstellen, wird sie neu gestartet, wenn der Container stoppt, oder sie wird automatisch über den Load Balancer skaliert. Deshalb habe ich sie erstellt, weil sie praktisch ist. Behalte es.

0adea5cb-a222-43dc-b9a5-df79edc3c337.png

Klicken Sie in der AWS-Konsole auf Dienste → Amazon Elastic Container Service → Clustername, um die Registerkarte Dienste zu öffnen und zur Seite Erstellen zu wechseln.

60c91d38-5370-438c-a271-1cdf6212de17.png

2b08d195-a6db-47b3-9261-28ded05830d6.png

--Zielgruppenname: Was Sie zuvor erstellt haben

https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_688854_7a541af7-b735-8124-8ef8-887378dd4f3f.png

Am Ende wird ein Bestätigungsbildschirm angezeigt. Wenn also keine Probleme auftreten, klicken Sie auf Erstellen.

ダウンロード (1).png 68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3638383835342f32633064353363342d663463662d616162342d333262372d3034316136363634363231622e706e67_censored.jpg

Wenn es erfolgreich erstellt wurde, ist es abgeschlossen.

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3638383835342f37336530653262342d303062642d366238342d643164362d6164616465633234626636312e706e67_censored.jpg

Bei dieser Geschwindigkeit werden zwei Aufgaben ausgeführt (eine vom Terminal mit ecs-cli gestartet und die andere durch Erstellen eines Dienstes gestartet), sodass die erstere gestoppt und in Ordnung ist. ..

Bonus (automatische Bereitstellung in Zusammenarbeit mit CircleCi)

Wenn dies unverändert bleibt, müssen bei jeder Änderung manuell mühsame Arbeiten wie "Build-> Push-> Task-Neudefinition" ausgeführt werden, sodass ein gängiger Mechanismus wie "Push to CircleCi-> Build & Test-> Automatische Bereitstellung für ECR / ECS" erforderlich ist. Wird weiter bauen.

Einführung von Rspec

Führen Sie zunächst Rspec zum Testen vor der Bereitstellung ein.

Installieren Sie gem

./Gemfile


group :development, :test do
  gem 'rspec-rails'
end
#Ich habe das Gemfile aktualisiert, also baue es erneut
$ docker-compose build

Erstellen und bearbeiten Sie verschiedene Dateien

$ docker-compose run web bundle exec rails generate rspec:install

create  .rspec
create  spec
create  spec/spec_helper.rb
create  spec/rails_helper.rb

ruby:./.rspec


--format documentation

Wenn Sie eine Zeile ↑ hinzufügen, ist die Ausgabeanzeige bei Ausführung von Rspec einfacher zu sehen.

ruby:./spec/rails_helper.rb


Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f }

Obwohl dies nicht unbedingt erforderlich ist, wird "spec / support" als Speicherort für die Datei verwendet, wenn Sie eine Hilfsmethode zum späteren Testen erstellen möchten. Legen Sie sie daher vorerst fest.

Standardmäßig ist es auskommentiert, sodass Sie es entfernen können.

ruby:./config/application.rb


config.generators do |g|
  g.test_framework :rspec, 
    view_specs: false, 
    helper_specs: false, 
    controller_specs: false, 
    routing_specs: false
end

Wenn dies unverändert bleibt, werden beim Testen des Befehls "Rails g" automatisch verschiedene Testdateien erstellt. Wenn Sie also keine zusätzlichen erstellen möchten, legen Sie diese in "config / application.rb" fest.

Führen Sie rspec aus

$ docker-compose run web bundle exec rspec

No examples found.

Finished in 0.00276 seconds (files took 0.12693 seconds to load)
0 examples, 0 failures

Ich habe noch keine Tests geschrieben, also ist dies natürlich der Fall.

Lassen Sie uns vorerst Request Spec schreiben

Schreiben wir als Ausgangspunkt eine Anforderungsspezifikation, um zu überprüfen, ob eine normale Antwort auf die Anforderung zurückgegeben wird.

Erstellen Sie eine Testdatei
$ docker-compose run web bundle exec rails g rspec:request home

create  spec/requests/homes_spec.rb

ruby:./spec/requests/home_spec.rb


require 'rails_helper'

RSpec.describe "Home", type: :request do
  describe "GET /" do
    it "works successfully" do
      get root_path
      expect(response).to have_http_status(200)
    end
  end
end

Ein Test, um festzustellen, ob beim Zugriff auf "/" der Statuscode 200 zurückgegeben wird.

$ docker-compose run web bundle exec rspec

Home
  GET /
    works successfully

Finished in 0.53664 seconds (files took 8.4 seconds to load)
1 example, 0 failures

Führen Sie rspec erneut aus, und wenn es ohne Probleme erfolgreich ist, ist es erfolgreich.

Funktioniert mit CircleCI

Nehmen Sie als Nächstes die Einstellungen für die tatsächliche Verknüpfung mit CircleCi vor.

Installieren Sie gem

./Gemfile


group :development, :test do
  gem 'database_cleaner'
  gem 'rspec_junit_formatter'
  gem 'webdrivers', '~> 3.0'
end
#Ich habe das Gemfile aktualisiert, also baue es erneut
$ docker-compose build

Erstellen und bearbeiten Sie verschiedene Dateien

$ mkdir .circleci
$ touch .circleci/config.yml

$ touch config/database.yml.ci

$ docker-compose run web bundle exec rails db:schema:dump 

yml:./.circleci/config.yml


version: 2
jobs:
  build:
    docker:
    - image: circleci/ruby:2.6.6-node-browsers
      environment:
        - BUNDLER_VERSION: 2.1.4
        - RAILS_ENV: 'test'

    - image: circleci/mysql:5.7
      environment:
        - MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
        - MYSQL_ROOT_HOST: '127.0.0.1'

    working_directory: ~/sample_app

    steps:
    - checkout

    - restore_cache:
        keys:
        - v1-dependencies-{{ checksum "Gemfile.lock" }}
        - v1-dependencies-

    - run:
        name: install dependencies
        command: |
          gem install bundler -v 2.1.4
          bundle install --jobs=4 --retry=3 --path vendor/bundle
    - save_cache:
        paths:
        - ./vendor/bundle
        key: v1-dependencies-{{ checksum "Gemfile.lock" }}

    # database setup
    - run: mv ./config/database.yml.ci ./config/database.yml

    # database setup
    - run:
        name: setup database
        command: |
           bundle exec rake db:create
           bundle exec rake db:schema:load
    
    # install yarn
    - run:
        name: install yarn
        command: yarn install

    # install webpack
    - run:
        name: install webpack
        command: bundle exec bin/webpack

    # run tests
    - run:
        name: run rspec
        command: |
          mkdir /tmp/test-results
          TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
            circleci tests split --split-by=timings)"
          bundle exec rspec \
            --format progress \
            --format RspecJunitFormatter \
            --out /tmp/test-results/rspec.xml \
            --format progress \
            $TEST_FILES
    # collect reports
    - store_test_results:
        path: /tmp/test-results

    - store_artifacts:
        path: /tmp/test-results
        destination: test-results

yml:./config/database.yml.ci


test:
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: 'root'
  port: 3306
  host: '127.0.0.1'
  database: sample_app_test

ruby:./spec/rails_helper.rb


RSpec.configure do |config|

  # config DataBaseCleaner
  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
    Rails.application.load_seed
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end

ruby:./db/schema.rb


# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# This file is the source Rails uses to define your schema when running `rails
# db:schema:load`. When creating a new database, `rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 0) do

end

Verbinden Sie CircleCi und GitHub

58a2db41-e9e6-4521-897b-7a779346f00c.png

https://app.circleci.com/projects/project-dashboard/github/GitHubのアカウント名/

↑ Suchen Sie im CircleCi-Dashboard das Repository, mit dem Sie eine Verknüpfung herstellen möchten, und klicken Sie auf "Projekt einrichten". Stellen Sie die Einstellungen gemäß den Anweisungen auf dem Bildschirm ein.

2cd144b5-f09f-4d1a-8e6c-7b2c2cfd9bdb.png

Wenn Sie in Zukunft einen neuen Push für GitHub durchführen, wird build & test automatisch basierend auf den in ".circleci / config.yml" geschriebenen Inhalten ausgeführt.

1ee0ab1a-a288-4e39-b8ed-5652aa923f97.png

Wenn es kein Problem gibt, sollte "SUCCESS" angezeigt werden. Damit sind die Grundeinstellungen abgeschlossen.

Automatische Bereitstellung (ECR / ECS)

Verwenden Sie Orb, das ab Version 2.1 von CircleCi hinzugefügt wurde. Wenn Änderungen am Hauptzweig vorgenommen werden, erstellen und testen Sie mit CircleCi, erstellen Sie automatisch ein Image und senden Sie es an ECR, aktualisieren Sie den ECS-Dienst und aktualisieren Sie die Aufgabe Versuchen Sie neu zu definieren.

Registrierung von Umgebungsvariablen

4a34abde-8e22-485a-bd8a-bae327fa0362.png

Registrieren Sie die für die Bereitstellung erforderlichen Umgebungsvariablen im Voraus auf dem CircleCi-Einstellungsbildschirm.

Bearbeiten Sie .circleci / config.yml

yml:./.circleci/config.yml


version: 2.1
orbs:
  aws-ecr: circleci/[email protected]
  aws-ecs: circleci/[email protected]

jobs:
  test:
    docker:
      - image: circleci/ruby:2.6.6-node-browsers
        environment:
          - BUNDLER_VERSION: 2.1.4
          - RAILS_ENV: 'test'

      - image: circleci/mysql:5.7
        environment:
          - MYSQL_ALLOW_EMPTY_PASSWORD: 'true'
          - MYSQL_ROOT_HOST: '127.0.0.1'

    working_directory: ~/project

    steps:
      - checkout

      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "Gemfile.lock" }}
          - v1-dependencies-

      - run:
          name: install dependencies
          command: |
            gem install bundler -v 2.1.4
            bundle install --jobs=4 --retry=3 --path vendor/bundle

      - save_cache:
          paths:
          - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}

      - run: mv ./config/database.yml.ci ./config/database.yml

      - run:
          name: setup database
          command: |
            bundle exec rake db:create
            bundle exec rake db:schema:load

      - run:
          name: install yarn
          command: yarn install

      - run:
          name: install webpack
          command: bundle exec bin/webpack

      - run:
          name: run rspec
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | \
              circleci tests split --split-by=timings)"
            bundle exec rspec \
              --format progress \
              --format RspecJunitFormatter \
              --out /tmp/test-results/rspec.xml \
              --format progress \
              $TEST_FILES

      - store_test_results:
          path: /tmp/test-results

      - store_artifacts:
          path: /tmp/test-results
          destination: test-results

workflows:
  version: 2
  test_and_deploy:
    jobs:
      - test
      #Schieben Sie das Bild nach dem Erstellen auf ECR
      - aws-ecr/build-and-push-image:
          requires:
            - test
          account-url: AWS_ECR_ACCOUNT_URL
          region: AWS_REGION
          aws-access-key-id: AWS_ACCESS_KEY_ID
          aws-secret-access-key: AWS_SECRET_ACCESS_KEY
          create-repo: true
          dockerfile: ./prod.Dockerfile
          repo: "${MY_APP_PREFIX}-rails"
          tag: "${CIRCLE_SHA1}"
          filters:
            branches:
              only:
                - master
      #Aktualisieren Sie die ECS-Dienste, um Aufgaben neu zu definieren
      - aws-ecs/deploy-service-update:
          requires:
            - aws-ecr/build-and-push-image
          family: "${MY_APP_PREFIX}-task"
          cluster-name: "${MY_APP_PREFIX}-cluster"
          service-name: "${MY_APP_PREFIX}-service"
          container-image-name-updates: "container=app,tag=${CIRCLE_SHA1}"

Stellen Sie sicher, dass jede Umgebungsvariable korrekt ist.

erb:./app/views/home/index.html.erb


<h1>Hello World!</h1>
<p>Completed auto deploy with CircleCi</p>

Ändern Sie die Startseite ein wenig, damit Sie sehen können, ob die automatische Bereitstellung funktioniert hat.

Nehmen Sie Änderungen am Hauptzweig vor

7cd89fad-8143-45d7-bb81-40db1e805abe.png

Wenn ich es tatsächlich in den Hauptzweig schiebe und Änderungen vornehme, werden die Jobs mit Bereitstellung auf CircleCi ausgeführt.

7454ceea-ac3f-4ec2-97eb-4c89d8cb0f26.png

`* Bitte beachten Sie, dass es ungefähr 10 bis 15 Minuten dauert, bis alle Abläufe abgeschlossen sind. ``

7142f5cc-00b7-444d-ab4f-feaa7f5f36a9.png

Greifen Sie erneut auf den DNS-Namen des Load Balancers zu. Wenn die vorherige Änderung ordnungsgemäß aktualisiert wurde, ist sie erfolgreich.

`* Es wird einige Zeit dauern, bis es reflektiert wird. Warten Sie also geduldig. ``

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3638383835342f39316133323831642d613733362d326132612d616534372d3930303731363832373266352e706e67_censored.jpg

Zwei Aufgaben, eine alte und eine neue Aufgabe, werden ausgeführt, aber die alte Aufgabe wird im Laufe der Zeit von selbst gelöscht (dank des Dienstes?). Sie können sie also so lassen, wie sie ist.

Danke für deine harte Arbeit.

Nachwort

Ich lerne noch, also werde ich es aktualisieren, wenn ich etwas habe.

Gegenwärtig sind die Arbeit beim Bewegen der Hände auf der Konsole und die Arbeit beim Drücken von Befehlen auf dem Terminal verwechselt, daher möchte ich, wenn möglich, alle mit letzteren vereinheitlichen.

Ich möchte es mit Terraform auf einmal schaffen.

Ich wäre Ihnen dankbar, wenn Sie einen Kommentar abgeben könnten, wenn etwas stecken bleibt oder so etwas besser ist.

Persönlich verstopfter Teil

EC2-Instanztyp

service sample-app-service was unable to place a task because no container instance met all of its requirements. The closest matching container-instance c4b1a3e7-3209-408c-9501-7b3ea30f97f7 has insufficient memory available. For more information, see the Troubleshooting section.

Referenz: https://aws.amazon.com/jp/premiumsupport/knowledge-center/ecs-container-instance-cpu-error/

In diesem Artikel Befehle beim Erstellen eines Clusters

$ ecs-cli up --keypair sample-app --capability-iam --size 2 --instance-type t2.small --cluster-config sample-app-cluster --ecs-profile sample-app

↑ In diesem Teil wird der Instanztyp angegeben.

Nginx-Einstellungen

Wenn die Verbindung zwischen dem App-Container und dem Nginx-Container nicht funktioniert

2020/09/13 20:02:57 [crit] 7#7: *456 connect() to unix:///sample-app/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: *********, server: localhost, request: "GET / HTTP/1.1", upstream: "http://unix:///sample-app/tmp/sockets/puma.sock:/500.html", host: "***********"

↑ Ich ärgere mich endlos über einen solchen Fehler.

Einstellung jeder Umgebungsvariablen

Recommended Posts

[Für Super-Anfänger (mehr Squeeze)] Automatische Bereitstellung in AWS ECR / ECS mit Ruby2.6 x Rails6 x CircleCi [Hands-on-Format]
Stellen Sie Rails mit AWS Copilot für ECS Fargate bereit
[Teil 2] Testen und Bereitstellen von WEB-Diensten, die mit Rails + Nuxt + MySQL + Docker mit ECS / ECR / CircleCI erstellt wurden, automatisch für Terraform
[Teil 1] Testen und Bereitstellen von WEB-Diensten, die mit Rails + Nuxt + MySQL + Docker mit ECS / ECR / CircleCI erstellt wurden, automatisch für Terraform
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
[Einfach] So formatieren Sie Ruby erb-Dateien automatisch mit vsCode
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 2
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 0