Rails를 AWS ECS(Fargate)에서 호스팅하는 모든 환경 구축 [2. Docker 정의, ECR 설정]
위의 일
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으로 설명합니다.
언어, 미들웨어 관련 버전은 곳곳 기재도 있습니다만, 아래와 같습니다.
응용 프로그램의 디렉토리 구성은 다음과 같습니다.
개입 감출 버려 깨끗하지 않은 구성이지만, 빌드 할 때 경로 지정하기 때문에 문제는 없습니다.
/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
Reference
이 문제에 관하여(Rails를 AWS ECS(Fargate)에서 호스팅하는 모든 환경 구축 [2. Docker 정의, ECR 설정]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/polar_bear_tech/items/87f5795346d246a1e07c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)