年中アイス

いろいろつらつら

RDSの証明書を更新したら、Lambda(node.js)から接続できなくなった

2020/02/05までに、RDS系の証明書を2015から2019に更新するようにアナウンスが出ています。*1

そんな中、RDSの証明書更新してから、Lambda(node.js)から接続できなくなったと相談を受けました。確実にクライアント側の証明書を更新してないからと思いましたが、探しても探してもどこにも証明書ファイルがありません。

最終的に、mysql2というライブラリに入っていました。意識せずに使えると、こういう時どこにあるか全然わからないですね。特に今回全然知らないLambda(node.js)だったのでなおのこと。*2

Lambda自体のコードは、sequelizeというライブラリを使っており、ssl: truessl: 'Amazon RDS'とあるのみでした。sequelizeのgithubで検索しても出てきません。しばらく唸ったのち、前述のmysql2を呼んでいたので、検索したら該当のコミットが出てきました。

ここにあるように、IAM認証を使っていて、あまり意識せずに暗号化通信になっていたようで、証明書の更新で影響が出ることに気づけていなかったようです。

2019証明書は2024年期限だそうなので、5年経つ前に同じような更新が必要そうです。このLambdaが5年後も生きていれば・・・。

参考

*1:使ってなければ3/5まででも可能とかあるので、正確な内容はアナウンス内容をご確認ください。

*2:slack POSTの記事はnode.jsですが当時はGoなかったので、手探りで書いてました。

Python3.8+ansible2.8.6は動かなかった

Python2系がほぼ年内*1で終わってしまうので、そろそろPythonのバージョンと、ansibleのバージョンを上げようと、pyenv+venvで別環境作って試してみてました。とりあえず最新にしてみようと、Python3.8とansible 2.8.6を入れて、playbook実行してみたら、以下のエラー。

ERROR! Unexpected Exception, this is probably a bug: cannot pickle '_io.TextIOWrapper' object
the full traceback was:
〜あとスタックトレース〜

これはバグの可能性があります・・・!?同じようなエラー出た人もいて、Python3.8で7日前(エントリ書いた時点)

調べると、Python3.8自体が今月10/14に出たばっかりだそうで、単に新しいPythonバージョンだから、ansibleがまだ対応してないだけっぽいです。一個バージョン下げてPython3.7.4にしたら動きました。

*1:2020/01/01までで、年内スパッとではなく、タイムゾーンの関係なのかな?

t3.smallとt3.mediumのCPU creditが同じだった

t3インスタンスのCPU creditを使い切ってしまうことがあり、そういやt2より良くなったようなと思って、再度調べてみたら驚きの仕様が!

docs.aws.amazon.com

リンクにあるように、t3.small, t3.mediumは、creditの回復量、保持量が同じだったのです。t2はサイズごとに倍倍だったんですが、t3は何故かこの仕様のようです。違うのはメモリサイズ。t3.small 2GB, t3.medium 4GBです。他も細かくは違うのかもしれませんが、目立つのはこれだけ。

一部のECS clusterは、t3.mediumにしていたんですが、これを受けて同インスタンス数のt3.smallに下げました。動かしているコンテナにGoが多く、CPUは割り当てるものの、メモリはそこまででもなく余り気味でした。CPU creditが一緒であれば、同じ金額出すならsmallでインスタンス増やすほうが、CPUリソースが多く使え、同じインスタンス数なら金額は半分です。

参考

iPhone 11 Pro 1週間とセットアップメモ

1週間ほど使ってみて

前回買ったエントリ書きましたが、その後1週間使っての雑感と移行セットアップを簡単にメモ。

物体として

やっぱりでかい、重い。大きさよりは重さの方がよりくる感じ。前に買ったandroidと大きさは変わらないけど、それぞれ持つと、iPhone 11 Proの方がかなりずっしりしてます。

FaceID

Face IDは、寝転ぶと結構ダメで、子供抱えてる時やコーヒー飲みながらで顔が隠れる状況は流石に反応が悪いです。反面Suica等のアプリ起動時の確認としては優秀。見るつもりで起動してるのでスムーズ。通知の詳細がFace ID通した時だけ見えるのは、他人に見られなくて済むケースもありいい反面、机に置いて通知の確認ができないのが面倒で、バランス難しいです。*1

バッテリー

新端末に変えて、バッテリーの持続時間は長くなりましたが、発表時にあった長時間持続ほど伸びた印象がありませんでした。急にOS13.1.1が公開され、バッテリー消耗が改善されたという案内で早速アップデートしました。

