fargateを利用した環境構築の苦労
- 投稿者
- kanno
このブログを見てくださっている方、まだ見ていない方、こんにちは!
スタテク開発部のkannoです。
Dockerをコンテナを実行できるサービス、AWSのECSを利用して仮想サーバーを構築した際に、
なんじゃいこれ、どうするのよ?
と、詰まったところがあったので、設定方法含め、共有しようかなと思います。
したいこと
ECS(fargate)上でnginxとrailsのサーバーをsock通信で連携させる
前提
DockerやAWS CLIを利用するので、諸々の初期設定はしておいてください🙇
localで各ファイル編集
(いろいろ省略してます..)
docker-compose.yml
# 省略
app:
build:
context: .
dockerfile: ./docker/rails/Dockerfile
command: /bin/sh -c "rm -f /app/tmp/pids/server.pid && bundle exec rails s"
volumes:
- .:/app
- tmp-volume:/app/tmp
nginx:
build:
context: .
dockerfile: ./docker/nginx/Dockerfile
ports:
- 80:80
volumes:
- tmp-volume:/app/tmp
depends_on:
- app
volumes:
tmp-volume: # volumeを使ってsockファイルにアクセスできるようにする
puma.rb
# 省略
app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"
nginx.conf
http {
# 省略
upstream app {
server unix:///app/tmp/sockets/puma.sock;
}
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
root /app/public;
try_files $uri/index.html $uri @app;
keepalive_timeout 5;
location @app {
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://app;
}
}
}
ローカルで確認
$ docker-compose up -d
http://localhost
に接続
AWSで構築
VPCやサブネットなどの設定は省きますので、予め作成しておいてください🙇
defaultで作成されるものを使用してもOK
ECRにイメージをpush
railsとnginxのimageをECRのリポジトリにpushします。
詳しくはここを参考に! -> イメージのプッシュ - Amazon ECR
AWSコンソールからECRでリポジトリ作成
こんな感じで、2つ作成(rails用とnginx用)
イメージをタグづけ&push
railsとnginxイメージのタグ付け
$ docker tag `イメージ名(ID)`:latest `ECRのURI`:latest
CLIでログイン
$ aws ecr get-login --region `所属region` --profile `設定したプロファイル` --no-include-email
ログインのコマンドがレスポンスされるので、コピペしてもう一度ターミナルで叩く
Login Succeeded
が返ってくればOK!ECRのURIでタグ付けしたイメージをpush
& docker push `ECRのURI`:latest
ECS設定
- タスク定義(起動タイプ:fargate)
先ほどpushしたイメージのURIを設定して、コンテナをrailsとnginxの2つ定義します。
- クラスター設定(AWS fargateを使用)
クラスター名を付けるくらいかな..
- サービスの設定、起動
実際にタスクを動かすためのサービスを作成します。
先ほど作成したECSタスクを設定し、その他のVPCの設定などはdefaultで作成されるものを利用しても大丈夫です。
サービスを作成すると、勝手に起動します。
あとはアクセスして確認するのみ!
…
…
タスクがstoppedになって起動しない… ここから苦労しました。
そもそも、環境変数で設定している値や、docker-compose.ymlに記述した設定は
反映されていないので、設定する必要がありました。
以下2つをECSのタスク定義で設定します!
- 環境変数の設定
- volumeの設定
環境変数設定
railのコード内で、環境変数を利用している箇所に対して、情報を起動コンテナに渡してあげます。(DBはRDSを利用するかと思うので)
※コードに直書きしている場合は問題なし
今回はこの箇所に直書きしていますが、AWS Systems Managerを利用してパラメータを渡すこともできるので、後者がおすすめです!
AWS Systems Manager パラメータストア
volumeの設定
nginxコンテナからpuma.sockにアクセスするためにdocker-compose.ymlでvolumeを作成しましたが、
ECSのタスク定義でnginxコンテナからアクセスできるように、volumeソースをrailsコンテナに設定します。
fargateだからインフラレイヤーはうまくやってくれるだろうと、
ECSのタスク定義をdefaultのまま設定していたので、?????の状態からなかなか抜け出せませんでした…
しっかりとAWSで利用するサービスの公式ドキュメントは読むようにしましょう!(自分自身に対しての戒めです)
おしまい!