Rails를 AWS ECS(Fargate)에서 호스팅하는 모든 환경 구축 [2. Docker 정의, ECR 설정]

9383 단어 ECRRailsECS도커AWS

위의 일



Rails를 AWS ECS(Fargate)에서 호스팅하는 모든 환경 구축 [1. 전담, N/W+α]
htps : // 코 m / 포 r_ 베어 r_ 테 ch / ms / 에cb755b34f143 후 0085f

AWS의 준비는 이전 기사에서 썼습니다.
이 기사에서는 ECS에 배포하기 전에 준비로 ECR에 컨테이너 이미지를 푸시하기 전까지를 설명합니다.

작성할 컨테이너 구성



ECS의 1 태스크(※)내에서는, nginx를 리버스 프록시로서 사용해, Rails의 어플리케이션 서버(unicorn)에의 요구를 다루는 구성으로 하고 있습니다.


※ 태스크 ... ECS로 가동시키는 컨테이너의 한 세트.

Rails 프로젝트 구성 등



샘플에서는 배포 환경 이름을 staging으로 설명합니다.
언어, 미들웨어 관련 버전은 곳곳 기재도 있습니다만, 아래와 같습니다.
  • ruby: 2.6.6
  • Ruby on Rails: 6.0.3
  • nginx: 1.19.1
  • unicorn: 5.6.0

  • 응용 프로그램의 디렉토리 구성은 다음과 같습니다.
    개입 감출 버려 깨끗하지 않은 구성이지만, 빌드 할 때 경로 지정하기 때문에 문제는 없습니다.
    /application
    L /app
    L /bin
      ...
    L /containers
    |   L /nginx
    |       L Dockerfile
    |       L nginx.conf
    |       L conf.d
    |           default.conf
      ...
    L Dockerfile.development
    L Dockerfile.staging
    L entrypoint.sh
      ...
    
    

    nginx 설정



    nginx 설정 파일



    이하 2점의 설정 파일을 작성합니다.

    nginx의 기본 설정 파일입니다.
    여러가지 기사를 참고로 하고 있습니다만, 일반적인 설정 내용과 다른 점은 keepalive_timeout를 600초로 설정하고 있는 점입니다.

    /containers/nginx/nginx.conf
    user  nginx;
    worker_processes  auto;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections 1024;
    }
    
    http {
    
      include       /etc/nginx/mime.types;
      default_type  application/octet-stream;
    
      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    
      access_log  /var/log/nginx/access.log  main;     
    
      sendfile           on;
      keepalive_timeout  600;
    
      include  /etc/nginx/conf.d/*.conf;
    }
    

    응용 프로그램에 대한 기본 설정 파일입니다.
    upstream에 기술하는 접속처를, 로컬로 Docker 컨테이너끼리 통신하는 경우와 달리,
    127.0.0.1을 설정하는 점이 중요한 것 같습니다.
    또, 타임 아웃치는 nginx.conf와 같이 600초로 하고 있습니다.

    /containers/nginx/conf.d/default.conf
    upstream unicorn {
      server 127.0.0.1:3000;
    }
    
    server {
      listen 80 default_server;
      server_name  localhost;
      root  /usr/share/nginx/html;
      try_files  $uri/index.html $uri @unicorn;
    
      proxy_connect_timeout 600;
      proxy_read_timeout    600;
      proxy_send_timeout    600;
    
      client_max_body_size 100m;
      error_page 404             /404.html;
      error_page 505 502 503 504 /500.html;
    
      location @unicorn {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn;
      }
    }
    

    nginx 용 Dockerfile



    nginx는 개발 환경에서는 사용하지 않으므로 준비하는 Dockerfile은 1종류로 하고 있습니다.
    방금 작성한 2개의 설정 파일을 컨테이너 내에 배치하고 있습니다.

    /containers/nginx/Dockerfile
    FROM nginx:1.19.1
    RUN apt-get update && \
        apt-get install -y apt-utils \
                           locales && \
        sed -i -e 's/# ja_JP.UTF-8/ja_JP.UTF-8/g' /etc/locale.gen && \
        locale-gen ja_JP.UTF-8
    ENV LANG ja_JP.UTF-8
    ENV LC_TIME C
    COPY ./nginx.conf /etc/nginx/nginx.conf
    COPY ./conf.d/default.conf /etc/nginx/conf.d/default.conf
    

    Rails 설정



    애플리케이션 컨테이너용 Dockerfile



    개발 환경의 Dockerfile과는 차별화하기 위해 Dockerfile.staging으로 파일을 만들고 있습니다.
    개발 환경의 컨테이너와의 차이점은 AWS System Manager SSM(Session Manager)용 에이전트를 설치한다는 것입니다.
    또한 SSM으로 연결할 때 sudo 명령을 실행하기 위해 추가로 설치합니다.

    Dockerfile.staging
    FROM ruby:2.6.6
    
    RUN 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
    RUN apt-get update -qq && apt-get install -y --no-install-recommends build-essential nodejs curl git mariadb-client yarn sudo
    
    # AWS System Manager セッションマネージャ用のエージェントをインストール
    RUN curl https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/debian_amd64/amazon-ssm-agent.deb -o /tmp/amazon-ssm-agent.deb \
        && dpkg -i /tmp/amazon-ssm-agent.deb \
        && cp /etc/amazon/ssm/seelog.xml.template /etc/amazon/ssm/seelog.xml
    
    RUN gem install bundler 
    
    ENV INSTALL_PATH /application
    
    RUN mkdir $INSTALL_PATH
    
    WORKDIR $INSTALL_PATH
    
    COPY ./Gemfile /application/Gemfile
    COPY ./Gemfile.lock /application/Gemfile.lock
    
    RUN bundle install
    
    COPY . .
    
    EXPOSE 3000
    

    지금까지 컨테이너 관련 정의는 완료.

    AWS ECR



    리포지토리 만들기



    서비스 > ECS > 리포지토리에서 ECR 목록 화면을 표시합니다.
    오른쪽 상단의 "리포지토리 만들기"에서 두 개의 컨테이너 이미지 리포지토리를 만듭니다.


    만들기는 간단합니다.
    이름을 붙여, 나머지는 임의로 이미지의 스캔이나 암호화를 실시하는 경우에는 유효하게 해 주세요.


    리포지토리에 푸시



    Rails 애플리케이션 용 컨테이너, Nginx 용 컨테이너 리포지토리를 만든 후,
    각 컨테이너의 푸시 명령을 표시합니다.


    다음과 같은 명령이 있습니다.
    빌드 커멘드만, Dockerfile의 명칭을 변경하고 있으므로 파일명 지정하도록(듯이) 변경하고 있습니다.
    2개의 리포지토리의 푸시 커멘드를 정리해, 쉘 스크립트로 해 버려도 좋다고 생각합니다.
    # 認証トークンを取得し、レジストリに対して Docker クライアントを認証します。
    $ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 813xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
    
    # Docker イメージを構築します。
    $ docker build -f ./Dockerfile.staging -t sample-rails .
    $ docker build -f ./containers/nginx/Dockerfile -t sample-nginx ./containers/nginx
    
    # リポジトリにイメージをプッシュできるように、イメージにタグを付けます。
    $ docker tag sample-rails:latest 813xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sample-rails:latest
    $ docker tag sample-nginx:latest 813xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sample-nginx:latest
    
    # リポジトリにこのイメージをプッシュします。
    $ docker push 813xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sample-rails:latest
    $ docker push 813xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/sample-nginx:latest
    

    실행하고 푸시 할 수 있으면 이미지에 latest가 추가됩니다.


    요약



    이제 ECS에서 시작할 컨테이너 이미지를 준비했습니다.
    다음 기사에서 ECS를 구축하고 시작할 때까지를 설명합니다.

    다음글
    htps : // 이 m / po r_bea r_는 ch / ms / 7 또는 2 a 0c168 a 621cbfdbf

    좋은 웹페이지 즐겨찾기