アップデート前は、充電してから、1日ぎり持たないかなというところでしたが、アップデート後は、早朝100%から夜まで使っても40%台と大幅に伸びました。本体が熱くなったりするなーとは思ってたので、何か無駄に動いていたんでしょう。

移行セットアップ

iPhone 11 Pro (以後 新端末)のボタンを押すと、アップルマークが出たあと、直接移行するか、iCloudのバックアップから移行するかを聞かれます。今回は、直接移行を選択しました。iPhone7(以後 旧端末)側に、移行しますか?というダイアログと共に、新端末に表示されるモヤモヤした画面をスキャンするように案内されます。スキャンすると、移行セットアップが始まります。

今回、写真やビデオなど含め100GBぐらったせいか、いきなり3時間という案内でした。23時ごろ始めたので夜更かし確定で面食らうことに。さらに、その間、新旧端末ともに使えないので、ほかに急ぎのことをやる時でなくてよかったです。あと充電できる状況も然り。ただ待つだけでした。

アプリの復帰

移行後、ほとんどのアプリはそのまま使えました。いくつか必要だったのが以下です。

  • LINE
  • Suica
  • Apple Payのクレジットカード
  • 銀行のアプリ

LINEは、他でも解説されている通り、旧端末側のアプリで、設定>アカウント引き継ぎを選んだ後、新端末側でパスワードを入力する本人確認の後、SMSの確認があります。また、新端末で使えるようになると、旧端末は即時使用不可になりました。トーク履歴のバックアップは特に行なっていませんでしたが、過去分表示される様子。ずっと昔は知らないけど。

Suicaは、旧端末のウォレットからカードを一旦削除するので、心理的に怖い面がありました。新端末のウォレットから追加>Suicaを選ぶと復元されます。*2クレジットカードは、ウォレットの追加からクレジットカードで自動で出てきて、セキュリティコードを入れたら復帰できるものと、再度クレジットカードのスキャンを行うものと、カードのよって異なるようでした。クレジットカードは旧端末から削除しなくても新端末に追加できました。

銀行のアプリは、登録してある電話番号に電話がかかってきて、アプリに表示される番号を電話で押す認証でした。その他、Suicaアプリなど、Touch ID対応してたアプリは、起動したらFace IDを許可するか聞かれて、置き換えられました。

操作面

移行セットアップ後に、SIM差し替えようと思ったんですが、いくら電源ボタンを長押ししても電源を切れない。電源の切り方がわからないので調べました*3。電源ボタンと音量の上を長押しでした。

連携

mi band3を使っていて、新端末で同期が失敗していペアリングがうまくいかなかったので、一度旧端末とのペアリングを解除後、新しい方で再追加して動きました。その代わり、1日分夜の睡眠データが飛んだので、移行方法としては間違ってるかも。

その他

古い方の端末は、アラーム切っておかないと、新旧同時になったり、家に置いている時に鳴るので、削除しました。通知が旧端末に飛ぶのはどうしたもんか。新端末で、通知のON/OFFを試しているところです。

後、移行完了したかなと思うんですが、旧端末いつリセットするかなというのは悩みどころです。

参考

*1:この辺りショートカットで特定Wifi化のみなど変更もできると聞いたので調べる予定

*2:今までSuicaのチャージはアプリからだけかと思ってたら、ウォレットからApple Payでチャージできた。別のクレカ使いたかったら、Suicaアプリみたい。Suicaアプリは再ログイン必要でした。

*3:同僚はSiriに聞いたそうで、とても正しい使い方ですね

iPhone 11 Pro購入

長らくiPhone7を使ってきましたが、バッテリーの持ちが悪くなってきたことと、超広角に惹かれてiPhone 11 Proを購入しました。発表直後はあんまりかなーと思っていたんですが、超広角が13mm相当と思ったより広角で、子供の写真撮るのに良さそうでした。写真撮ろうとすると寄ってくるので、今までだと撮れなかった位置でも全体が撮れそうです。また、バッテリーの持続時間も伸びたようなので、それも良い点です。

発表当初、買う気が無かったので、予約開始時点では予約していませんでした。発売当日ミッドナイトグリーンどんなだろうとストアに見に行こうとしたら、凄い行列で断念しました。その後注文しても配送は10月上旬〜半ばとなっていたので、注文はしなかったのですが、週明け同僚から「Web or ストアアプリから、店舗受け取りにしたらすぐいけましたよ」と聞いて、試したらすぐ受け取れる案内になったので、ApplePayでサクッと支払って*1、昼休みに店舗にてゲットしました。

機能的にはiPhone11でもよかったんですが、少し大きすぎるかなーということと、どうせなら望遠側のレンズも欲しいなということもあり、Proを選択しました。どこかのツイートで、超広角のレンズ買うよりは安いというのを見かけ、「確かに!」と思ったのもあります。

