shibatch's journey

日々考えていることをつらつら書くだけです

AuroraでAZをまたぐ設計にしたらレイテンシが悪くなった話

最近AWSでRDS Aurora⇔EC2のいわゆるクライアントサーバシステムを構成したのですよ。マルチAZで可用性を担保し、EC2はAuroraのPrimaryへ接続する構成です。

f:id:shibatch:20210228232314p:plain

で、負荷試験を実施するとEC2のレイテンシがばらんばらんになるという不可思議な事象が発生しました。

具体的にはこんな感じ。だいぶ違う。単位はQuery per secです。

  • Aurora-1 ⇔ EC2-1 … 148qps
  • Aurora-1 ⇔ EC2-2 … 933qps
  • Aurora-1 ⇔ EC2-3 … 369qps

これなんでかなーと思ったら AZをまたいたのが原因のよう。 まぁAZは地理的に離れているので考えてみればありうるな、という感じではあるんですが、マルチAZ構成って普通に使う構成ではあると思うので、世の中的にはどうやって解決してるんだろな、と素朴には思ったのでした。

ちなみに自分の解決法はちょっと入り組んだ話になるので細かくは書きませんが、かんたんには更新処理と参照処理で別のELBを立てて、参照処理は同じAZにあるAuroraを使うようにしました。

f:id:shibatch:20210228233821p:plain

(この図では参照処理だけ抜き出しています)(微妙に上とイラストが違ってたりしてごめんなさい)

で、AuroraがないAZのEC2インスタンスは速度が出ないのでAZごと削除。そのかわり、同じAZにはEC2を2つ立てて冗長化をはかった構成に。

Auroraは安いサービスではないので、なるべくリソースの無駄使いにならないようにしたいですね。今回構築した構成はAuroraでt3インスタンスタイプを使っていて、通常時ではAuroraのCPUがバーストしないくらいのトラフィック量で、障害が発生してひとつのAZに集中したらもしかしたらバーストしてCPUクレジット使うかもな、くらいの設計にしています。 t3インスタンスなのでCPUクレジットを使い切ったら追加料金が発生するけれども、まぁ平常時はコストメリットあるよね、という塩梅です。

AZまたいでもレイテンシが落ちないようなベストプラクティスあったりするのかな。あるならぜひ知りたいところでした。まぁ構築はうまくいったのでよしとはしています。

カナダからiPhone12を個人輸入した話

iPhone12を購入することに至った経緯は以前書いたのだけれど (優柔不断な自分がiPhone12をぽちるまで ) 、無事に届いたのでどのくらい時間とお値段がかかったのかをまとめてみます。

f:id:shibatch:20210207110544j:plain
届いたiPhone

結論

ゴタクはいいから結果を教えろな人向け。

  • iPhone12(128GB) をカナダのアップルストアから個人輸入で購入してかかったお金は136679円 です。
    • 本体代と州税125547円 + 送料保険料4732円 + 消費税6400円。
    • 普通に日本のアップルストアで購入すると111980円です。差額は24699円。
  • オンラインのアップルストアで購入してから到着までかかった日数は 24日 です。

なぜカナダから輸入したか

iPhoneは世界中で同一のものを売っているのではなく、地域によって少しずつ仕様のパターンを変えています。そうすることで各国の電波周波数の事情に合わせたりしているみたいです。で、iPhone12に関しては日本とカナダ、あとグアムは同じ型番のiPhoneのようですのようです、というのはネット上の生地を鵜呑みにしているだけですが…)。

さて海外からiPhoneを輸入するメリットですが、カメラを使うときに「ぱしゃ!」という大きな音がしないことがあります。これ盗撮防止のためについているのですが付けてるの日本と韓国だけのようなんですよね。しかも別のアプリを使うと無音にでたりして、実質的に意味がない機能になっています。(ただ、アプリを使って撮影した写真は純正アプリより画質が悪く、痛し痒しといったところです)

けっこう外で「いいな」と思った建物や食事を撮ったりするのですがそのたびにぱしゃぱしゃチープな音が鳴って正直いやだ。これを回避するのが海外版のiPhoneなわけです。

