年中アイス

いろいろつらつら

ecscheduleにTaskDefinitionの存在チェックを追加した

最近はECS周りにecspressoを使うようになり、その流れで煩雑だったECS ScheduledTaskの管理もecscheduleを使い始めました。そして見事にオペミスをやらかしたので、冬休みの課題がてら防止策を実装してプルリク出してマージされました。

github.com

背景

先日Revisionを1個進めて適用していましたが、見事に別のTaskのRevisionを更新しており存在していないためTaskが実行されない状態に陥っていました。(NOT production環境)

意図せずこの状態に陥るとなかなか気づくことが難しいです。ECS上は何もエラーは表示されず、Taskのログを確認しようにも起動していないのでCloudWatchLogsなどには出てこない。唯一気付けるのがFailedInvocationsと言うCloudWatchMetricsなんですが、これ自体はイベントからの起動が失敗したかのメトリクスで、Scheduled Taskでパッと出てきません。さらにLambdaでもEventBridge経由していると同じメトリクスになるため、いまいち点が線にならない。

調べると出てこなくはないんですが、FailedInvocationsを知らないと引きにくいし、前述の通り頭の中ですぐつながらないのです。

sumito.jp

docs.aws.amazon.com

対策

原因はわかったんですが、頑張ってもミスる時はミスるのと、FailedInvocationsを監視しても時すでに遅し*1なので根本の設定時にチェックすることにしました。ecscheduleはGoで書かれているので読めるし手も出せるのでちょうどよかったです。

内容は指定してあるTaskDefinitionとRevisionをECS DescribeTaskDefinitionに投げるだけです。これで存在していれば詳細が返ってきて、無ければエラーが返されます。Revisionの指定がなければ最新扱いになるのでそのケースも問題なし。ばばっとコード見て作ってプルリク投げました。*2

ほぼないと思うんですが、存在しないTaskDefinition/Revisionを指定しておいて、定義ができたら動き出すみたいなトリッキーな使い方をしてたら破壊的変更になるので、Opt-out/Opt-inでオプションプランの必要性も聞いてみましたが、それは必要ないかなと言うことでそのままマージしてもらいました。リリースもされてました。

最近はなかなかOSS関係にプライベートで時間割けなかったりしてましたが、いい課題があってサクッとできてよかったです。

補足: AWSマネジメントコンソールの機能とAPI

AWSマネジメントコンソールでScheduledTaskを作ろうとすると、作成済みのTaskDefinitionとRevisionから選ぶようになっており、存在しないものが指定できないようになっています。この手のものはいくつかAPIを組み合わせて実現してあり、ecscheduleはCloudWatchEventのAPIを呼ぶだけなので、TaskDefinitionとRevisionの存在チェックは入っていませんでした。そのため、存在しないTaskDefinitionとRevisionが指定してある状態で作れていました。

AWSマネジメントコンソールが実は裏でやっていることは表からは隠れてしまっているので、ecscheduleに限らずTerraformなどでも似たようなことをやると不足したりすることがよく*3あります。何で作られているかが理解できると、他のサービスを経由して作る場合に追加でチェックが作られています。今回のだとScheduledTaskの起動設定のcron書式などは間違ったものを入れるとCloudWatchEvent APIで弾かれます。これはそもそもCloudWatchEvent自体で使う設定はそのAPIでチェックしているからです。でも、ECSのTaskDefinitionはCloudWatchEventの動作自体には影響がないので、そのAPIではチェックされません(と言うか使われ方次第なのでできません)

APIが先にあり、それを使って画面を作っているのがよくわかります。時々表からは聞いたことない名前のAPIがあったり、途中で名前の変更があったものなどの残骸が見て取れるのでこれはこれで面白いんですが、もうちょっとAWSマネージメントコンソールの裏で何やってるかわかると助かります。

*1:別軸の監視上はあるに越したことはないけど

*2:実はコードより英文プルリクの方が時間かかってたりするので、勉強しないとというか英文に触れないとなぁ。

*3:デフォルトで作成されるIAM Roleとかね!

古いSDカードに書き込めなくなった

結論を先に書くと、SDカードも寿命はくるし、そうなった時に書き込みはできなくするけど既存データの読み込みはできるようなセーフガードが動くようだということ。さらに同じメーカーのSDカードを2枚同時に購入していて、同じタイミングでダメになった可能性が高いので、冗長構成ならメーカーや製品自体を分けるか購入時期を年単位ぐらいでは変えておくのが重要です。