色はシルバー、ゴールドはタピオカなので除外。ケースはつける派で、カメラ部分が明るいと合わせづらそうなので暗色というのもあります。ミッドナイトグリーンは結局実物見られなかったので、スペースグレイにしました。

来年のiPhoneがフルモデルチェンジで、またTouchIDが復活するとか色々言われてますが、またよかったら買い換えればいいかなということと、Androidもいい機種増えてきたようなので期待。

以上、子供の相手で、買った日はセットアップできませんでしたが、やっと行いつつ、iPhone7からのデータ転送が3時間になっていて途方に暮れている深夜です。

*1:13万はApplePayで払った最高額でした

ローカルとAWS ECS上のマイクロサービスをSSH経由でつなぐmogura

マイクロサービス開発向けに、moguraというツールを開発しています。Twitterではちょいちょいリリースを呟いて、細かいバージョンアップを行っています。一旦落ち着いたので、moguraが何を解決するためのツールで、何をしてくれるのか紹介します。

背景と課題

マイクロサービス化を進めていて、複数のサービスがECS上で動作しています。それらをまとめて使うサービスを開発しようとした時に、全てローカル環境で構築するのは困難で、AWS上の開発環境に接続したくなります。RDSやelasticsearch service、他EC2で動かしているサービスは、Aレコード、CNAMEのドメインと特定のポートに対して、トンネルを作れば動いていたので、シェルでsshコマンドを実行するだけでも何とかなっていました。

例えば、以下のようにbastion.example.comサーバにSSH接続して、localhost:8080remote.example.com:80への通信をバインドするという形が取れます。

ssh bastion.example.com -L 8080:remote.example.com:80

しかし、ECSのサービスを起動すると各タスクは、クラスタ上のホストと自由なポート番号で動き、それがSRVレコードとして登録されます*1sshトンネルはAレコードやCNAMEは解決してくれますが、SRVレコードを解決してポート含めて対応をしてくれません。そのため、ECSにデプロイするたびに、自分でECSコンソールを見る or SRVレコードを引いて、結果をもとにsshトンネルコマンドを実行するという作業をする必要がありました。

課題一覧

  • ECSが作るSRVレコードが解決できない(これはSRVレコード自体が解析できないことと、VPC上でのみで解決可能なPrivateDNSの2つがあります)
  • デプロイのたびに変わる接続先を手動で解決する必要がある
  • それらに対するSSHトンネリングを作り直す必要がある(SSHコマンド再実行)

流石にそれは非効率すぎるので、少し前に書いた以下をベースにmoguraを実装しました。

reiki4040.hatenablog.com

修正やエラー制御等々を追加したので、その時からは実装がだいぶ変わっています。

moguraは何をしてくれるのか

moguraに以下を設定します。

  • 踏み台サーバ(bastion)へのSSHアクセス情報
  • 接続したいサービスのDNSとローカルで使うポート番号などを、必要なサービス分

まず、VPC環境にアクセスするための踏み台サーバ(bastion)へssh接続を行います。そこから、bastion上でDNSを解決し、繋ぎたいサービスの接続先とポートを取得してトンネルを作り、ローカルポートへの接続があったら、トンネルを通してデータを送受信しています。

moguraを使えば、設定に書いてある接続先がSRVレコードでも解決してくれるので、まず自分でSRVレコードを引く必要がありません。複数を設定に書いて一気に起動できるので、例えばマイクロサービスA,B,CとMySQLサーバ、elasticsearchサーバへの接続を一気に確立する(localポートにバインドする)といったことが可能です。また、定期的なDNSの再解決、接続が切れたら再接続をしてくれるので、スムーズにECS上の他のサービスやRDSなどとの接続を使うことができます。

細かい使い方についてはmoguraのREADMEをご覧ください。

今後の展望

とりあえず、面倒臭い部分の解決が実現でき、再接続などの使用中の細かい挙動については修正できました。ツールとしては、一定使える状態になっています。同僚などに使ってもらい、便利、楽といった感想をもらえているので満足です。

以下のような部分を実装すると面白そうだなと思いつつ、そんなにすぐ必要性を感じていないので、保留状態です。

  • SRVレコードの解決で、優先順位の判断やバランシングは行なっていないといった細かいもの
  • System Manager/Instance connectの機能で、IAMユーザでのSSH接続確立ができるようになったので、それを使ったbastionへの接続対応
  • fault injection? (通信断の意図的な発生)
  • ECSサービスを自動で検出する(今は設定に明示的に書く必要があるので、動的か、実行して設定ファイルを自動生成するか)
  • bastionサーバがEC2前提なので、それもFargateなどで動的に起動して使えるといった自動構成