そして型番が同じiPhoneを輸入することは、仕様が同じなのでFelica絶対に動作するという安心感のほかに、総務省の「技適マーク」が付いているというメリットもあります。

この技適マークは総務省が日本で使っていいよーというお墨付きのマークで、これが付いていない電波を発する機器を使うことは法律違反になってしまいます(海外旅行で一時的に使うなどであればOKらしい)。なので海外スマホを使うときは技適マークが付いているものを輸入する必要があるわけです。

というわけで、

  • 海外で使われているもの
  • 日本で使われる電波の周波数をサポートしている
  • 技適マークがある

iPhone12を使うのであればカナダ版iPhoneを輸入する必要があるのでした。

※グアムのiPhoneでも良さそうなのですがグアムのiPhoneを購入する方法はちょっと見当たらなかった

個人輸入の方法

はじめはeBayから購入できればラクだなーとか思っていたんですがあまり出回っていない。探し方が悪いのかもしれないのですが自分がみた限りだと見つからないのであきらめました。 となれば正攻法で手に入れるしかありません。カナダのアップルストア でぽちぽちしてさっと購入…しようとしたのですが、まずApple IDを認証してくれませんでした。 国ごとに違うID…ではないと思うので、おそらくカナダではない国のIDを弾くようになっているのかな、と思います。

Apple IDを使わずにゲストでも購入することは可能なのでやってみたら、今度は 住所がカナダでないと送ってくれない。 郵便番号を入れる欄で詰みます。なるほど、普通には買えないことがわかりました。

私はアメリカのAmazonで買い物する際に転送サービスを使った経験がありました。転送サービスとは現地に倉庫をもっていて、その住所を指定するとそこから日本へ転送してくれるサービスです。以前と同様に転送サービスを使おうと思ったのですがカナダの荷物を転送してくれるサービスってあまりないんですね。まぁアメリカに比べると幾分マニアックかもしれません。カナダは旅行したことはあるんですが魅力的なカナダ発のブランドもあったりするので(Rootsとか)もっとメジャーになってほしいなーという気持ちです。

さて転送サービスですが Buyandshipというものを使いました。

www.buyandship.co.jp

ここは料金が非常に安くて、3ポンド(1.36kg)までの配送料が2000円。破格。しかも世界11の国と地域に倉庫を持っている(そしてカナダもそのうちのひとつ)というすごいサービスです。 欠点は、まず香港に転送してから日本に転送するので時間がかかること。なんでこんな方式を取っているのかはちょっとよくわかりません…香港は関税がない、という話は聞いたことがあるのですがそれだけでそんなまどろっこしいことするのかな。誰か知っている人には教えてほしいものです。

実際に転送処理をしたときは、この2000円の配送料のほかに、オプションで紛失保険を付けました。1万円ほどの荷物だとつけなくてもいいかな、と思ったのですがなんせ12万円なので…購入金額の3%の額か、最大30USDなので自分の場合は30USDの額が保険料でした。

いざ購入

カナダのアップルストアで購入した場合、iPhone12(256GB)は1339カナダドルです(送料無料)。これに州税174.07カナダドルがついて合計1513.07カナダドルが購入代金になります。倉庫がトロント(オンタリオ州)にあるので、州税は13%かかるのですね。高いですね…本体代はそこまで差がないのですが、この州税が14000円ほど余計にかかってしまっている感じです。

購入から家につくまでの顛末

以下のような感じで手元に届きました。

  • 注文 1/3 20:25
  • Apple発送 1/4 08:19
  • UPS反映 1/5 午前中
  • カナダ倉庫到着 1/7 04:28
  • カナダ倉庫発送 1/13
  • 香港倉庫到着 1/19 12:19
  • 香港倉庫発送 1/20 15:17
  • 到着 1/26 13:00

実に24日もかかって手元にやってまいりました。ひとつ運が悪かったのは、Buyandshipのカナダ倉庫→香港倉庫への送付が週1回水曜日で、自分の荷物は木曜日にカナダ倉庫に着いたので1週間足止めを食ったことですね。これで時間のラグがありました。アメリカの倉庫だと毎日発送しているようです。

