AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

watchdog timeout: no checkins from watchdogd in

discussionsjapan.apple.com

apple.stackexchange.com

SMC 初期化したらその回だけはイケるけど、次回はまたぶっ壊れるらしいとのこと。

公証チェック周りで、サードパーティになる gem とか brew とか使ってる (パスに入れてる) とダメらしいけど、もうこれ Apple の罪だな! ということで一年近く悩まされたけど、どうしようもないので平定。 macOS からサヨナラ!するときが来たか。

AWS ElastiCache(Redis) で認証を入れる際の罠

自前で用意する Redis

redis.conf へ以下のように requirepass を設定します。 この場合は、 foobared というパスワードが設定されており、TLS などの暗号化通信は必要ない状態です。

# snip #

requirepass foobared

# snip #

blog.shimar.me

ちなみに、公式のドキュメントからいつの間にか解説がなくなって、全部コンフィグ読めとなっていた。

最近、一行 (80 文字くらい) を超えるコードコメントは、個人的には非常に良くないと思うようになってしまった。

https://raw.githubusercontent.com/redis/redis/6.0/redis.conf

ちなみに

似たようなコンフィグの masterauth ですが、こちらはレプリケーションする際に問い合わせで利用する値です。 なので、レプリケーションしていなければ設定しなくてよかったはずです。

AWS ElastiCache

暗号化接続が必要になります。

f:id:donbulinux:20210818140607p:plain
作成画面のデフォルト設定

見事に何も設定できませんね。

こうする

f:id:donbulinux:20210818140739p:plain
いわゆる requirepass の設定ができる状態

作業手順としては以下になります。

  1. セキュリティの送信中の暗号化にチェックを入れる
  2. アクセスコントロールアクセスコントロールオプションを変更する
    • アクセスコントロールなし Redis AUTH デフォルトユーザー
  3. Redis 認証トークンに任意の値を入力する
    • この Redis 認証トークンが requirepass に相当します
    • スクリーンショットにもあるけど、 16文字以上で記号含む必要あるので結構面倒です

これでオッケーデース。

ローカル開発やCI/CDで、証明書が面倒of面倒で Docker なりパッケージ管理ツールで Redis は入れるけど……って場合がほとんどだと思います。

いざ本番に持ち込もうとすると「あれ?!」ってなる、というかマネージドサービスは最近そうなりがちなので、考慮できるようになるといいですね。

最近は上がってきた成果物が動かなくて、この手の調査ばっかりしているヨ。

暗号化時の redis-cli など動作確認について

どうすんの? という感じですよね。 --tls をつけることで、暗号化通信ができます。 Establish a secure TLS connection. と書いてあるので、接続できる最適な形式を選択してくれと思うんじゃが……。

あとは通常の問い合わせと同じく --askpass つけたり、接続できたら PINGPONG してやりゃいいと思います。

こうする

実際に動かすとこんな感じですね。

redis-cli -h ${HOSTNAME} -p 6379 --askpass --tls
password: ***********

${HOST}:6379 > PING
PONG 

Rails

Rails で redis(sidekiq) 使っている場合は、 console からなんらかのジョブ数問い合わせて数字が返ってくることを確認できればよさそうです (エラーにならなければ通信できているので)。

Sidekiq::Stats.processed
#=> 0

このあたりが参考に。

qiita.com

ちなみに

gem sidekiq 使っている場合、上記のように送信中の暗号化にチェックを入れていると redis-cli --tls したように、当然暗号化に対応した接続が必要です。 以下のように問い合わせ時のプロトコルrediss:// にすればアクセスできます、「レディスエス」って感じの発音でいいのかな、もしくは「レディスッス?」

実運用する時は development とそれ以外でプロトコルを切り替えるか、 ENV なりで FQDN 全体を管理させる、とするのが一番スマートなのかな。

- redis://${HOST}:6379/
+ rediss://${HOST}:6379/

MySQL の用語置き換え

8.0.26 のお知らせ見てたら出てたので。

どう変わった

とりあえずここだけ抑えておけば良さそう。

dev.mysql.com

Incompatible Change: From MySQL 8.0.26, new aliases or replacement names are provided for most remaining identifiers that contain the terms “master”, which is changed to “source”; “slave”, which is changed to “replica”; and “mts” (for “multithreaded slave”), which is changed to “mta” (for “multithreaded applier”). Help text is also changed where applicable to use the new names.

master source
slave replica

わ、わかりづれえ!

だいぶ直感的でない感じがする。

言葉狩りな気がするんだよなー。 と思ったけど、日本語話者だからそう思うだけで、英語話者だとやっぱり slave にかかる master という表現は「絶対許せねえ」のかな。 母国語じゃないとやはりニュアンスを解するのは難しい。

ちなみに blacklist/whitelist に対して、 blocklist/allowlist になったんでしたっけ? こっちはマージでセンスねえな、って感じです。 block/safe、 deny/allow だと思うんだけどという。 とはいえ決まったもんは仕方ねえ。