System ManagerのSSHあたりは、mogura作って以降、(たまたま)急に拡充されだしました。

fault injectionは本当はenvoyなどのサイドカーで行うの良さそうですが、開発中のテスト用に簡易的なものはmoguraに入れといてもいいかなと思っています。 - envoy/examples/fault-injection at master · envoyproxy/envoy · GitHub

bastionサーバは、必要な時にFargateで起動して使えるとかだとEC2を管理する必要のなくなり、運用しやすそうなので、うまいこと作りたいです。

*1:ServiceDiscoveryを指定した場合

突然SIMが使えなくなったので再発行した(無事解決)

先日、急にSIMエラーというダイアログが表示された後、モバイル回線(4G LTE)が使えなくなりました。端末とSIMは以下の通り。

使えなくなるとiPhone左上のdocomoなどキャリア名が表示されているところが、不正なSIMですという表記に変わりました。

前兆として何回かSIMエラーというダイアログは出ていましたが、その時は問題なく使えていました。地下鉄だったので、電波の関係でエラーになったのかなと、深くは考えていませんでした。

使えなくなったのが土曜日で、外出から家に帰ってきていたので影響はありませんでしたが、外だとLINEなどで連絡が取れなかったり、Suica/ApplePay系のサービスが使えないかもで不便です。決済系は多用しているので、使えないのは厳しく、一番影響があるのが、会社行くのにそのまま電車に乗れない点。訂正:Suicaはオフラインでも使えました。

対処方法の調査

調べてみると、以下のものを試してみるように書かれていたので、全て試しましたがダメでした。

  • 機内モード切り替え
  • iPhoneの再起動
  • SIMの抜き差し
  • キャリアアップデート (特になかった)
  • iOSのアップデート(12.3.1 -> 12.4)

端末ロック(キャリアで買ってた場合、未払いや盗難等でのロックがあるらしい)に言及しているページもありましたが、SIMフリーで買ったので、この線はまずなし。加えて、手元に残っていたSIMフリーiPhone5sに刺してみても、同様に不正なSIMですと出るので、端末側の問題ではないことは確定しました。

再発行手続き

SIMがダメになってるようなので、再発行をOCNに問い合わせてみることに。マイページに行ってみるものの、紛失や再発行の申請は電話のみでした。

www.ntt.com

年末年始を除いて日曜もやってたので、翌日日曜に電話しました。サポート特有の混み合っています、という案内のしばらく後に繋がって、事情を説明すると、再発行してもらえることに。再発行からお届けまでは使えなくなる点だけご了承くださいとのことで*1、とても丁寧に対応してもらえました。あとは届くのを待つのみです。届いたら追記予定。

サポート電話終了後、自動音声のアンケート(解決しましたか?丁寧でしたか?とかのやつ)あったんですが、ゆっくりの自動音声なのはいいとして、声のトーンが夏のホラーな感じで、ややビビるので、OCNさんあれはちょっと変えたほうがいいんじゃないですかね。

可用性向上のために

もともと、電話回線と、iPhone用データ回線と、モバイルルータ回線を持ってるので、まず全部死ぬことはないんですが、iPhoneのSIMが使えないことで、Suicaが実質使えないのが厳しいことが判明しました。多分モバイルルータつないでたら使えると思いますが、そのタイミングだけ起動するとかめんどくさすぎる。訂正:Suicaはオフラインでも使えました。また、モバイルルータに刺さってるSIMは、MicroSIMでiPhoneのnanoSIMとはサイズが違い、直接刺せませんでした。

今回、データ通信nanoSIMをもう一つ買い増すかなと考えています。もともとandroidiPad用のSIM欲しいなーとは思ってたので、バックアップ物理SIMがてら、データシェア用のSIMを発行しようかと思います。

また、眠っていたPASMO(物理カード)を発掘し、残高をチャージした*2ので、SIMが届くまではこれで通勤しようかと思います。店舗支払いと異なり、公共交通乗る時のSuicaだけは、無いと不便すぎるので、物理カードを念のために持っておいても良さそうです。

追記 SIM到着し復旧完了

火曜日にはSIMが届き、装着するとdocomoの表記が出て無事に4G回線を使うことができました。日曜の昼過ぎにサポートに問い合わせたのを考えると、割と早く復旧することができました。

また、iPhoneSuicaはオフライン(機内モード)でも、使うことができましたので訂正。

参考

*1:使えてないので、再発行関係ないけれども

*2:駅じゃなくても、セブンATMでチャージできるの知らなかった