UPS(国際配送業者)の反映もいい加減で、「今日届くよ!」と書いておきながら「再スケジュールされました」となったりでなかなかヤキモキさせてくれます。国内ではヤマト運輸が配送してくれたんですがヤマトに渡したタイミングで追跡番号教えてほしいな…たぶんサポートに聞くと教えてくれるんでしょうけど自動で教えてほしいです(と要望をしました)。

家に届いた際に6400円の消費税を払いました。 これは日本国に収める消費税ですね。どうも10%ではないらしい。詳しくは知らない…なお、関税はかかりません。電子機器の輸入では免除されています。ありがとうありがとう。

というわけで到着しました!まっさきに「法律に基づく情報および認証」を確認したんですがばっちり総務省指定のマークが入ってます。

マナーモードにするとカメラの音がしないことも確認しました。これなかなか便利なので今後は海外から輸入するかも…


というわけで冒頭に書いたとおり、購入にかかったおカネは136679円で、普通に購入した場合より25000円ほど割高になりました。割高になった内訳は州税がいちばん多くて14000円ほど。あとは保険と配送料、国内消費税です。保険は任意なのでつけなければ3000円ほど安くなります。

自分としては良い経験になったし、音鳴らないのは話のネタになったり実際に街中で撮影するときに便利だったりするので納得しております。

この記事、誰かの役に立ったりするのかな。まぁ次回購入するときに自分がいちばん助かりそう。ということで長い記事ですがまとめてみたのでした。

体温計を買い替えた

会社では1日2回、体温計測をすることになっているのだけれど、最近持っている体温計の液晶が映らなくなってしまった。 多分電池切れなんだけれど電池を交換できる構造になっていないため、捨てるしか仕方がない。 一応予備として非接触式の体温計も以前購入したのだけれども、どうもあまり精度が良くなく、最近はあまり使っていない。 というわけで体温が測れないのは困るので新しいものを購入した。 f:id:shibatch:20210125222926j:plain

最近は体温計も少しは購入しやすくあなたのだけれど、やはり売り切れが多い感じはある。その中で、この体温計はジョーシン電機で見つけたのだけれど、かなり良いものであった。今回体温計を買う上でいちばん重要視したのは電池が交換できることなどだけれども、これはそういったこともできる。しかも、バックライトが付いていたり、防水だったりでいたせりつくせりである。ちょっと値段が張ったのだけれども、毎日使うものだし、別にお金を出す事は良いかなと思った。

よい買い物をした〜これからよろしく。


閑話休題で、最近腰痛が激しい。あまりきつい運動はしないほうがいいんだろうなと思っている。で朝は結構ひどくて座るのも結構難しい位だったのでこれはまずいと思いいいオフィスチェアを買うことにした。

巷で人気のオフィスチェア専門店ワーカホリックへ予約をした。しかし超人気のお店なので、来店予約が2月の中旬になってしまった。まぁこれも仕方がない。いい椅子を買うぞと決心したのであった。

【AWS】ALBのヘルスチェックでRESTfulなAPIの更新処理が動作するかを監視したい

f:id:shibatch:20210107232553p:plain

AWSでALB→EC2(複数)という構成のお話をします。

AWSのL7ロードバランサー、ALBでEC2やらにヘルスチェックする際、HTTPまたはHTTPSプロトコルのGETのリクエストメソッドを使いますね。例えば対象のEC2のポート80に対して30秒に1回ヘルスチェックして200 OKが返ってきたらOK〜という感じで。

Webサーバのヘルスチェックならそれで十分なのですが、RESTfulなインタフェースを持っているシステムなら、RESTful APIを叩いてヘルスチェックしたいって思うケースがあると思うのです。私はそんな場面に出くわしました。で、これをALBでやってみようとするとなかなか難しい。 何が難しいって、

  • リクエストヘッダを記載できないのでAPI Keyといった認証情報を乗せることができない
  • HTTPメソッドがGETのみで、PUTやPATCHができるかは確認できない
    • 当然更新用のdataといった情報は載せることができない

