AWS EC2(ubuntu)にnginx+Rails+RDSアーキテクチャをデプロイするときにハマったこと


どうもこんにちは。大平です。

サイドプロジェクトで生EC2に環境を構築する機会があったのでハマったこと、回避策(ワークアラウンド)などを記述していきます。

ハマりポイント0: AMIを選ばない

必要最小限のパッケージしか入っておらず、追加でインストールするスクリプトが非常に汚くなります。
Ubuntuを差し置いてAMIを使う理由があまりなかったのでUbuntuでいくことにします。

最初期のubuntuが起動したらやるべきこと

公開鍵の設定を書き換えてからec2インスタンスへssh

公開鍵はダウンロードしたままでは権限が正しくないので公開鍵として使えません。

chmod 400 hogehoge.pem

権限を落として、

ssh ubuntu@52.11.**.** -i hogehoge.pem

で起動できることを確認する。

ハマり点1:鍵のパーミッションが正しいのに拒絶される…

AWSのセキュリティグループが正しく設定されていない場合がある。

EC2のインバウンド・セキュリティグループを見て、自分のIPからのsshを許可するように設定すること。アウトバウンドは特に何も設定しなくて良い。

EC2内でやること。

・nginx入れる
・node,rubyの実行環境入れる
が目的。(Redis入れたりDB本体を入れたり、このあたりは人によって違うと思いますが、一旦最小構成で動かすことを想定します。実際、この案件ではDBはRDSを使っていて、EC2インスタンス内部に持つべきものではありませんでした)

sudo apt update
# nginx入れる
sudo apt install -y nginx
# mysql2ドライバのコンパイルに必要
sudo apt-get install mysql-client libmysqlclient-dev

# nginx起動
service nginx start
# rbenv入れる
git clone https://github.com/sstephenson/rbenv.git .rbenv
git clone https://github.com/sstephenson/ruby-build.git .rbenv/plugins/ruby-build
rbenv install 2.5.1
rbenv global 2.5.1
rbenv rehash
gem update --system
gem install -y bundler # ここまでで、rails以外のrubyの実行基盤が完成する
# node入れる
git clone git://github.com/creationix/nvm.git ~/.nvm
echo 'source ~/.nvm/nvm.sh' >> ~/.bashrc
nvm install v8.11.3 #一応安定版らしい
# ちなみに、パッケージマネージャでインストールできるNodeはバージョンがとても古く、yarnを動かせないので使うべきではありません。

# yarn
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn

node,rbenvの起動シェルスクリプトの位置

今回ハマった最大ポイントでした。何も考えずに.bash_profile

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

と書いてしまうと、bundle exec cap production deployのassets:precompileで古いnodeが参照されてエラーになります。

Capistranoのシェルはログインシェルではないので、.bashrcを読み込まず、nvmによって定義された最新のnodeを認識できません。

ではどのようにするかというと、.bashrcに書きます。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"

# If not running interactively, don't do anything
...

.bashrcはすでに設定がたくさんありますが、# If not running interactively, don’t do anythingのコメントの上に記述してください。

参考

Capistrano で.bash_profileに書いてある環境変数が読まれない件

RDS

つながらない場合

  • 真っ先にセキュリティグループの設定を確認すること。インバウンドに自分のIPアドレス(これはローカルから接続するときに使う)、及びEC2のセキュリティグループを追加すること。
  • MySQLを使う場合、パラメータセットデフォルトを使うと文字コード設定がlatin1になって日本語が登録できなくなる。なので、utf8mb4用のパラメータセットを予め作成しておき、RDSのCREATE DATABASE時にこれを選択して起動する。

参考

RDSで日本語を使う場合の初期設定(utf8mb4)

すべて正常に行ったら、

bundle exec cap production deploy

でデプロイ。

なんだかんだで半日前後使ってしまいました。特にCapsitrano上でパスが通らない問題の解決に時間を要しました。

まぁ、最終的に動くものができたので良かったです!

PR

Amazon Web Servicesではじめる新米プログラマのためのクラウド超入門
は、Webコンソールからの操作を前提にしたAWS入門書です。「とりあえず使ってみたい!」人はこちらがおすすめです。

Amazon Web Services実践入門 (WEB+DB PRESS plus)は、
aws-cliを入れてCUIからの操作が多めのAWS入門書です。しっかりやりたい人にはこちらがおすすめです。