初心者インフラエンジニアが困ったときに試行錯誤するブログ

インフラエンジニアが,開発の勉強をするときのログを残します

DockerでRailsを動かす その3

実現したいこと

AWS ECS上で,Railsプロジェクトを動かしてみようと思います.

前回の戦いはこちら

ktaka.hatenablog.com

やったこと

ECSをさっそく立ち上げて,前回動いたDockerのイメージを載せてみたいと思います.

AWSのアカウントはあるので,ECSでFargateを使用します.

f:id:tktkttr:20181114224803p:plain

ポチポチしていくだけで完了.サービス名やVPNなどは,適当で.

とりあえず動かすのを目的にします.

f:id:tktkttr:20181114225537p:plain

first_taskをとりあえず定義すれば,あっという間にサンプルタスクがうごきました.これはすごい...

Fargateはタスクに対して秒単位で課金されるので,直ちにfirst_taskを停止.

次に,ローカルで作ったイメージをこのsample appの変わりに起動させたいと思います.

そのためには,ECRというコンテナレポジトリにイメージを登録する必要があるとのこと.

ECSのメニューバーからECRに飛べて,ポチポチするだけなので秒で作成完了.CLIからのpushなどの操作方法まで示してくれる親切設計.

さーて指示通りにCLIからpushするかーと思ったら,

$ aws help
bash: aws: command not found

あれ?CLIインストールしてなかったっけ? というわけでインストールします.

$ curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
$ sudo python get-pip.py
$ sudo pip install awscli

はい,簡単ですね!と思いきや...

matplotlib 1.3.1 requires nose, which is not installed.
matplotlib 1.3.1 requires tornado, which is not installed.
Installing collected packages: urllib3, jmespath, six, python-dateutil, docutils, botocore, pyasn1, rsa, colorama, PyYAML, futures, s3transfer, awscli
  Found existing installation: six 1.4.1
Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

....??????

noseとtornadoが必要でsixがアンインストールできないとのこと.

一個ずつやってみるか.

$ sudo pip install tornado
$ sudo pip install nose
...
Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/man'

環境のparmissionエラーかなにかが出たが,再度実行すると出ないし問題ないみたい.

sixの更新をしてみる

$ sudo pip install six -U
...
Cannot uninstall 'six'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

更新できない?uninstallを頑なに拒んでくるんだが.

こいつは無視できないのか?

$ sudo -H pip install awscli --upgrade --ignore-installed six
$ aws help

インストールできた...!!!

さて,忘れないうちにAWS CLIのプロファイルも作っておきましょう.

アクセスキーは,AWSコンソールの,認証情報>ユーザーから作れます.

$ aws configure --profile <profile名>
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1
Default output format [None]: json

$(aws ecr get-login --no-include-email --profile <profile名>) #自動ログイン

ようやくこれでコンテナイメージをpushできる!

と思いきや

$ docker tag <コンテナイメージ名>:<ローカルのタグ> <AWS-ECRリポジトリに登録するイメージタグ> #ECRリポジトリ作成時の指示通りに進める
$ docker push <タグ名>
...
no basic auth credentials

あーーーー,認証エラー.

これは調べてみると,リージョンがずれていた模様.

$ vi ~/.aws/config 

で書き換えて,再ログインし,実行!!!

無事push成功しました.

立ち上げようと思い,Fargateのタスク定義から,コンテナイメージURIを選択.

実行しようと思ったら,

Security group ... does not appear to belong to the same VPC as the input subnets.

というエラーが.

サブネットを変えて,タスク定義を編集し,実行してみると,うまくいった.

IPv6はdisableでもいいらしい.v4が使えるからか.ネットワーク周りは,ざっくりとした理解しかしていないからもっと精緻に知っておく必要があるなぁ.

起動は一瞬するんだけど,すぐにPENDINGになり,タスクが消えてしまう.

これはなんだろう.コンテナの起動はローカルでは成功しているのに.設定がなにか間違っているのか?

...続く

参考

以下の記事を参考にさせていただきました.

早速AWS Fargateで、ECSで動かしているタスクを動かしてみた! - コネヒト開発者ブログ

AWS CLI のインストールと設定 - Amazon Kinesis Data Streams