わけです。

私の場合はPowerDNSで更新のAPIをヘルスチェックで確認させたいな、と思っていて、何か良い方法ないかなぁと社内で相談したところ「EC2で動作するかんたんなWEBサーバを書いてヘルスチェックが来たらAPIでPOSTやPATCHするようにしたらどうか?」とアドバイスをいただき、なるほどそりゃ名案だ、ということでPythonで実装してみました。

↓こんな感じです。(healthcheck.py)

#!/usr/bin/env python3

from http.server import HTTPServer, BaseHTTPRequestHandler
import json
import urllib.request
import urllib.parse
import configparser

config_ini = configparser.ConfigParser()
config_ini.read('/etc/default/PdnsAPIHealth.ini', encoding='utf-8')

class APIHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    base_url = 'http://127.0.0.1:8081'
    path = 'api/v1/servers/localhost/zones/example.com'
    headers = { "X-API-Key": "" }
    headers["X-API-Key"] = config_ini['DEFAULT']['api_key']
    data = {
      'rrsets': [{
         'name': 'example.com.',
         'type': 'MX',
         'ttl': 3600,
         'changetype': 'REPLACE',
         'records': [{
            'content': '10 mail.example.com.',
         }],
      }],
    }
    url = urllib.parse.urljoin(base_url, path)
    req = urllib.request.Request(url, json.dumps(data).encode(), headers, method='PATCH')
    try:
        with urllib.request.urlopen(req) as res:
           if res.code == 204:
              statuscode = 200
           else:
              statuscode = res.code
    except urllib.error.HTTPError as err:
       statuscode = err.code
    except urllib.error.URLError as err:
       statuscode = 500

    self.send_response(statuscode)
    self.send_header('Content-type', 'text/plain; charset=utf-8')
    self.end_headers()
    self.wfile.write(str(statuscode).encode())

if __name__ == '__main__':
  server_address = ('0.0.0.0', int(config_ini['DEFAULT']['listen_port']))
  with HTTPServer(server_address, APIHandler) as server:
    server.serve_forever()

これは何をやっているのかと言うと、ポート8080にHTTPのアクセスがきたらRESTfulなAPIを自分自身のポート8081に投入してレスポンスコードが正常なら200 OKを、そうでないなら500やらエラーのレスポンスコードを返します。

あとは以下のようなサービス起動設定を/usr/lib/systemd/system/ に配置して(CentOSです)、

[Unit]
Description=PowerDNS API HealthCheck Daemon

[Service]
ExecStart=/bin/healthcheck.py
Restart=always
Type=simple
PIDFile=/var/run/healthcheck.pid

[Install]
WantedBy=multi-user.target

サービスを起動させる。

$ sudo systemctl daemon-reload
$ sudo systemctl start healthcheck

あと、ALBではターゲットグループに対して「ポート8081をターゲットにするけどヘルスチェックはポート8080を使うよ」という設定をしてあげます。

f:id:shibatch:20210108100624p:plain
ALB設定
これでALBのヘルスチェックで「RESTfulなAPIで更新処理が動作するか」を監視できるようになりました! こういうことやりたい人、けっこういるんじゃないかなぁ、と思ったけれどもあまり参考になる情報がないなぁ、と思ったので書いたのでした。

優柔不断な自分がiPhone12をぽちるまで

2021年ですね。今年もよろしくお願いします。

つい先ほどiPhone12をポチッとしました。256GBです。今使っているものはiPhoneX。まる3年になります。 自分はめっちゃくちゃ優柔不断なのでここまでめちゃくちゃいろんなことを考えに考えてポチったのでその記録を残しておきます。次に買い換えるときに前回はこんなこと考えてたんだなぁ、という印を残しておく。