何が起きたか

先日、久しぶりに一眼レフを動かして写真を撮っていたら、実はSDカードに記録されていなかったという問題が発生しました。前回は6月に写真を撮っていて、それから4ヶ月ぶりに動かしました。画面上何も問題なく写真が撮れている風だったんですが、後からプレビューすると少し前の写真が出てくる。

この時点で写真を撮ってもプレビューに出てこないので記録されていない可能性が高いことがわかりました。SDカードはもう一枚あったので、それで試してみると今度は「このカードには記録できません」という明示的なエラー表示になり、同様に過去の写真のプレビューは表示される。念のためSDカードの物理書き込みLockを確認するもそれはかかっていませんでした。

可能性は2つ。

  • SDカードが2枚とも壊れた。
  • 一眼レフの書き込み機構が壊れた。

調査

Macでも同様に読み込めるが書き込めないことと、一眼レフでフォーマットをかけてもデータが残ったままの状態なので、Readonlyな状態になっている。少し調べると、microSDカードですが構造上そうなるという話が出てきたので、おそらく壊れそうな状態。

www.phileweb.com

書き込みエラーが頻発するようになった場合、microSDカードに内蔵されているフラッシュメモリコントローラが以降の書き込みを禁止するのです。こうなると、ファイルの追加はもちろん削除や変更、microSDカード全体の初期化(フォーマット)もできなくなります。

壊れると言っても、買ったの割と最近じゃなかったっけ?と思いamazonの購入履歴*1を確認すると、なんと8年前の2013年に同時に2枚*2。それはSDカードも耐用年数そこまで高くないだろうという感じで、SDカード自体の寿命の可能性が高くなりました。しかし、一眼レフ本体の故障によってSDカードを破壊している可能性も否定はできないので、サクッと届くamazonでまたSDカードを購入しました。

それを試すとあっさり写真は撮れたので、一眼レフ本体ではなくSDカードの寿命ということで確定しました。

まとめ

  • SDカードも寿命は来るので、多分3-5年単位では買い替えないしローテが必要。
  • 同じメーカーの同じ型番を複数買うなら冗長構成用に別のメーカーや購入時期を変えること。
  • SDカードは壊れたら読み書きできなくなるのではなく、読み込み専用になる*3。その際明示的にエラーになるか、しれっと書き込まれていないかは運

エンジニアとしては、冗長化に同じメーカー型番ロットのディスクでRAIDを組んで、同時に故障して死んでしまうというのと全く同じことを引いてしまったので、なかなか貴重な体験となりました。8年越しの爆弾。

ちなみにメーカーはTransendを使っていて、他は別に問題なかったので新しいSDカードは継続してTransendと冗長構成用にKIOXIAに分けました。ただ、一眼レフも8年前に買っているので、年数的には次はそっちが寿命を迎える可能性も。

*1:こういう時ほんと便利、購入履歴

*2:この時は冗長構成ではなく、単に写真を多く撮っている時期だったので容量不足回避のために2枚購入していました。

*3:全メーカーそうかは不明

OCNからahamoに切り替えた

ついにメインのiPhoneの回線をahamoに切り替えました。OCN mobile oneはiPhone 5Sに変えた時からで、2014年からおおよそ7年半の長きにわたり使っていました。なんで変えたのかというと、こっちの日記の通り電池が減りまくることと、昼休みと帰宅時間帯の回線状況があまり良くない状態が続いていたからです。前者の電池については、いつからか何もしてないはず(夜寝てる間とか)なのに減るのがものすごく不便でした。

移行先候補検討

管政権下でシンプルな廉価プランを各キャリアが出したので、もう少し出して安定した方がいいかなと思いMVNOは基本的に除外しました。楽天モバイルは持っているものの、まだメイン回線にするにはエリアが安心できない(そもそも自宅はエリア内なのにパートナー回線のまま)ので、外出時の子供youtube再生android機用。

ahamo

ahamoはとにかくシンプル。一番わかりやすいしdocomo直々の回線なので品質は最高水準。個人的にプラン発表時の先手の打ち方も割り切り方も好印象でした。

LINEMO

LINEMOは、Yahooモバイル側に力入れてそうな印象しかないのと、低価格3GBはギリ足りない可能性。そうするとahamoでいいじゃんとなりました。