Word for mac のファンクションキーの動作

azra.hatenablog.jp

こうやって OS の動作にあわせる。 Fn7 とかでいらねえ機能が出てくるの本当いらない、しかもこれ一括でチェックボックスで変更できないの邪悪すぎる。

物件選び2021

そろそろ10年目になる、今の賃貸マンションに不満があり引っ越しを検討している。 インターネット無料物件ってやつで、使っても居ないインターネット使用料が毎月引かれてしまっているからだ。

togetter.com

けどこういうのを見ると一種の賭けだよなあ、と思ったりする。

今の物件

コンセントに光端子引き込まれていたけど、そちらは共用設備に直結しているらしく、結局通常の工事が発生した。

といっても物件自体に NTT の回線は来ていたので、

  1. 光端子のパネルを外して
  2. 導通管からケーブル引き込んで
  3. 室内に設置したモデムに光ケーブル圧着したヤツを刺す

という感じ。

新築で入居時に「共用回線で速度出ないと困るので、個別で NTT の光回線引き込んでいいですか」と大家に聞いてダメ、と言われていた。 しかし、ある日突然「いいよ」と言われ、契約しかけてた別の部屋から乗り換えた記憶がある。

これ退去する時工事必要かどうかわからねんだよな。 たぶん居るとは思うんだけども。

それ以外の不満

住んでいて不満がアップグレードされた感じ。

  1. 最寄りの鉄道駅まで徒歩 15 分 1.代わりに JR と私鉄系 2 社が乗り入れている
  2. 一番近いスーパーまで徒歩 15 分
  3. ここ数年、生鮮食品がめちゃくちゃ高く、最近上がった酒税分アルコールも値上がりしているが、下がった発泡酒系は高いまま
  4. もうちょっと歩くと OK ストアとか業務スーパーという選択肢が出てくる
  5. 入居時の条件に「子供不可」と書いてあったが、大家夫妻に子供が出来たからかいつのまにか解禁されていて大合唱
  6. 壁がレオパレスと同じくらい薄く、隣の部屋の生活音やテレビ音が聞こえる
  7. 毎日ウォッチパーティー状態
  8. ワイの本を買う速度に、部屋の面積が追いつけない
  9. 泣く泣く電子書籍に移行しはじめた

という感じで、特に最後の 2 つが主に引っ越したい理由を締めつつある。

引越し先

23区東側にもどるかなあ、という気持ちになっている。 北側は公共交通機関が貧弱すぎて、たしかに家賃安くて広い物件確保できるんだけど、代替の交通手段を考えるとあんまり安くないな? という印象。

寝室とリビングが別れているのが理想だけど、クッソ広いワンルームを区切って使うのでもいいんだよなー。

何にしろ、個人事業主なのでまず審査を突破できないのではという日本特有の地獄よ。 オタクのやどかりあたりに相談するのがいいのかな。

RDS の T3/T2 Unlimited

突然 RDS で動いてる MySQL のメンテナンスやることになったけど、インスタンスタイプが db.t2.micro だったのだ! という顔シリーズ。

RDS の T3/T2 Unlimited って存在するの?

存在します。 しかし EC2 とはだいぶ趣が違います。

Amazon RDS、Amazon AuroraのT系インスタンスにも、CPUクレジットがあります。

aws.amazon.com

インスタンスタイプによって、あらかじめ動作が決まっているようです。

マネジメントコンソールなどから ( EC2 のように) Unlimited <-> Standard の変更はできません (まず表示項目がない) 。

また、CPU クレジットによる (使い切った時の) 動作は EC2 と同じです。

  • T3 (db.t3.)
    • Unlimited mode
    • CPU クレジットを使い切ると課金タイムに自動突入
  • T2 (db.t2.)
    • Standard mode
    • CPU クレジットを使い切るとパフォーマンスが (1割とかでしたっけ?) 制限される

突然こんなことを、なぜ……?

調べても EC2 の Unlimited 動作についての記述ばかりで、 RDS の T2インスタンスに関する記述が見つからんかったからです。 T3 は RDS の料金ページ内 T3 の CPU クレジット に申し訳程度に書いてあったんですけどね。

Amazon RDS の T3 DB インスタンスは Unlimited モードで実行されるので、連続する 24 時間での平均 CPU 使用率がインスタンスのベースラインを超えた場合に追加料金が発生します。

aws.amazon.com

英語ヘルプ側に unlimited mode enabling (無制限モードの有効化について) という項目あったんですが、 EC2 にしか言及してないのでそういうことなのでしょう。

You can check whether your burstable performance instance is configured as unlimited or standard using the Amazon EC2 console or the AWS CLI. (ワイ訳:Amazon EC2 (マネジメント) コンソール、または AWS CLI を使って、バースト可能なパフォーマンスインスタンスが無制限または標準として設定されているかどうかを確認できます。)