買い換えたい理由

  • とにかく電池がもたなくなったこと。外出するときはかならずモバイルバッテリーのお世話になる状態で、それ自体はまぁケーブルつなぎながら使えば済むんだけど(面倒ではあるけど)、1月1日に自転車で墓参りへ行ったときに、片道1時間、iPhoneに地図を表示させながら走っていたら、目的地まで電池が持たなかった。これは体験としてはちょっと強烈で、猛烈に不便を感じたので買い替えたほうがよいなぁとなった。
  • 夜景撮影のナイトモードの良さ。iPhoneXと夜景の綺麗さがぜんぜん違う。
  • esimとのデュアルシムができること。楽天モバイル回線を一応持っているので、まとめられたら面白そうだなって思った(これはただの好奇心)。

買い換えるか迷った要素

  • なんにせよ買い換える理由が弱すぎる。電池がもたないなら7200円で交換してもらえる。夜景撮影って年に数回くらいだろう。デュアルシムに至っては別になくても困らない。
  • マスクしてると指紋認証がないのがつらい。画面埋め込み型で指紋認証つけてほしい。来年に付くなら待ちたいけど確証はなし…うーん

というわけでうーんうーんと悩んでいて頭が破裂しそうだったのので、もう少しシンプルに考えることにした。

減価償却という考え方をすると

  • 今のiPhoneXは購入して3年。そして調べてみたら140000円で一括購入している。いろいろ調べてみるとiOSってだいたい発売機種は4年サポートされているらしく、つまり1年当たり35000円で使っているに等しい。
  • メルカリやヤフオクでiPhoneXをみるとちょうど35000円くらいで取引されていて、どうも 今買い換えても1年後に買い替えてもあんまし変わらないのでは?となった。

というわけであたらしいiPhone購入決定!

どの機種を買うか

  • iPhone12 / iPhone12 mini / iPhone12 Proから選択する。Pro MAXは大きすぎて片手で持てないのでまず除外。
  • iPhone12 mini は小さくてまさに携帯するのに良い感じだけれどもテレワーク中でスマホも家で使うことが圧倒的に多いため、小さいものにする必然性はないなと思った。
  • iPhone12 /iPhone12 Proは 主に違うのは以下の点。
    • 距離を測るセンサーの有無。これによってARの精度が向上したり、夜のピントが合いやすくなるらしい。
      • ただProのセンサーをバリバリ駆使したARが普及するかはちょっと疑問符。
    • メモリの容量。iPhone12は4GB、iPhone12 Proは6GB
      • 今のiPhoneX(3GB)で困っていないのでメモリが増えてもあまり評価にはならない

総合的に判断してiPhone12 が良いなってなった。

ただ買い換える理由としては弱い…というかバッテリーが持たないだけで新機種、というのはなんだかなーって感じだったので、カナダ版iPhone12を個人輸入して購入することにしました! 海外版では日本みたいにシャッター音がしない仕様で、しかもiPhone12のカナダ版は日本版と型番が同じ!型番が同じということは技適が通っているので日本で不自由なく使えるということ。

転送サービス

すごい大きな買い物なのでちゃんと転送サービス経由して届くかドキドキ…カナダに倉庫を持っている転送サービスってあまりないので Buyandship 国際転送サービス で試してみた! ちゃんと届いたらまたまとめよう…(届きますように!!)

AWSでDNSをRoute53を使わずに構築する

このエントリは、GMOペパボエンジニア Advent Calendar 2020 – Adventar の7日目の記事です。6日目は、 Osamtimizer さんの ペパボのカンファレンス情報を表示するアプリをFlutterで作った - stone's throw でした。


はじめに

GMOペパボが提供しているネットショップ作成サービス「カラーミー」ではユーザーさんが自由に決めたドメインでECショップを開設できる機能があります。その機能を実現するためには設定するドメイン用のDNSサーバをシステム内に持っておく必要があるため、nyah と呼ばれる OpenStack を使ったプライベートクラウド上にDNSサーバを構築し、運用しています。

さてこの自社DNSサーバですが古いOpenStackバージョンの基盤にあり(nyahは複数のOpenstackバージョンの基盤で構成されています)、別の環境へ移設する必要が出てきました。そこでまずAWS Route53を筆頭としたパブリッククラウドへの移設も検討したのですが大量のドメイン(ゾーン)をRoute53で運用するのはコスト的な足かせがあります(Route53などのパブリッククラウドDNSはゾーン毎に課金される料金体系です)。そこで移設後も自社でDNSサーバを管理、運用することにしました。このようにプライベートクラウドを自社で運用しながらパブリッククラウドの採用も柔軟に検討できることはGMOペパボの強みです。