https://saku.io/failed-to-install-awscli-on-mac/

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/common-errors-docker.html#error-403

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

DockerでRailsを動かす その2

実現したいこと

Docker上でRailsを動かしたい.その2です.

前回の戦いはこちら

ktaka.hatenablog.com

やったこと

以下のファイルを変更,追加してローカルDBに接続できるかを調整

docker-compose.yml

version: '3'
services:
  web:
    container_name: rails-sample-app
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/usr/src/app
    ports:
      - "3000:3000"

database.yml

default: &default
  adapter: postgresql
  encoding: utf8
  pool: 5
  # 以下の3つを追加
  username: <%= ENV.fetch('DB_USERNAME', 'root') %>
  password: <%= ENV.fetch('DB_PASSWORD', 'dummy') %>
  # RailsサーバとPostgreSQLサーバが同じ場合
  host:     <%= ENV.fetch('DB_HOST', 'db') %>
development:
  <<: *default
  database: sample-db
test:
  <<: *default
  database: sample-db
production:
  <<: *default
  database: hello_rails_production
  username: hello_rails
  password: <%= ENV['HELLO_RAILS_DATABASE_PASSWORD'] %>

env.dev

DB_USERNAME= <usernamehoge>
DB_PASSWORD= <passwordhoge>
DB_HOST=docker.for.mac.localhost
~

なんかうまくいかないよう.すぐコンテナがダウンしてしまう.

Could not locate Gemfile or .bundle/ directory

とのこと.パスがおかしいのか?

Dockerfileを編集してみる

Dockerfile

FROM ruby:2.3.7
ENV LANG C.UTF-8

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ENV APP_ROOT /usr/src/app
RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT

ADD app/Gemfile $APP_ROOT
ADD app/Gemfile.lock $APP_ROOT

RUN gem install bundler #追加.これが必要?
RUN bundle install

ADD app $APP_ROOT
$ docker compose build
$ docker compose up

また失敗.同じエラーがでる.全然クリティカルな解決ができない...

修正

Dockerfile

FROM ruby:2.3.7
ENV LANG C.UTF-8

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ENV APP_ROOT /usr/src/app
RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT

ADD app/Gemfile $APP_ROOT/Gemfile # ここじゃないか...?
ADD app/Gemfile.lock $APP_ROOT/Gemfile.lock

RUN gem install bundler #追加.これが必要?
RUN bundle install

ADD app $APP_ROOT

また失敗

Dockerfile

FROM ruby:2.3.7
ENV LANG C.UTF-8

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ENV APP_ROOT /app #ここのパスがappであればうまくいく
RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT

ADD app/Gemfile $APP_ROOT/Gemfile 
ADD app/Gemfile.lock $APP_ROOT/Gemfile.lock 

RUN gem install bundler 
RUN bundle install

ADD app $APP_ROOT

成功した...

理由がよくわかっていないのが残念だが,コピー先がうまくいっていなかったのだろうか.ディレクトリがうまく作成できていなかったのだろうか

localhost:3000でつなぐと,Railsの初期画面が...!!!

やっとのことでRailsをDocker上で動かせました.

続く...

ktaka.hatenablog.com

参考

以下の記事を参考にさせていただきました.

既存のRailsアプリをDocker化し、ローカルのDBに接続する方法 | Enjoy IT Life

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

Macのローカルにpgをインストールするときにはまったこと

実現したいこと

postgresqlをgemでインストールしたかった

やったこと

Gemfile

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.3.7'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.0'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 3.11'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'mini_racer', platforms: :ruby

# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use ActiveStorage variant
# gem 'mini_magick', '~> 4.8'
$ bundle install

これでとりあえずアプリは動くよなー

と,思いきや...

Installing pg 1.1.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/private/var/folders/sw/fst19tjs2bnf_05_g6gg8wcc0000gn/T/bundler20181111-33236-o5h7onpg-1.1.3/gems/pg-1.1.3/ext
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r
./siteconf20181111-33236-70rx9k.rb extconf.rb
checking for pg_config... yes
Using config values from /usr/local/bin/pg_config
checking for libpq-fe.h... yes
checking for libpq/libpq-fs.h... yes
checking for pg_config_manual.h... yes
checking for PQconnectdb() in -lpq... no
checking for PQconnectdb() in -llibpq... no
checking for PQconnectdb() in -lms/libpq... no
Can't find the PostgreSQL client library (libpq)