docs.aws.amazon.com

結論

政治的都合でインスタンス動作の変更できないからめちゃめちゃ作業したくない……重いクエリたくさん動かすから確実に詰まってインスタンス障害になるよぉ。

sidekiq のロギング

capistrano-sidekiq でインストールされる systemd 制御ファイル入れた時のロギングについて、CentOS7 あたりだと対応できないので、その対応について。

何が問題なのか

このあたりで書いた問題ですね。

donbulinux.hatenablog.jp

syslog を利用する

append による追記処理が利用できないので、 syslog に流して logrotate で処理するよう設定します。

変更したら daemon-reload してから sudo systemctl restart sydekiq しておいてください。

systemd ファイルを修正

sidekiq:install タスクを利用していると、 /etc/systemd/system/sidekiq.service に標準ファイルが設置されるので、以下のように変更します。

-StandardOutput=append:/var/www/example/shared/log/sidekiq.log
-StandardError=append:/var/www/example/shared/log/sidekiq.error.log
+StandardOutput=syslog
+StandardError=syslog

# これは標準記述されているままにしておく
SyslogIdentifier=sidekiq

syslog を設定する

/var/log/messages 見てるとわかると思うのですが、ログ位置行ごとに識別子のようなものが付与されていると思います。 これが SyslogIdentifier で指定できるヤツです。

特定の識別子を持つログは、指定したファイルに書き出すように設定します。

ちなみに syslog と連呼していますが、 RHEL(CentOS) 7 以降は rsyslog という名前になっています。 /etc/rsyslog.d/ 以下に .conf ファイルを設置すると読み込むようになるので、そちらにファイル設置します。

設置後は rsyslog の再起動を行って設定ファイルを読み込ませておきます。

sudo vi /etc/rsyslog.d/sidekiq.conf
sudo mkdir -p /var/log/sidekiq/
# ec2-user 権限で動かしているのでログ出力先もそのようにしています、Rails アプリを動かすユーザに合わせて変更してください
sudo chown ec2-user:ec2-user /var/log/sidekiq/
sudo systemctl restart rsyslog

/etc/rsyslog.d/sidekiq.conf

if $programname == 'sidekiq' then /var/log/sidekiq/sidekiq.log
& stop

logrotate を設定する

このままだと /var/log/sidekiq/sidekiq.log が肥大化するので、ローテートするようにします。

以下の logrotate 用設定ファイルは、だいたいこのような感じです。

  • ec2-user ユーザの 0644 (-rw-rw-r--) でファイルを処理
  • 日毎にローテート
  • 30 世代保持
  • 圧縮する
  • sidekiq.log-20210711 のように日付を付与する
  • 空ファイルならローテートをスキップする
  • 圧縮する対象は 3 世代目から (当日と前日にあたる 2 世代までは生ファイルとなる)
  • ローテート時ファイルポインタを開放しない

logrotate はデーモンではなく cron で発火するので、ファイル設置したらそこで終わりです。

/etc/logrotate.d/sidekiq

/var/log/sidekiq/sidekiq.log {
  su ec2-user ec2-user
  daily
  rotate 30
  compress
  dateext
  missingok
  notifempty
  sharedscripts
  delaycompress
  create 0664 ec2-user ec2-user
  copytruncate
}

sidekiq のログ再オープンは USR2 シグナル、ではありません!

どこもかしこも USR2 シグナルを送信しろ、と書いてあったのですが、最初に公式ドキュメントを読んでいたので記述が違って「ああーん?」となったやつ。

qiita.com

こちらにわかりやすく書いてあるのですが、公式もおそらく「ログドライバってやつがあるんだからそっちを使え、俺はもう面倒を見ねえ」って事だと思います。

とはいえ金払う有償版? だと USR2 で従来どおりの動作らしいとのことなので、まあハイ、という気持ちになってしまう。

ジョブの流入カットして、おそらく処理が終わるであろうタイミングでプロセス止めてファイルローテートして新規再開、はたしかに理想的なのですが、今回自分が導入した環境は以下のような状態でした。

  • 短時間 (< 60s)で終了するキュー
    • メール送信など
  • 長時間 (> 60s) 必要なキュー

長時間のキューが入ってるタイミングだと事故る、かつ sidekiq はたしか実行途中のキューが存在すると、最後まで終了しない限りプロセス再起動で処理済みのキューも再実行する、とかだった気がします。

ソースどこだったか忘れたんですが、マー実際発生しそうだし発生するとクレームボンバーでヤバいな、という感じだったので「それならログ欠ける方がマシだろ、 Rails 側の production.log にも一応履歴出てるはずだし」という判断で copytruncate しています。

環境に応じて、としか言えないのですが、今の所 copytruncate で致命的にログがぶっ壊れたり取りこぼしした事ないので、おそらく大丈夫じゃないかなあ、と考えています。

参考

qiita.com