Aurora MySQLのmax_connectionsの設定
テスト環境でrailsのdatabase.ymlのpool設定を本番に合わせたいが、Auroraの方のmax_connectionsが45になっていた。
これでは足りないので45より多くしたい。
まず、Auroraのmax_connectionsはインスタンスタイプでデフォルトが決まるような設定がされている。
なので、これを変更する。
そのために、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を見るなどします。
cronの設定は必要か?
下記のように、/etc/crontabか/etc/anacrontabを確認しましょう。
【logrotateの実行タイミング】/etc/crontabに無い時の確認方法 - Qiita
今回検証していたCentOSの場合は/etc/anacrontabに設定されているので特にcronの設定をしなくても動くはず。
今さらjquery-railsがcsrfトークンをいい感じにしてくれていたことを知った
RailsでPOSTなどするときはCSRFのチェックが行われるのでトークンを送る様にしないといけないのだけど、axiosとかで自分でajaxリクエスト投げる時はちゃんとcsrfトークンを付与しないと行けなくて面倒だなーと思っていた。
その時、そういえばなんでRailsでjQueryの$.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リダイレクトに苦しめられた
完全に下記のヤツなんだけど見つけるまですごくハマった。。。
S3のcssファイルとかを直接参照するのではなくCloudfrontからのみ参照できる様にクラメソさんの下記の記事を見て色々設定を検証していたんだけど、なぜかcloudfrontのURLにアクセスしてもS3のURLにリダイレクトされてAccess Deniedになってしまって???となった。
原因としては上記の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をインストールする
下記を参考にしつつインストール。
フォントのインストール
git clone https://github.com/powerline/fonts.git --depth=1 cd fonts ./install.sh cd .. rm -rf fonts
Macの標準ターミナルのフォント変更は下記がキャプチャ付きでわかりやすい。
python3のインストール
Macにはデフォルトでpython2が入っているのでそれでもいいが、折角なのでpython3にした。 (virtualenvはこの時点では特に使わないのだけど今後のためにインストールだけしてみた
$ 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