こんな感じのエラーが出て...

$ brew install libpq

これで解決!?

かと思いきや,また同じエラーが...

これに従い,

f you need to have libpq first in your PATH run:
  echo 'export PATH="/usr/local/opt/libpq/bin:$PATH"' >> ~/.bash_profile

For compilers to find libpq you may need to set:
  export LDFLAGS="-L/usr/local/opt/libpq/lib"
  export CPPFLAGS="-I/usr/local/opt/libpq/include"

パスを3つ追加してもだめ,

$ source ~/.bash_profile

もしているけど,同じエラーが出る.

これで解決

$ sudo env ARCHFLAGS="-arch x86_64" gem install pg

参考

以下の記事を参考にさせていただきました.

ruby on rails - Can't find the PostgreSQL client library (libpq) - Stack Overflow

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

localにPostgresqlをインストールし,DBを立ち上げる

実現したいこと

MacにBDを立ち上げていろいろしたい.

でもMysqlじゃなくてPosgreがいいなーと思い,調べてみた

やったこと

$ brew install postgresql
$ initdb /usr/local/var/postgres -E utf8
$ postgres --version
$ postgres -D /usr/local/var/postgres
$ psql -l

.bash_profile

# PostgreSQL設定(DBの置き場所)
export PGDATA=/usr/local/var/postgres

起動時

$ pg_ctl  -l /var/log/postgres start

終了時

$ pg_ctl stop

ユーザー追加

$ createuser -P <pg-user> 

DBの作成

$ createdb example-db -O <pg-user>

ユーザーとDBの確認

$ psql -q -c'select * from pg_user' example-db 

DB接続

$ psql -U <pg-user> example-db

DB接続解除(\はoption+¥)

\q

注意点

  • pgのインストールは結構時間かかります.10分くらいはみておいていいかも.
  • pathを通すときは,以下のコマンドを打たないと反映されない
$ source ~/.bash_profile

参考

以下の記事を参考にさせていただきました.

qiita.com

本記事について

本記事は,学習を目的に書かれています.

間違い,改良案などございましたら,コメントしていただけると幸いです.

基本的に編集途中ですので,何を書いてほしいかもコメントいただけると,

その情報を中心に追記します.

DockerでRailsを動かす その1

実現したいこと

Dockerの導入に伴い,RailsプロジェクトをDocker上で動かします. すでに,Dockerのインストールは行っており,環境はMacで行います.

やったこと

以下の構成でやってみます

Gemfile

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.3.3'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.0'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 3.11'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# See https://github.com/rails/execjs#readme for more supported r
untimes
# gem 'mini_racer', platforms: :ruby

# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

docker-compose.yml

version: '3'

services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - ./app:/app
    ports:
      - 3000:3000
    # environment:
    # DATABASE_HOST: host.docker.internal

Dockerfile

FROM ruby:2.3.3
ENV LANG C.UTF-8

# apt-utils is not installed対策
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NOWARNINGS yes

RUN apt-get update && apt-get install -y build-essential libpq-dev postgresql-client qt5-default qt5-qmake libqt5webkit5-dev
RUN gem install capybara-webkit --no-ri --no-rdoc
RUN gem install rails

RUN mkdir /app
WORKDIR /app
COPY ./app /app

# Gitの認証情報
COPY ./git-credential-git-token /usr/local/bin
RUN git config --global credential.helper git-token

ADD /app/Gemfile /app/Gemfile
ADD /app/Gemfile.lock /app/Gemfile.lock

RUN gem install bundler
RUN bundle install

EXPOSE 3000
CMD bundle exec rails s

$docker-compose up -dしてみる.

WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build.
Creating rails-gem-env-test_web_1 ... done

あれ?コンテナが立ち上がらない... なんでだろう.Rails sしているのに

もっと簡単な構成でやってみる

Dockerfile

FROM ruby:2.3.7
ENV LANG C.UTF-8

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ENV APP_ROOT /usr/src/app
WORKDIR $APP_ROOT