DNSサーバを設計する

移設するにあたり新しいOpenStack基盤のnyahを使用することも考えたのですが、結論としてはAWSへEC2 + RDS(MySQL)の構成にしました。nyahへの構築もできましたが、バックエンドのDBサーバはPaaS型であるRDSのほうが管理コストは少なくて済むだろう、という判断です。

構成はこちら。

f:id:shibatch:20201206232531p:plain
DNS構成図
DNSのシステムはPowerDNSを採用しました。複数AZにEC2を配置し、バックエンドをRDS(MySQL)で構成しています。特徴は内部の通信はDNSの名前解決とは別の経路で、AWS Direct Connectを利用し、専用ネットワーク接続を使用していることです。APIの通信は専用線を用いることでセキュリティリスクを低減しています。PowerDNSはRESTベースのAPIを持っているので、nyahにあるカラーミーのシステムからDNSレコード更新の処理を叩く方式にすることでシステム間の依存を低くしています。

また、インフラのオーケストレーションツールはTerraformで行っており、プロビジョニングはPuppetを利用し、すべてコード管理しています。

現時点ではまだ移設は完了まではしていません。動作は確認できているので、そう長くかからずこの方式が稼働するよう目指しているところです。

まとめ

GMOペパボではプライベートクラウドパブリッククラウドのマルチクラウド構成を推進しています。それはつまり、より低コストで、より可用性が高く、より安全にするにはどうすればよいか?という設計の自由度が高いことを意味します。今回で言えば、DNSサーバを

  • nyahに構築することもできた
  • Route53に構築する案もあった

中で、AWSへPowerDNSを用いた構成を選択しました。また、nyahとはDirectConnectで専用線を用いた通信を採用し、セキュリティリスクの低減に作用しています。安心と安全が安価に提供できればそれはユーザーさんの利益にもなりますし、何より構成を設計する上でもやりがいがありますね。

明日はtkpさんです!

なぜ僕らは働くのか 君が幸せになるために考えてほしい大切なこと を読んだ

学生の知人がこの本を立ち読みしてちょっとおもしろかった、ということを言っていたので見聞を広めるために読んでみた。もう社会人になってまぁまぁな年月が経つけれども だからこそわかることもあるかもしれないなぁ、と思ったのだった。

平易な表現でサクサク読めたのだけれど、まず感想として学生時代に読みたかったなぁ、という気持ちをもった。自分は大人が「夢をもて」「何になりたいの?」と言うことに疑問を持ち続けていたような子どもだったのだけれど(そのせいで小6のとき先生と大喧嘩したりした)、夢を持つことに焦るより見聞を広めることの重要性を説いていてやさしい本だなと思った。

意識して学生時代に習わないことを並べているように感じた。いちばんおっ、と思ったのは暮らしのために必要なおカネについて真正面から取り上げていたこと。親に聞いてもなかなか教えてくれないことだけれども大人になる上でとても大切なことで、働くことを身近に感じることができる内容になっている。

ただ肝心の「幸せに働くってどういうこと?」という章は働かないうちではピンときにくい内容かもなぁと感じた(少なくとも自分が学生時代に見てもあまり印象に残らなかったと思う)。「活躍する人のはたらき方」「仕事がうまくいく人はどのような人か」といったこと。「好奇心をもちなさい」「柔軟性をもちなさい」ということは意識してできることではなく周りの環境に依るところが大きいかなと。

最後の章になるにつれて未来について触れられていて、はたらき方を超えて人生を豊かにする方法、地球が持続可能な社会のつくりかたといった方面まで大きくなっていく。ここは大人でも意識することが難しい人も多い(自分も…)なので非常に読み応えがあった。

後書きには子どもだけでなく大人にも読んで欲しいと書いてあったけれども自分にとっても読み応えがあり面白い本だった。サクサク読めるわりに内容が濃い。良い本だった。