パパエンジニアのアウトプット帳

30歳に突入した1児のパパエンジニアのブログ

Aurora MySQLのmax_connectionsの設定

テスト環境でrailsのdatabase.ymlのpool設定を本番に合わせたいが、Auroraの方のmax_connectionsが45になっていた。

これでは足りないので45より多くしたい。


まず、Auroraのmax_connectionsはインスタンスタイプでデフォルトが決まるような設定がされている。

docs.aws.amazon.com

なので、これを変更する。


そのために、AWSのコンソールからRDS→パラメーターグループから対象RDSに対応するパラメーターグループを選択して、フィルターでmax_connectionsで検索して"パラメーターの編集"を押して変更すればOK。

特に RDSの再起動をしなくても設定が適応されている。(適用タイプがdynamicなので)

mysql> SHOW VARIABLES LIKE 'max_connections';で確認

logrotateを使ってローテションを行う

設定方法&確認

下記などを参考にした。

logrotateでログのローテーションをする - おもしろwebサービス開発日記

logrotate でデフォルト以外のフォーマットで日付ファイル名にしたいとき - Qiita


こんな感じで設定してみた。

日次で前の日のログをローテートするのに日付がローテートした日付なのがなんか気持ち悪いから、lastactionで前の日のファイル名にしてみた。

(これでいいかはちょっと自信ない)

追記(2018/04/12)

postrotateでやってないのは、compressを指定しているから。

ローテート→postrotate→compressの流れになるようなので、postrotateでrenameするとcompressがrename前のファイルを圧縮しようとしてエラーになった。

