fargateを利用した環境構築の苦労

投稿者
kanno
fargateを利用した環境構築の苦労

このブログを見てくださっている方、まだ見ていない方、こんにちは!
スタテク開発部の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;
    }
  }
}

ローカルで確認

  1. $ docker-compose up -d
  2. 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のタスク定義で設定します!

  1. 環境変数の設定
  2. 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で利用するサービスの公式ドキュメントは読むようにしましょう!(自分自身に対しての戒めです)

おしまい!

一緒にスタートアップを盛り上げませんか?
NOT NULL制約追加時のinvalid use of NULL valueを解消する
2020/03/27