GCPにBitnamiでmemcachedサーバーを作る
Monday, January 07, 2019 11:26:00 AM
2019年最初の記事はmemcachedのサーバーを作ることからです。
なんで今さらサーバーを?
私は現在Toilet Evolutionというサービスを作っていて、まぁ特に流行ってもいないのですが、トイレ監視のIoTプラットフォームをやっています。 これはGAE(Google App Engine)で動いていて、PHP5.5で作られています。
GAEにはgVisorというコンテナ技術をベースにした第二世代( 2nd Gen
と呼ばれている )があるのですが、PHP7.2が使えるようになります。
しかしこれに伴い、これまで使えていたmemcachedサーバーが使えなくなります。
通常のGCPアプリと一緒となり、Cloud Memorystoreを使えということですね。
ただ、これには無料枠がなくて、(なんとか低額でやっていきたい層だけが)ぬーんとなるので、今回 GCP の無料インスタンス f1-micro
にmemcachedサーバー(SASL付き)を構築してみようという試みです(f1-micro
が無料で使えるのは米国リージョンだけです)。
Bitnami
Bitnamiとは、アプリケーションをインストールするのを支援するサービスで、クラウドにも対応しています。 memcachedサーバーをGCP上に構築するのも、GUIからポチポチと実行できます。 もちろん自力でやっても問題はないので、SASL memcached now available!みたいな記事を読んでやってもOKです。
Bitnamiの画面遷移とかざっくりした説明は書きません。 GCPにRedmine環境を作ってみたというBlogが、Bitnamiを使ってGCPにRedmine環境を作るという内容で、スクショもたくさんあってわかりやすいです。 まぁ使ってみてそんなにハマりどころはないので、読まなくてもだいたい大丈夫です(ただし英語アレルギーとかない人)。
プロジェクトを作る
GCPでプロジェクトを作って(もしくは既存のプロジェクトで)以下のAPIを有効化しておくと、Bitnamiからのデプロイが簡単に進みます。
あとは課金の設定。
memcachedサーバーを作る
米国リージョンを選択するのですが、App Engine と同じリージョンに配置したいので、 gcloud app regions list
で利用できるリージョンを確認しておきましょう(GAEからはインターネット越しになるので、それほど意味があるかはわかりませんが、気分的な問題ですw)。
memcachedを選択して、プロジェクトを選んでいくと us-xxxx
のリージョンで f1-micro
を選択したのに、料金が表示($4.28ぐらい)されるかもしれませんが、
f1-micro インスタンス使用量は、最初の 744 時間分が無料 なので、744時間 == 31日 ということで実質月額無料です。
Application Info
にユーザー名 user
とパスワードがあるので、PHPから接続する情報として記録しておきます。
Server Info
にアクセスするときのIPアドレスがあるので記録しておきます。また、SSHするときのキーがあるので、何かのときのためにダウンロードしておきます。
Cloud ConsoleのVMインスタンスに、memcachedサーバーができているのを確認しておきます。
App Engine からアクセスできるようにする
このままでは App Engine からアクセスできない(App Engine はインターネット経由でGCPのVMにアクセスするため)ので、ファイヤーウォールの設定を行います。
BitnamiのドキュメントConnect To Memcached From A Different Machineによると、ポート 11211
を解放するよう書いてあります。
BitnamiからインストールされるmemcachedはデフォルトでSASL認証がonになっているので、PaaSのようにIP制限できない環境からクラウド越しに利用するときは安心ですね。
もし、GCPでのファイヤーウォール設定のやり方がわからない場合は、上記ページの the FAQ
の遷移先 Open Or Close Server Portsが参考になります。
サンプルプログラム
GAE 2nd Gen で動くPHP7.2のサンプルプログラムを用意しました。
app.yaml
ファイルの環境変数を3つ設定します。
- MEMCACHEDSERVERADDR: memcached サーバーのIP
- MEMCACHED_USERNAME: ユーザー名。これはデフォルトで
user
になっているので、変更不要 - MEMCACHED_PASSWORD:
Application Info
で表示できるパスワード
以下のコマンドでプロジェクトにApp Engineを作ります。例えば us-west2
に memcached サーバーを構築したら以下のような感じです。
gcloud app create --region=us-west2
続いて、アプリケーションをデプロイします。
gcloud app deploy
実行してみる
GAEのエンドポイントに接続すると、以下のように表示され、memcached と接続し読み書きできていることがわかります。
Array
(
[xxx.xxx.xxx.xxx:11211] => Array
(
[pid] => 1786
[uptime] => 4689
[time] => 1546843636
[version] => 1.5.12
[libevent] => 2.0.17-stable
[pointer_size] => 64
[rusage_user] => 0.46
[rusage_system] => 0.188
[max_connections] => 1024
[curr_connections] => 2
[total_connections] => 5
[rejected_connections] => 0
[connection_structures] => 3
[reserved_fds] => 20
[cmd_get] => 2
[cmd_set] => 2
[cmd_flush] => 0
[cmd_touch] => 0
[get_hits] => 2
[get_misses] => 0
[get_expired] => 0
[get_flushed] => 0
[delete_misses] => 0
[delete_hits] => 0
[incr_misses] => 0
[incr_hits] => 0
[decr_misses] => 0
[decr_hits] => 0
[cas_misses] => 0
[cas_hits] => 0
[cas_badval] => 0
[touch_hits] => 0
[touch_misses] => 0
[auth_cmds] => 3
[auth_errors] => 0
[bytes_read] => 607
[bytes_written] => 6855
[limit_maxbytes] => 67108864
[accepting_conns] => 1
[listen_disabled_num] => 0
[time_in_listen_disabled_us] => 0
[threads] => 4
[conn_yields] => 0
[hash_power_level] => 16
[hash_bytes] => 524288
[hash_is_expanding] => 0
[slab_reassign_rescues] => 0
[slab_reassign_chunk_rescues] => 0
[slab_reassign_evictions_nomem] => 0
[slab_reassign_inline_reclaim] => 0
[slab_reassign_busy_items] => 0
[slab_reassign_busy_deletes] => 0
[slab_reassign_running] => 0
[slabs_moved] => 0
[lru_crawler_running] => 0
[lru_crawler_starts] => 3060
[lru_maintainer_juggles] => 4979
[malloc_fails] => 0
[log_worker_dropped] => 0
[log_worker_written] => 0
[log_watcher_skipped] => 0
[log_watcher_sent] => 0
[bytes] => 69
[curr_items] => 1
[total_items] => 2
[slab_global_page_pool] => 0
[expired_unfetched] => 0
[evicted_unfetched] => 0
[evicted_active] => 0
[evictions] => 0
[reclaimed] => 0
[crawler_reclaimed] => 0
[crawler_items_checked] => 0
[lrutail_reflocked] => 0
[moves_to_cold] => 2
[moves_to_warm] => 0
[moves_within_lru] => 0
[direct_reclaims] => 0
[lru_bumps_dropped] => 0
)
)
Hello World
数回アクセスしてみると、以下のようなスペックになります。
- 99 パーセンタイル: 90.24ms
- 95 パーセンタイル: 89.18ms
- 50 パーセンタイル: 77.25ms
さいごに
私のサービスは Cloud Datastore
のキャッシュとしてmemcacheを使っているので、キャッシュになければ、
永続化しているところから直接ロードするだけなので、堅牢さはそれほど必要ないです。
できれば Cloud Datastore
へのI/O回数を減らして低額でやりたいなぁという程度なので、f1-micro
に1つサーバーを起動する程度で良いという割り切りです。
あとはredislabsが30MBまでなら無料で使えるので、そういうのも選択肢としてあるかもしれないですね(実際にGAE Python3のドキュメントからはリンクされていたりする)。
もし同様にやってみたいなぁと思う方がいたら参考になれば幸いです。
2018年を締めくくる最後の投稿
Monday, December 31, 2018 02:36:00 PM
おわりのはじめ
今年は「発信」をテーマにした1年でした。ここ2年Blogの本数も1桁で、もっとやっていることを短くても良いから初心に返ってたくさん書こうと思ったのでした。 実際はもっと書けることもあったような気がしますが、この投稿も含め31投稿ということで今までで一番多い投稿ができた1年でした。 来年も継続していきたい。
イベント登壇と運営
2018年は、なんかずっとイベントに追われている気がしたので、まとめてみます。
- 主催: ESM社内勉強会(IoT Study) 23回 (基本的に第一/第三水曜日)
- 参加: ESM社内勉強会(Golang) 3回
- 主催: Polymer.co-edo meetup 11回 ( #10 から #19 までと、祭りを1回、月一 )
- 運営: 02/06(火) Polymer Japan Cafe #1
- 参加: 02/19(月) Mercari Web / Frontend meetup
- 参加: 02/28(水) 第123回 PHP勉強会@東京
- 参加: 03/06(火) templateinstantiationstudy
- 参加: 03/10(土) 「ベタープログラマ」 ☓ ソフトウェアエンジニアの心得
- 参加: 03/14(水) Voice UI Designer Meetup Tokyo
- 参加: 03/28(水) 第124回 PHP勉強会@東京
- 参加: 04/13(金) CDN Study (Akamai/Fastly)
- 運営: 04/17(火) 開発リーダのための「明日の開発カンファレンス 2018」
- 運営: 04/23(月) Web Components Cafe by Polymer Japan
- 発表: 05/19(土) 初夏のJavaScript祭 in サーキュレーションビル ForPro
- 参加: 05/29(火) Vivaldiジャパンツアー2018
- 参加: 05/30(水) 第126回 PHP勉強会@東京
- 参加: 06/01(金) CakePHP3.6のリリースを把握しよう!第10回CakePHP MeetUp
- 発表: 06-07(木) Co-Edoでエンジニア・Webデザイナー飲み会
- 参加: 06/13-06/14 Interop
- 参加: 06/14(木) やっぱり AppEngine ja night #3
- 参加: 07/08(日) HTML5 APP CONFERENCE 2018
- 発表: 07/14(土) PHPカンファレンス関西
- 参加: 07/25(水) 第128回 PHP勉強会@東京
- 出展: 08/04 - 08/05 Maker Faire Tokyo
- 参加: 08/21(火) CakePHPのカンファレンスが日本にやってくる!第11回CakePHP MeetUp
- 参加: 08/26(日) Learn Languages 2018 in ODC (LL2018)
- 運営: 09/01(土) GDG DevFest 2018 Tokyo
- 運営: 09/18(火) Polymer Japan Cafe #3
- 運営: 10/13(土) 開発リーダのための「明日の開発カンファレンス 2018 秋」
- 参加: 10/31(水) 第131回 PHP勉強会@東京
- 参加: 11/08(木) GMOリサーチ テックカンファレンス
- 発表: 11/17(土) 秋のJavaScript祭 in 富士通クラウドテクノロジーズ
- 運営: 11/25(日) HTML5 Conference 2018
- 発表: 11/26(月) Assistant Developer Conference vol.1
- 参加: 11/28(水) 第132回 PHP勉強会@東京
- 運営: 12/01 - 12/02 KDDI DIGITAL GATE HACKS
- 発表: 12/15(土) PHP Conference 2018
運営/主催/発表/出展などは、その準備だったりミーティングがあったりして、これよりも私のGoogleカレンダーは濃密にイベントスケジュールで埋まっています。 ここ数年これほどなかったなという記憶と、やりきった感は強いのですが、来年はPHP関連のカンファレンスが毎月のようにあるじゃないですかw
おわりのおわり
来年も同じようなペースでやっていきたいです。 何をするにも健康第一なので、運動してお酒はほどほどに?みなさまと楽しい1年にできればと思います。 どこかでお会いしましたら、よろしくお願いします!
PHPカンファレンス2018に参加してWebComponentsに関する発表をしました
Monday, December 31, 2018 01:52:00 PM
PHPカンファレンス2018に参加しました。
#phpcon2018 今日は13時から6Fで登壇します (@ 大田区産業プラザPiO in 大田区, 東京都 w/ @hamaco) https://t.co/Z1MmxtTtE8 pic.twitter.com/ZdfaN67VSw
— しずひこ (@sizuhiko) 15 December 2018
今年は、珍しく朝イチから到着して他のセッションをみたりしながら、1日を過ごすことができました。 資料作成やリハが順調に進んでいたので、良かった。
午前中はメルカリさんのスポンサーセッション、とはいえあの @DQNEO さんによるPHPUnitアップグレードセッションなので、通常セッションとして楽しめました。大企業におけるツラミみたいなのが満載のセッッションで、他の会社でそこまでブランチ戦略などが複雑に絡み合うことは少ないかもしれないけど、同じような悩みを抱えている人には心強いメッセージになっていたと思います。
午後一番は自分のセッションでした。
私はJavaScriptやHTML5jなどフロントエンドエンジニアが集まるコミュニティに参加したり、お手伝いをしたり、今回発表するきっかけのコミュニティでもあるPolymer Japanを運営していたりするので(実際の仕事もほとんどフロントエンドだし)、本当にSPAや重厚なJSフレームワークが必要なケースがどれぐらいあるのか?というのを見てきたつもりです。
まだ多くのWebサイトはそこまでを必要としていないので、jQueryやBootstrapを利用すれば十分であったりするケースもあります。 そういったときに「Web Componentsができること」というメッセージを伝えらるセッションになっていたら良いな、と思います。
そのあとは、またスポンサーセッションですが「PHPを選ぶ理由 / CTO 松本 宏太 / 株式会社SCOUTER」を。これも技術/人材というスコープから考える戦略という意味で多くの気づきが得られる内容だったと思っています。
そのままの部屋で「PHP-FIGのHTTP処理標準の設計はなぜPSR-7/15/17になったのか / 田中 ひさてる」を。 PSRはちょうど発表の直前にPHP FIGあたりの揉め事があって、なんかPSRとは?みたいな気分になっている人もいたと思いますが、セッションの内容はとてもすばらしくて。PHPはいろんな言語の良いところを取ってきたというのは事実として、よりPHPが向いている指向になっていったという良い話が聞けました。
最後は「Webサービスを育てるための組織作りと文化作り / 曽根 壮大 / 株式会社 オミカレ」を。 @soudai さんDBではない貴重な?発表でした。すごい良い話だったので、ぜひブログ記事を見て欲しいな。
あとはLT見て、懇親会、二次会……. 5ぐらいまであったとかw
解散時の言葉は、やっぱり蒲田に宿取ろう….昨年も聞いた気はしますが… とにかく楽しいPHPコミュニティのお祭りでした!
Polymer.coedo #20を開催しました
Monday, December 31, 2018 01:34:00 PM
今年11回目となる Polymer.co-edo ミートアップ を開催しました。
前回に引き続き「Edoエレメントの制作とWeb Componentsもくもく」です。
ちょうど lit-html が1.0 rcになるというニュースを直前に見ていたので、今後Edoエレメントを LitElement
で作る時の参考になるように、恒例のCodeLabsをLitElement版に書き換える作業をやりました。
はじめての LitElement エレメントの作り方 でLitElementをベースにしたWeb Componentsの入門が行えます。
ぜひ体験して、フィードバックをいただければと思います。
次回(==来年)
2019年の開催予定を公開しました。年明け1回目は1/21になります。皆様の参加をお待ちしております。
Polymer.coedo #19を開催しました
Sunday, December 09, 2018 06:54:00 PM
今年10回目となる Polymer.co-edo ミートアップ を開催しました。
前回に引き続き「Edoエレメントの制作とWeb Componentsもくもく」です。
もくもく会の参加者の方から質問が多かったので、そちらを対応していたため、Edoエレメントの制作はあまり進んでいません。
Polymer3でAtomを使ったときに良いフォーマットやハイライト、ということなのですが、これ私はBracketsでも困ってて、どうしようかなぁというところです。 PolymerチームはVS Code使っているし、vscode-pluginもあるので、楽な方に倒すのが良いのかなぁ。 まぁAtomにもatom-pluginはあるわけですが。
あとはwebmatというフォーマッタもあるので、これでフォーマットするとか。
このあたりはPolymerチームでもいろいろ考えていることがあるかもしれないので、Polymerの公式Slackで質問すると良いと思うよ!ということで終了しました(投げやりですみません…)
次回は
予定どおり開催できる見込みです。 Doorkeeperのコミュニティページに今年の予定も書いてあるので参考にしてください。
Recent Articles
- GAE gen1 で動いている PHP5.5 で作った個人開発サービスを gen2 PHP8.2 へ移行した1年記 〜 その 2 2024/03/20
- GAE gen1 で動いている PHP5.5 で作った個人開発サービスを gen2 PHP8.2 へ移行した1年記 〜 その 1 2024/03/20
- マルチプルレポをモノレポへコミットログを残しながら移行する 2023/09/27
- tsyringe を TypeScript 5 で使う方法 2023/05/02
- LocalStack を使って aws-sdk の Integration Test を実行する 2023/04/19
- AWS SDK v3 のモジュールと利用方法 2023/04/18
- ts-jest が esbuild/swc をトランスフォーマーに使って高速化していた 2023/04/13
- aws-sdk v3 を使うライブラリを作ったときは、なるべく peerDependencies に設定しよう 2023/04/11
- aws-sdk v2 が 2023 年中にメンテナンスモードになる 2023/04/06
- Node.js v18 / aws-sdk v3 の Lambda アプリが突然動かなくなる 2023/04/05