povo, UQ

povoはちょうど2.0の発表がありましたが、あれはメイン回線だとめんどくさい上にわかりにくいので速攻パス。なんで毎月買う手間をかける必要があるのか。逆にもし利用可能期間が2倍あれば普通に契約してたと思います。また、メインじゃなくてiPadなどのサブ端末に入れて半年に一回ぐらいは旅行などの外出時に使い放題にするのには向いてると思うのでセルラーiPad買ったら選択肢になりそうです。

サブブランドはUQが余った容量繰り越しがあり、妻が使ってるので家族割りみたいなのでもいいかなと思いましたが、以下の理由でパスしました。

  • 割引額があまり大きくない
  • 片方だけしか割り引かれない
  • 家族の証明書出したりが必要

個人的な仕事柄、冗長構成を気にするのでメリットが少ないならau系を避けてahamo(docomo)で同時死を回避する意味でもパスすることに。

SMS SIMはMNPできない

iPhoneで知らない人からの電話を受けたくないのでOCNはSMSのみのSIMにしていましたが、SMSのみSIMの番号はMNPはできないんですね。OCNにはQAなかったですが、他社MVNOでそいういう記載があったので、仕組み上できないものなんだと思います。*1

faq.support.biglobe.ne.jp

そんなに使ってはいなかったんですが、SMS認証で一部使ってるものがあったので、それは事前にメインの電話番号(ガラケー)に切り替えました。

ahamo申し込みから開通

今回eSIMにしようかなとも思いましたが、ahamoのeSIMは2021/09に始まったばかりのせいか、機種変更時の入れ替えにお金や手間がどのぐらいかかるのかの案内がありませんでした。申し込みから開通までは数時間と早くなるものの、機種を変えた時に変に制約かかるのが嫌なので、物理SIMで行くことにしました。

申し込み

申し込みページから確認できる通りで以下が必要になります。

  • dアカウント
  • 本人確認書類(eKYC用)
  • メールアドレス
  • クレジットカード(3Dセキュア)または銀行口座
  • カメラ付き端末(eKYC用)

ahamo.com

子供の要望でDisney+に入っていた関係でdアカウントは持っていたので、それを使って申し込みました。*2初回日付変わるぐらいにやってたんですが、eKYCとクレカの3Dセキュア通して一番最後に各種同意事項を読んで同意して申し込んだら「クレジットカード情報が不正です」と言われて最初からやり直せメッセージ。3Dセキュア通してるのにそうなるならなんかバグってんだろと思いながら、状態がはっきりわからないので2,3日放置したのち再挑戦したら今度はうまく行きました。

到着と開通手続き

申し込み時に届ける日時を指定でき2日後に到着。一応日割り請求されるそうですが、9/30は流石に半端すぎるだろうということもあって、翌10/1に開通(料金発生)させました。*3

開通手続き自体は以下ページにある通りでした。

ahamo.com

一つだけ「dアカウントでログイン」ではなく「受付番号でログイン」から行うことが必要で、これ初見絶対間違う上にahamo上ではログインできてしまってahamoの内容が何も表示されない(開通手続きできない)ので作りが悪いです。

SIMカードを入れ替えて再起動後もなぜかdocomo回線を自動で掴まなかったんですが、設定>一般>デバイス管理>OCNのプロファイルを消したら繋がるようになりました。この辺りもしデュアルSIMだと問題起きそうです。

変えてみて

とりあえず一晩ですが、電池の異常消費は改善された様子。まだ出勤してないので昼休みと帰宅時間帯は未検証です。OCNは月内に解約手続きを踏む予定。月内解約の締め日があると思うのでそれに注意しないとかな。20GB/月と個人的には大容量が使えるようになったので、利用スタイルもやや富豪的に変えてみたりしようかと思います。

*1:はっきりOCNに問い合わせたわけではないです。MNP特典とかもあるので気になる人は問い合わせを。

*2:これ人によってはすごい罠なのが、docomo携帯の契約がないdアカウントはahamo申し込み時にDisney+などのサービスが自動解約され、自分で再契約が必要になるという案内がありました。私は子供が見なくなり解約していたので影響ありませんでした。

*3:到着から15日以内はユーザ自身の開通手続き後から料金発生、15日を超えると自動開通の扱いでした。