/my/rails/application/log/*.log {
    daily
    rotate 30
    missingok
    notifempty
    copytruncate
    dateext
    dateformat .%Y%m%d
    compress
    su root root

    lastaction
        for infile in $1; do
            if [ -f $infile.`date '+%Y%m%d'`.gz ] ; then
                mv $infile.`date '+%Y%m%d'`.gz $infile.`date --date '1 days ago' '+%Y%m%d'`.gz
            fi
        done
    endscript
}


logrotateのテストはf,dオプションをつけて確認する。

# dオプションを付けるとデバック実行で実際には実行されない
$ logrotate -d /etc/logrotate.d/rails

# fオプションだと実際に実行される
$ logrotate -f /etc/logrotate.d/rails

といあえず指定できるやつは下記をみたら意味がわかると思う。

@IT:logrotateの設定ファイルで指定できる主なコマンド

他のオプションはmanを見るなどします。

logrotate(8) - Linux man page

cronの設定は必要か?

下記のように、/etc/crontabか/etc/anacrontabを確認しましょう。

【logrotateの実行タイミング】/etc/crontabに無い時の確認方法 - Qiita


今回検証していたCentOSの場合は/etc/anacrontabに設定されているので特にcronの設定をしなくても動くはず。

https://daichan.club/linux/639

細かすぎて伝わらない anacron の挙動 - Qiita

Macで特定のアプリにショートカットを割り当てた

下記のやつをやっただけなんだけど、開発とかでよく使うChrome,Terminal,RubyMineにショートカットを割り当てて一発でそのアプリをアクティブにできるようにした。

qiita.com

あとウィンドウ操作系は下記のやつを職場の人に教えてもらったので、早速インストールした。

Spectacle

今さらjquery-railsがcsrfトークンをいい感じにしてくれていたことを知った

RailsでPOSTなどするときはCSRFのチェックが行われるのでトークンを送る様にしないといけないのだけど、axiosとかで自分でajaxリクエスト投げる時はちゃんとcsrfトークンを付与しないと行けなくて面倒だなーと思っていた。

その時、そういえばなんでRailsjQueryの$.ajax使ってる時はトークン渡さなくていいんだっけ?となって調べて見たらjquery-railsがいい感じにしてくれてましたということでした。

jquery-rails/jquery_ujs.js at 47d15123e27ca22f642b7befaeb152339f5d466a · rails/jquery-rails · GitHub


jquery-ujsでも同様なのでwebpacker使ってても安心。

jquery-ujs/rails.js at 4849eca8ff76a0a2a83a8ff4d5cefef2c2fa3cb4 · rails/jquery-ujs · GitHub

Cloudfront,S3で307リダイレクトに苦しめられた

完全に下記のヤツなんだけど見つけるまですごくハマった。。。

miyasakura.hatenablog.com


S3のcssファイルとかを直接参照するのではなくCloudfrontからのみ参照できる様にクラメソさんの下記の記事を見て色々設定を検証していたんだけど、なぜかcloudfrontのURLにアクセスしてもS3のURLにリダイレクトされてAccess Deniedになってしまって???となった。

dev.classmethod.jp


原因としては上記のURLを辿って行ったstackoverflowに書いてある。

amazon web services - AWS CloudFront returns http 307 when origin is S3 bucket - Stack Overflow

All buckets have at least two REST endpoint hostnames. In eu-west-1, they are example-bucket.s3-eu-west-1.amazonaws.com and example-bucket.s3.amazonaws.com. The first one will be immediately valid when the bucket is created. The second one -- sometimes referred to as the "global endpoint" -- which is the one CloudFront uses -- will not, unless the bucket is in us-east-1. Over a period of seconds to minutes, variable by location and other factors, it becomes globally accessible as well. Before that, the 307 redirect is returned. Hence, the bucket was not ready.


Cloudfrontは上記でいう2つ目のエンドポイントを利用するので、すぐには有効にならずCloudfrontがリダイレクト状態をキャッシュしてしまう。 (なので、時間をおいてCloudfrontでinvalidationをしてやればいいらしいが、これ数分とかでなく1時間とか2時間くらい必要な時もある。。。)


バージニアリージョンにバケットを作成するとこの事象は起きないので、特にリージョンを気にならないならバージニアに作った方が変にハマらなくていいと思う。

(その他のリージョンの場合も先にバケット作成して時間おいてからCloudfrontの設定すると発生しづらい?)

リクエストのリダイレクトと REST API - Amazon Simple Storage Service

米国東部 (バージニア北部) リージョン (s3.amazonaws.com エンドポイント) にバケットを作成した場合は、リダイレクトされません。このリージョンがデフォルトのエンドポイントであるためです。

vue.jsでtable内でtemplateを使うとIEで効かない問題

原因は下記のissueで書かれている通りなんだけど

https://github.com/vuejs/vue/issues/3028

The browser removes those elements before Vue can get access to them, 
because following the HTML spec, only thead, tbody and <tr> are allowed as direct children of a <table> element.


つまりtableの子要素はthead/tbody/trしか仕様としては許可してないからIEだとブラウザがtemplateを削除してしまうと。。。


vue.js v2なら大丈夫らしい。

Vue 2.0 will use a virtual DOM for templates, which does free us of such limitations.

v1なのは察してください。

powerline-shellをインストールする

下記を参考にしつつインストール。

linuxfan.info

フォントのインストール

git clone https://github.com/powerline/fonts.git --depth=1
cd fonts
./install.sh
cd ..
rm -rf fonts

Macの標準ターミナルのフォント変更は下記がキャプチャ付きでわかりやすい。

joppot.info

python3のインストール

Macにはデフォルトでpython2が入っているのでそれでもいいが、折角なのでpython3にした。 (virtualenvはこの時点では特に使わないのだけど今後のためにインストールだけしてみた

qiita.com

$ brew install python3
$ python3 -V
Python 3.6.4
$ python -V
Python 2.7.10
$ pip3 --version
pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)
$ pip3 install virtualenv
Collecting virtualenv
  Downloading virtualenv-15.1.0-py2.py3-none-any.whl (1.8MB)
    100% |████████████████████████████████| 1.8MB 819kB/s 
Installing collected packages: virtualenv
Successfully installed virtualenv-15.1.0
$ pip3 install --user powerline-shell
Collecting powerline-shell
  Downloading powerline_shell-0.4.9-py2.py3-none-any.whl
Collecting argparse (from powerline-shell)
  Downloading argparse-1.4.0-py2.py3-none-any.whl
Installing collected packages: argparse, powerline-shell
Successfully installed argparse-1.4.0 powerline-shell-0.4.9

python3のpipでインストールしたのでpowerline-shellのインストール場所が参考と違うので.zshrcは下記の様にした

function select-history() {
  BUFFER=$(history -n -r 1 | fzf --no-sort +m --query "$LBUFFER" --prompt="History > ")
  CURSOR=$#BUFFER
}
zle -N select-history
bindkey '^r' select-history

function powerline_precmd() {
    PS1="$(~/Library/Python/3.6/bin/powerline-shell --shell zsh $?)"
}

function install_powerline_precmd() {
  for s in "${precmd_functions[@]}"; do
    if [ "$s" = "powerline_precmd" ]; then
      return
    fi
  done
  precmd_functions+=(powerline_precmd)
}

if [ "$TERM" != "linux" ]; then
    install_powerline_precmd
fi