ADD app/Gemfile $APP_ROOT
ADD app/Gemfile.lock $APP_ROOT

RUN bundle install

ADD app $APP_ROOT
                       

docker-compose.yml

version: '3'
services:
  web:
    container_name: rails-sample-app
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - pg-db:/usr/src/app
    ports:
      - "3000:3000"
    #depends on では,pg-dbを起動させてからwebを起動する.という順番を設定できる
    depends_on:
      - sample-db
    env_file: .env.dev
volumes:
  sample-db:
    driver: local
~                 

$ bundle installしてから,$ docker-compose up -d する $ rails newしておく

database.yml

default:
  adapter: postgresql
  encoding: unicode
  pool: 5
  # 以下の3つを追加
  username: <user-name>
  password: <password>
  # RailsサーバとPostgreSQLサーバが同じ場合
  host: localhost
development:
  <<: *default
  database: sample-db
test:
  <<: *default
  database: sample-db

bundle installがうまくいかないので,さらにGemfileを書き換え

Gemfile

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.3.7'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.0'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 3.11'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'mini_racer', platforms: :ruby

# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use ActiveStorage variant
# gem 'mini_magick', '~> 4.8'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.1.0', require: false

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 2.15', '< 4.0'
  gem 'selenium-webdriver'
  # Easy installation and use of chromedriver to run system tests with Chrome
  gem 'chromedriver-helper'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

$ rake db:migrateしたら怒られた.

rake aborted!
Psych::BadAlias: Cannot load `Rails.application.database_configuration`:
Unknown alias: default

&defaultがなかったみたい.修正

database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  # 以下の3つを追加
  username: pg-taka
  password: pg-taka
  # RailsサーバとPostgreSQLサーバが同じ場合
  host: localhost
development:
  <<: *default
  database: sample-db
test:
  <<: *default
  database: sample-db

$ rake db migrate 成功した.

$ rake db:setup実行

いけるかなとおもいきや...

Caused by:
PG::InsufficientPrivilege: ERROR:  permission denied to create database

これはなんだ.権限ないのか.

権限を確認する

$ psql -U <権限のあるユーザー名> -d <database>
# \du

 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 <今回のUSER>   | Superuser                                                  | {}
 <superuser>  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
# ALTER ROLE "今回のUSER" WITH SUPERUSER;

権限がついた. 一通りの権限を渡して,再チャレンジ

$ rake db:setup
Database 'sample-db' already exists
Database 'sample-db' already exists
-- enable_extension("plpgsql")
   -> 0.0356s
-- enable_extension("plpgsql")
   -> 0.0224s

通った...!!!

最後に,$docker-compose up -dしようと思ったが失敗したので,再度'docker-compose.yml'を書き換え

docker-compose.yml

version: '3'
services:
  web:
    container_name: rails-sample-app
    build: .
    command: bundle exec railss -p 3000 -b '0.0.0.0'
    volumes:
      - ./app:/app
    ports:
      - "3000:3000"
    environment:
      DATABASE_HOST: host.docker.internal

コンテナは一応立ち上がったが,localhost:3000につなぐと

return PG::Connection.new( *args )エラーが...

Docker導入までの道のりは遠い.

続く...

ktaka.hatenablog.com

参考

以下の記事を参考にさせていただきました.

インストールからRails-PostgreSQL環境を整える - Qiita

MacOSX YosemiteでRails4.xを動かして、Postgresと繋げるときのメモ - Qiita

本記事について

本記事は,学習を目的に書かれています. 間違い,改良案などございましたら,コメントしていただけると幸いです. 基本的に編集途中ですので,何を書いてほしいかもコメントいただけると, その情報を中心に追記します.

CloudWatchLogsの時間設定は重要!?

CloudWatchLogsについて

AWS内でサーバーを監視してくれるサービスです. CLIで設定することができ,今回は,ログ監視を目的に構築していました.

時間について

CloudWatchは,書式設定をしっかりしないと時間が反応してくれません.

設定確認の方法

/var/awslogs/etc/awslogs.confに設定が書いてあります. ログは, /var/log/awslog.log をみればエラーが出たときなど,調査できます.

参考

docs.aws.amazon.com

メモ

まだ途中で雑なので,コメント頂いたら追記します.