tag:crieit.net,2005:https://crieit.net/tags/GoogleComputeEngine/feed 「GoogleComputeEngine」の記事 - Crieit Crieitでタグ「GoogleComputeEngine」に投稿された最近の記事 2020-06-01T16:18:36+09:00 https://crieit.net/tags/GoogleComputeEngine/feed tag:crieit.net,2005:PublicArticle/15813 2020-04-06T07:53:02+09:00 2020-06-01T16:18:36+09:00 https://crieit.net/posts/GCE-Cloud-Run GCEからCloud Runに引っ越してみた <p>当サービスCrieitをGoogle Compute EngineからCloud Runに引っ越ししてみました(2020/4)。選定理由、実際にやったこと、懸念点などを色々書いてみます。</p> <p>費用についても書きたいのですが、まだ引っ越ししたばかりのためわかりません。1,2ヶ月ほど経ったら追記しますので気になる方はフォローやブックマークなどしておいてください。</p> <p>※当記事は一部有料です。後半の実際にRunを使う方しか興味がなさそうな内容あたりは有料となっています。使ってみた感じやRunに関係ない引っ越しメモ等は無料です。費用については無料部分に書きます。</p> <h2 id="元々の構成"><a href="#%E5%85%83%E3%80%85%E3%81%AE%E6%A7%8B%E6%88%90">元々の構成</a></h2> <p>Compute Engineの1台構成です。f1-microインスタンスを利用しておりMySQLもこの中にインストールしているのでAlways FreeのおかげでWebサーバー、DBサーバー自体は無料運用です。ファイルなどはStorageです。</p> <p>ちなみにLaravelで作られており、詳しい構成は下記に書かれています。<br /> <a href="https://crieit.net/posts/Crieit-5b8e526e13820">Crieitの構成</a></p> <h2 id="新しい構成"><a href="#%E6%96%B0%E3%81%97%E3%81%84%E6%A7%8B%E6%88%90">新しい構成</a></h2> <p>WebサーバーにCloud Run、DBサーバーはCloud SQL(db-f1-micro)にしました。Cloud SQLは無料枠がないため費用がかかりますが、とりあえず広告費用内でまかなえるので以前からそのうち使おうと思っていました。全部1台のサーバーに入れているのはやはりなんとなく怖かったため。</p> <h2 id="なぜ引っ越したのか"><a href="#%E3%81%AA%E3%81%9C%E5%BC%95%E3%81%A3%E8%B6%8A%E3%81%97%E3%81%9F%E3%81%AE%E3%81%8B">なぜ引っ越したのか</a></h2> <h3 id="たまに落ちる"><a href="#%E3%81%9F%E3%81%BE%E3%81%AB%E8%90%BD%E3%81%A1%E3%82%8B">たまに落ちる</a></h3> <p>Compute Engineは普通のサーバーですので、やはり何らかの状況によって時々落ちるというかフリーズします。多分なにかボットのアクセスが激しい時にスワップしてしまってそのままになってしまうのだと思いますが。</p> <p>とは言っても約2年くらい運営してきてそんな感じで止まることはめったにありませんでした。たまに数分だけ重いとMackerelから通知が来たりはしていましたが。ただ、最近1日に2回も大きなフリーズがあったので、さすがに怖くなったのが引っ越すことになった一番のきっかけかもしれません。</p> <h3 id="むちゃくちゃ遅い"><a href="#%E3%82%80%E3%81%A1%E3%82%83%E3%81%8F%E3%81%A1%E3%82%83%E9%81%85%E3%81%84">むちゃくちゃ遅い</a></h3> <p>リリースする時に深く考えず、us-eastに構築してしまいました。これのせいでもうとにかくすごく遅い。あらゆるページで表示されるまでに1秒位かかっていました。こちらも元々そのうちwestに引っ越したいなと思っていました。</p> <h2 id="なぜCloud Runを選択したのか"><a href="#%E3%81%AA%E3%81%9CCloud+Run%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%9F%E3%81%AE%E3%81%8B">なぜCloud Runを選択したのか</a></h2> <h3 id="サーバーを管理したくなかった"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E7%AE%A1%E7%90%86%E3%81%97%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F">サーバーを管理したくなかった</a></h3> <p>最初から決めていたわけではなく、App EngineとCloud Runを試して決めよう、という感じでやっていました。どちらもマネージドで、自分でサーバーを管理する必要がありません。とにかくCloud SQLに費用を払うことになってでもサーバーを管理したくなくなったというのが一番の理由です。</p> <p>結局Runの方を選んだのですが、理由としてはApp Engineはデプロイするために、結構ローカル開発環境を本番向けに変えたりスイッチしたりする必要があります。もちろんデプロイを自動化すればいい話ですが、そもそもその前に一旦試してみるのが面倒になってやめました。最初にCloud Runの実験をしていたのですが、そちらはDockerイメージ内で適当にファイルを調整すればいいのでローカル環境を汚さず簡単に試せて非常に良いと感じました。</p> <h3 id="デプロイが簡単"><a href="#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%8C%E7%B0%A1%E5%8D%98">デプロイが簡単</a></h3> <p>ローカルでコマンドをいくつか実行するだけでデプロイできます。バッチとしてまとめているので1コマンドで行けるようになりました。</p> <pre><code class="bat">@echo off FOR /F %%i in ('git rev-parse HEAD') do set HASH=%%i set IMAGE=gcr.io/プロジェクトID/イメージ名:%HASH% @echo on call gcloud builds submit --tag %IMAGE% --project プロジェクトID call gcloud run deploy Runのサービス名 --image %IMAGE% --project プロジェクトID --region asia-northeast1 --platform managed --quiet </code></pre> <p>今回はやっていませんがCIによる自動化もコマンドベースなので簡単そうです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/szk3/items/38a3dba7fdfed189f4c9">GitHub Actionsを使うとCloud Runへのデリバリが最高に捗るぞ🚀 - Qiita</a></p> <h3 id="東京リージョンが使える"><a href="#%E6%9D%B1%E4%BA%AC%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%8C%E4%BD%BF%E3%81%88%E3%82%8B">東京リージョンが使える</a></h3> <p>App EngineもCloud Runも東京リージョンが使えます。GCEのようにアメリカだけ無料、とかではないので安心です。ただまあネットワーク料がかかってくると思いますのでそちらは気になりますが。</p> <p>実験したところ元々1秒くらいかかっていたページの表示が300~500ミリ秒くらいになっていました。すごく速いというわけではなさそうですが、とりあえず元々遅すぎたのでだいぶいい感じにはなりました。</p> <h3 id="安い?"><a href="#%E5%AE%89%E3%81%84%EF%BC%9F">安い?</a></h3> <p>Cloud Run自体はこんな感じで実際に使ったリソースの分しか消費されないので無料枠内で結構いけてしまうのかな…? と感じました。これはでも実際どうかわからないため、1、2ヶ月ほどしたら追記します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e8a66b399cb9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e8a66b399cb9.png?mw=700" alt="" /></a></p> <p>追記)ネットワーク料金が14円で、CPU、メモリは費用内で無料でした。やはりデプロイ時に設定するメモリ料での計算でなく、実際に使った量だけみたいです。</p> <h3 id="ロールバックも簡単"><a href="#%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%82%82%E7%B0%A1%E5%8D%98">ロールバックも簡単</a></h3> <p>これは実際に使ってみて気づきましたが、デプロイのリビジョンが残っているため何か不具合などがあってロールバックしたくなったときも簡単に戻すことができます。このあたりはGAE等ほかの簡単デプロイ系サービスでも同じかもしれませんが。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e8b1d1ce2b55.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e8b1d1ce2b55.png?mw=700" alt="" /></a></p> <h2 id="実際にやったこと"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">実際にやったこと</a></h2> <h3 id="ストレージの引っ越し"><a href="#%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%81%AE%E5%BC%95%E3%81%A3%E8%B6%8A%E3%81%97">ストレージの引っ越し</a></h3> <p>まずはアップロードされた画像が入っているストレージだけ先に引っ越しました。というのも、Crieitの場合アップロード画像は直接ストレージのURLを使うわけではなく、Now経由でCDNキャッシュさせて費用を節約させています(<a href="https://crieit.net/posts/Now-Cloud-Storage">NowのエッジキャッシュでCloud Storage節約サーバー作成</a>)。ということで、引っ越しても画像のURLが変わるわけではありませんし、独立して先に引っ越しできるため先に移動しました。</p> <p>具体的には下記の方法です。転送機能が用意されています。S3やAzureからも可能のようです。Cloud Storage間であればコマンドでも可能です。僕の場合は1GBもなかったので一瞬で終わりました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/storage/docs/moving-buckets?hl=ja">バケットの移動と名前変更</a></p> <p>通信料金も変わると思いますが、引っ越すまでの期間であればたいして影響も無いでしょう。とりあえずこれで一つやることが完全に減らせました。</p> <h3 id="ファイル保存している部分の調整"><a href="#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E9%83%A8%E5%88%86%E3%81%AE%E8%AA%BF%E6%95%B4">ファイル保存している部分の調整</a></h3> <p>セッションやキャッシュはデフォルトでファイル保存になっています。しかしCloud Runは必要に応じてインスタンスが立ち上がったりするためファイルだと正常にセッションの維持などができません。そのためデータベース保存に変更しました。具体的にはまず下記でマイグレーションファイルを生成して実行します。</p> <pre><code>php artisan session:table php artisan cache:table </code></pre> <p>そしてあとは環境変数をdatabaseに変えます。</p> <pre><code class="ini">CACHE_DRIVER=database SESSION_DRIVER=database </code></pre> <p>まあここは他にもRedisを使ったり自由で良いと思います。</p> <p>あとはログの出力も変更しておきます。これもファイルだとログを見ることもできないため、stderrにしておきます。こうすると自動的にCloud Runのコンソール上でログを見ることができます(その他にもいくつか方法はあります)。</p> <pre><code class="ini">LOG_CHANNEL=stderr </code></pre> <h3 id="DBの設定"><a href="#DB%E3%81%AE%E8%A8%AD%E5%AE%9A">DBの設定</a></h3> <p>今回はCloud SQLを使っています。接続にはCloud SQL Proxyを使っています。例えばLaravelの場合、下記のようにソケットを指定します。</p> <pre><code class="ini">DB_SOCKET=/cloudsql/インスタンス接続名 </code></pre> <p>インスタンス名はCloud SQLの詳細画面で確認できます。</p> <h3 id="DBの移行"><a href="#DB%E3%81%AE%E7%A7%BB%E8%A1%8C">DBの移行</a></h3> <p>DBの移行は、元々使っているGoole Compute EngineにMySQLをインストールしていたので、mysqldumpを利用しました。サーバー上のデータをmysqldumpでダンプし、そしてcloud_sql_proxyを実行するとCloud SQLにソケットでアクセスできるようになりますので、それでインポートしました。具体的なインポート方法は下記のようになります。</p> <pre><code>mysql -u ユーザー名 -p -S /cloudsql/インスタンス接続名 < dump.sql </code></pre> <p>参考)<br /> <a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/sql/docs/mysql/connect-compute-engine?hl=ja#gce-connect-proxy">Cloud SQL Proxy を使用した接続</a><br /> <a href="https://crieit.net/posts/GCE-cloud-sql-proxy">GCEでcloud_sql_proxyが実行できない時</a></p> <h3 id="メンテナンスモード"><a href="#%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%83%A2%E3%83%BC%E3%83%89">メンテナンスモード</a></h3> <p>ストレージもDBも、ユーザー操作中に移行を行うと一部データが失われてしまう可能性があります。そのためメンテナンスモードにしておく必要があります。</p> <p>Laravelの場合、メンテナンスモードのコマンドが元々あるようなのでそちらを利用しました。メンテナンスモードに入るときは <code>php artisan down</code> 復帰するときは <code>php artisan up</code> です。</p> <p>downの場合はメッセージや許可IPなども指定できます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://laravel.com/docs/7.x/configuration#maintenance-mode">Maintenance Mode - Configuration - Laravel - The PHP Framework For Web Artisans</a></p> <p>引っ越しの場合は新しいサーバーにアクセスが行くようになったらもう古いサーバーは使われませんので、upする必要もないかもしれません。</p> <p>結局ネックとなるのはDBの同期です。Cloud Runの設定も含め、これ以外で事前にできることはなるべく済ましておきました。</p> <h3 id="プロキシ用の設定"><a href="#%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E7%94%A8%E3%81%AE%E8%A8%AD%E5%AE%9A">プロキシ用の設定</a></h3> <p>元々Nginxを使っていた場合などは関係ない場合もありますが、プロキシ経由でなく直接アプリケーションにアクセスさせていた場合、このあたりの設定をする必要があります。例えばLaravelではTrustProxiesというミドルウェアのproxiesを許可するように設定しておく必要があります。</p> <pre><code> protected $proxies = '*'; </code></pre> <p>その他うまく動かない場合はSSLやホスト名の設定も問題ないか見てみる必要があります。Nginxのパターンとはちょっと違う可能性もありそうです。</p> <h3 id="バッチ等はどうしたか"><a href="#%E3%83%90%E3%83%83%E3%83%81%E7%AD%89%E3%81%AF%E3%81%A9%E3%81%86%E3%81%97%E3%81%9F%E3%81%8B">バッチ等はどうしたか</a></h3> <p>Cloud RunはSSHアクセスできませんので、コマンドの実行や定期処理などは考える必要があります。一応公式としてはCloud Schedulerを使うということになっています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/run/docs/triggering/using-scheduler?hl=ja">Running services on a schedule</a></p> <p>ただし、httpアクセスになるためちょっとコードを調整したりする必要もあり面倒です。そのため、今回はGCEからの移転ということもあり、定期処理や時々コマンドを実行したいときはもうそのGCE上で行うようにすることにしました。アプリケーションのDB接続もCloud SQLに行うようにしてあります。リージョンも違うので遅いとは思いますがどれも一瞬実行するだけなので問題は恐らく無いでしょう。Cloud SQLへの接続はcloud_sql_proxyをSystemdでサービス化して行っています(参考 <a target="_blank" rel="nofollow noopener" href="https://sys-guard.com/post-15640/">GCP Cloud SQLにCloud SQL Proxyで接続しよう。Systemd化してデーモン化! | システムガーディアン株式会社</a>)。</p> <p>以下は有料です。下記のような内容を書いています。</p> <ul> <li>実際に作ったDockerfileの例(Laravel & Apache)</li> <li>vendorフォルダが無視されることへの対処</li> <li>.envファイルが無視されることへの対処</li> <li>ポートの指定について</li> <li>Dockerイメージのビルド方法(Cloud Buildの利用)</li> <li>Cloud Runのサービスを作成する具体的な手順とエラーにならないようにするための注意点</li> <li>独自ドメインの利用方法</li> <li>ステージング環境の作成例</li> <li>Cloudflareで525 SSL handshake failedエラーが出た場合</li> </ul> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15809 2020-04-04T09:25:04+09:00 2020-04-04T09:25:04+09:00 https://crieit.net/posts/GCE-cloud-sql-proxy GCEでcloud_sql_proxyが実行できない時 <p>Google Compute EngineからCloud SQLに接続する方法は2つある。一つはプライベートIPで直接繋ぐ方法と、Cloud SQL Proxyを使う方法。リージョンが違ったりする場合はProxyを使う必要がある。</p> <p>ここで実際にダンロードしてきたcloud_sql_proxyを実行するのだが、なんだかPermissionが足りないとか色々エラーが出て実行できない時がある。サービスアカウントの権限を見てみても、元々GCE用のサービスアカウントはガッツリ権限が付与されているので関係なさそう。</p> <p>で、何だったかというと、サービスアカウントの権限以外にも、Compute Engine自体にCloud API アクセス スコープというものがあり、それのSQLが有効になっていなかった。具体的にはCompute Engineのインスタンス詳細ページを一番下までスクロールすると書かれている。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e87d360e75eb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e87d360e75eb.png?mw=700" alt="" /></a></p> <p>これのSQLを有効にすれば実行できるようになる。ただし有効にするためにはサーバーを一度停止させる必要があるので注意。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15751 2020-03-08T22:46:20+09:00 2020-03-08T22:46:20+09:00 https://crieit.net/posts/GCE-Micro-Instance-with-burstable-CPU-running GCEのMicro Instance with burstable CPU runningに注意 <p>GCPのGoogle Compute EngineにはAlways Freeによる無料枠があるため、f1-microというインスタンスタイプであればサーバー自体は無料で運用することができる。</p> <p>ただし、あくまでもCloud Platformなので、実際にはサーバーを動作させるためのあれこれで費用がかかったりする。例えばネットワーク料金や、IPの料金など。もちろんこのあたりも無料枠があるので基本的にはだいたい無料で運用できる。かかるとしても数円程度。</p> <h2 id="料金が発生するパターン"><a href="#%E6%96%99%E9%87%91%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3">料金が発生するパターン</a></h2> <p>しかし、色々試しているうちに費用が発生してしまうパターンが見つかった。料金表を見ていると「Micro Instance with burstable CPU running in Americas」ということで1,730円分も料金が発生していることに気づいた(無料クレジット期間のためまだ無料だが)。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e64f3f59a178.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e64f3f59a178.png?mw=700" alt="" /></a></p> <p>これは何かというと、公式のマニュアルにも書かれているCPUバーストという機能。</p> <p><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/compute/docs/machine-types#cpu-バースト">CPU バースト</a></p> <p>CPUが足りなくなった時に、自動的にCPUを一時的に追加してくれるというもの。追加料金は通常は無いのだが、f1-microのようなマシンタイプの場合はこのように追加料金になるらしい。</p> <p>僕が前々から使っているこのCrieitなどで使っているf1-microサーバーではこの料金がかかったことはない。ただ、どうも使い方によってはこれが激しく使われる事があり、このように追加料金が発生してしまうっぽい。</p> <p>具体的にはこの記事のパターンで発生した。</p> <p><a href="https://crieit.net/posts/GCE-DB-GAE">GCEをDBサーバーにしてGAEでサービスを無料運用する</a></p> <p>単にDBサーバーとして利用していた、というだけなので、通常であればさほど料金が発生することはない。ただ、もしかしたら上記の構成だとちょこちょこ何かしらのアクセスや接続が発生してしまい、負荷につながってしまうのかもしれない。詳しいことは全くわからない。何にしろ、f1-microの無料枠は時間で決まっているので、このバーストにより時間が無料枠分を超えてしまう。</p> <h2 id="対処方法"><a href="#%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95">対処方法</a></h2> <p>GCPを利用し始めて1年間は無料クレジットが付いているため、基本的に問題になることは無いだろう。ちょこちょこ料金明細を見ておいて、おかしかったらその利用方法では費用が発生してしまう可能性があるため、構成を見直せばいい。それでどうしても費用とパフォーマンスがあわないようであればその間に他のサーバーを検討すればいい。</p> <p>すでに無料クレジットの期間が終わってしまっている場合は注意が必要。無料だと思っていてこの料金がかかってしまうとちょっとびっくりする。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15667 2020-01-07T23:15:57+09:00 2020-12-25T17:23:36+09:00 https://crieit.net/posts/GCE-DB-GAE GCEをDBサーバーにしてGAEでサービスを無料運用する(を構築したけど費用がかかった) <p>GCPでリリースしたサービスが1年経ち無料クレジットの期限をむかえそうになりました。Cloud SQLを使ってデプロイしたためその後は有料になってしまうのですが、誰も使っていないサービスのためなんとか無料で運用できる方法は無いかと考えました。ちなみに下記のような構成です。</p> <ul> <li>Node.js</li> <li>MySQL5.7</li> </ul> <p>しかしサービスの性質上ちょっとデータベースのデータも多めで、HerokuのMySQLだと無料プランでは無理なのかな…という気がしました。そうするとMySQLを使えて無料で運用できるサービスが他にはありません。</p> <p>そこでふと、アプリケーション・サーバーはGoogle App Engine、データベースサーバーをGoogle Compute Engineで運用してみたらどうだろう、と思い立ちやってみました。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e14888763bb5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e14888763bb5.png?mw=700" alt="" /></a></p> <h2 id="後日談の追記"><a href="#%E5%BE%8C%E6%97%A5%E8%AB%87%E3%81%AE%E8%BF%BD%E8%A8%98">後日談の追記</a></h2> <p>こういうのが出るみたいなので無料は無理なのかもしれません。Micro instance with burstable CPU running。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e440681eb425.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e440681eb425.png?mw=700" alt="" /></a></p> <p>普通にサーバーとして使ってる時は出ないのでGAEかネットワークから必要以上に接続が来てしまうのかもしれませんね…。(もしくは最近新しく作ったGCEだと出るようになったとかだったり?)</p> <p>追記)<br /> GCEにWeb+DB全部入れにしたら費用がかからなくなったのでやはりこの構成だと費用がかかるみたいです。</p> <h2 id="GAEからGCEにローカル接続する"><a href="#GAE%E3%81%8B%E3%82%89GCE%E3%81%AB%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B">GAEからGCEにローカル接続する</a></h2> <p>結局のところ、今回の話ではこれが一番重要です。そもそもApp EngineからCompute Engineにローカル接続できるのか、と。</p> <p>これは実はこの記事を書いている2020/1時点では日本語マニュアルではまだβ版という表記が残っている、リリースされたばかりの「サーバーレスVPCアクセス」という機能を使うことによって可能です。</p> <p><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/appengine/docs/standard/nodejs/connecting-vpc">Connecting to a VPC network  |  App Engine standard environment for Node.js docs |  Google Cloud</a></p> <p>Compute EngineはVPCネットワーク内に位置しているのですが、App Engineはこれとは別のネットワークに存在しています。そのため、このサーバーレスVPCアクセスという機能を使うことで、下記にも書かれていますがApp Engineのスタンダード環境やCloud FunctionsからCompute EngineやCloud SQLに内部IPでアクセスできるようになります。</p> <p><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/vpc/docs/configure-serverless-vpc-access?hl=ja">Serverless VPC Access の構成  |  VPC |  Google Cloud</a></p> <p>日本語だとデプロイ時にbetaをつけろと書かれていますが恐らく今は不要だと思います。</p> <h3 id="サーバーレスVPCアクセスの設定"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9VPC%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A">サーバーレスVPCアクセスの設定</a></h3> <p>サーバーレスVPCアクセスのページを開くとコネクタを作成というリンクがあるのでクリックします。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e148b1948283.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e148b1948283.png?mw=700" alt="" /></a></p> <p>作成画面に必要な項目を入力して作成します。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e148b657d6f0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e148b657d6f0.png?mw=700" alt="" /></a></p> <p>注意が必要な点としてまだリリースされたばかりのためリージョンが少ないです。最初にApp Engineを登録してしまうと、同じリージョンがない…! みたいなことになるので気をつけましょう。us-central1であればGAEのus-centralと合います。</p> <p>IP範囲は補足に書かれている感じで大丈夫です。要するに、既存のVPCネットワークのIPとかぶっていないIP範囲であれば大丈夫です。</p> <h3 id="App Engineの設定"><a href="#App+Engine%E3%81%AE%E8%A8%AD%E5%AE%9A">App Engineの設定</a></h3> <p>App Engineのリージョンは先程作成したコネクタのリージョンに合わせて作成しましょう。多分作ってしまった後は変更できないのではないかと思います……。ただ、ちょっとApp Engineを作り直せない関係で色々試すことができたわけではないので、リージョンが違ったらダメかどうかは詳しく検証できていません。</p> <p>あとはapp.yamlに、このコネクタに接続するための設定を追記します。</p> <pre><code class="yaml">vpc_access_connector: name: "projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME" </code></pre> <p>REGIONとCONNECTOR_NAMEはコネクタのものです。これでデプロイすれば接続され、Compute Engineの内部IPと接続することができるようになります。</p> <h3 id="Compute Engineの設定"><a href="#Compute+Engine%E3%81%AE%E8%A8%AD%E5%AE%9A">Compute Engineの設定</a></h3> <p>デフォルトだとCompute Engineの内部IPはエフェメラルになっているため、時々勝手に変わってしまいます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e148d61aba91.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e148d61aba91.png?mw=700" alt="" /></a></p> <p>静的内部IPアドレスを予約して固定にしておきましょう。外部IPは不要です。固定外部IPを使っていた場合は、ただそれを外すだけだと使われない外部IPになってしまい、費用が発生してしまいますのでIPを解放しておきましょう。</p> <p>あとはMySQLをインストールして設定しましょう。どこからもアクセスできないのでMySQLユーザーは <code>ユーザー名@'%'</code> とかでいいのではないかと思います(違ったら教えていただけると助かります)。</p> <p>問題なければこれで接続できます(のはず……)</p> <h2 id="諸々設定"><a href="#%E8%AB%B8%E3%80%85%E8%A8%AD%E5%AE%9A">諸々設定</a></h2> <p>とはいえGAEは無料枠があるというだけでそれ以降は有料となってしまいます。こにさんのブログを参考にしてなるべくオーバーしないようにすると良いでしょう。</p> <p><a target="_blank" rel="nofollow noopener" href="https://koni.hateblo.jp/entry/2016/01/06/130613">Google App Engineを無料で運用する方法(2018年版) - koni blog</a></p> <p>スタンダード環境にてAutoScalingのF1というプランです。スケールしないプランもありますがそちらは無料枠が少なく毎月有料になってしまいます。</p> <p>どちらにしろすごくアクセスのあるサイトだと有料になってしまうと思いますので今回のようにもう誰も使っていないサービスを残しておくとか、作ったばかりのサービスで試す場合とかにこの構成だと良いのではないかと思います。</p> <p>あとCloud SQLのように便利な機能はないので適宜バックアップを取っておきましょう。</p> <p><a href="https://crieit.net/posts/Google-Cloud-Storage-DB">Google Cloud Storage無料DBバックアップ</a></p> <p>また、DBサーバーはメモリが不足してしょっちゅう止まる可能性もありますので、swapの設定もしておいた方が良いでしょう。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15662 2020-01-03T22:24:35+09:00 2020-01-03T22:24:35+09:00 https://crieit.net/posts/2020-GCE-IP 2020年からはGCEの外部IPが有料となりますが無料枠もあります <p>GCPのクラウドサーバーであるGoogle Compute EngineはAlways Freeという無料枠によりf1-microは無料で利用ができます(細かい条件はあります)。しかし2019年から囁かれはじめたとおり、2020年からは外部IPが有料となりました。</p> <p>新年あけましておめでとうございますしてから、僕にも請求アラートが飛んでくるようになりました。見てみるとたしかに外部IPの費用分が追加されていました。(External IPの箇所)</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e0f3ed8db3f6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e0f3ed8db3f6.png?mw=700" alt="" /></a></p> <p>ただし無料枠の割引もあるようです。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e0f3f4100fee.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e0f3f4100fee.png?mw=700" alt="" /></a></p> <p>詳しくは下記に書かれていました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://cloud.google.com/free/docs/gcp-free-tier?hl=ja#always-free-usage-limits">Google Cloud の無料枠  |  Google Cloud Platform の無料枠 |  Google Cloud</a></p> <blockquote> <p>注: Google Cloud では、2020 年 1 月 1 日から VM インスタンスの外部 IP アドレスの使用に料金がかかります。 ただし、Google Cloud の無料枠では当月内の合計時間数と同等の時間数を使い切るまで、使用中の外部 IP アドレスを無料でご利用いただけます。使用中の外部 IP アドレスの Google Cloud 無料枠は、f1-micro インスタンスだけでなく、すべてのインスタンス タイプに適用されます。</p> </blockquote> <p>無料枠はf1-microだけだと思うのでちょっとよく意味はわからないのですが、とりあえずf1-microであればずっと無料で行けるのではないかと思います。(実際に1ヶ月丸々試せてはいないので今後も引き続き見ていきますが)</p> <p>とはいえ課金+割引という方式のようですので、無料枠無視の請求アラートにしていた場合は、設定によってはアラートが飛んでくるようになっています。煩わしいようであれば請求アラートの設定を調整しておいた方が良さそうです。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15601 2019-12-12T22:32:10+09:00 2019-12-12T22:32:10+09:00 https://crieit.net/posts/Google-API GoogleからAPIキーが公開されているよとアラートが来た <p>Googleから怪しげなメールが届いた。本文を見てみると「Google Cloud Platform または API プロジェクト(プロジェクト名)の認証情報が不正使用された可能性があります」とのこと。</p> <p><a href="https://crieit.now.sh/upload_images/9b96c3d4b9b876ae035fecd6b003731b5df237526b2ec.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9b96c3d4b9b876ae035fecd6b003731b5df237526b2ec.png?mw=700" alt="" /></a></p> <p>ドキッとした。クラウド破産…!?</p> <h2 id="調査"><a href="#%E8%AA%BF%E6%9F%BB">調査</a></h2> <p>メール内の最初の方に、ここで一般公開されている、というURLが書かれていた。そこにアクセスしてみる。GitHubだった。するとたしかに僕のサイトっぽい名前のファイルがある。中身はバイナリファイルだったが、どうもここにAPIキーが含まれているらしい。</p> <h3 id="料金の確認"><a href="#%E6%96%99%E9%87%91%E3%81%AE%E7%A2%BA%E8%AA%8D">料金の確認</a></h3> <p>ちなみにプロジェクトはこのCrieitのプロジェクト。メールに色々と確認手順が書かれていたが、とりあえず読まずに料金がどうなっているだろうかを急いで確認してみた。今月の料金は……10円。とりあえず問題はなさそうでホッとした。が、そうこうしている間に何かしら利用されて今後料金が加算されていってしまう可能性がある。</p> <h3 id="何のAPIキーかを確認"><a href="#%E4%BD%95%E3%81%AEAPI%E3%82%AD%E3%83%BC%E3%81%8B%E3%82%92%E7%A2%BA%E8%AA%8D">何のAPIキーかを確認</a></h3> <p>細かくメールを見たかったがメール内にAPIキーが書かれていたので、ひとまずGCPのダッシュボードでそれが一体何のAPIキーなのかを調べてみることにした。</p> <p>確認方法はGCPコンソールの「APIとサービス」→「認証情報」。ここでAPIキーの一覧を見ることができる。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5df237a24bc53.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5df237a24bc53.png?mw=700" alt="" /></a></p> <p>問題となったのはこの画像の右下端に表示されている <code>Browser key (auto created by Google Service)</code> というもの。なんとなく見覚えがある。だいたいFirebaseのプロジェクトに関連付けた時に勝手に作られているものがこんな感じだったような気がした。Browser keyということなのでそれっぽい。</p> <h3 id="どこで使っているかを確認"><a href="#%E3%81%A9%E3%81%93%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8B%E3%82%92%E7%A2%BA%E8%AA%8D">どこで使っているかを確認</a></h3> <p>とにかくどこで使っているかを確認してみることに。本番サーバーにログインし、.envを開いて検索してみた。しかし見つからない。</p> <p>ということでローカル上でプロジェクトをVSCode開いて検索してみる。すると見つかった。やはりFirebaseのAPIキーだった。これは公開しないとどうしようもないのと、ちょっとした機能で使っているだけのため環境分けをするのも面倒だったので直接コミットしてある。ということでそれを見つけた。</p> <h2 id="そもそもFirebaseのAPIキーとは"><a href="#%E3%81%9D%E3%82%82%E3%81%9D%E3%82%82Firebase%E3%81%AEAPI%E3%82%AD%E3%83%BC%E3%81%A8%E3%81%AF">そもそもFirebaseのAPIキーとは</a></h2> <p>Firebaseのプロジェクトを作ったことがある方であればよく見るものだと思うが、こういった設定。これのapiKeyというところが今回問題となったAPIキー。</p> <p><a href="https://crieit.now.sh/upload_images/9b96c3d4b9b876ae035fecd6b003731b5df23cb242b37.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9b96c3d4b9b876ae035fecd6b003731b5df23cb242b37.png?mw=700" alt="" /></a></p> <p>僕が普段良く作っているWebアプリケーションの場合、この設定はブラウザで動作するもののため、そもそも公開しなければならない。そのため後悔自体は問題がないはず。</p> <h3 id="何が問題か"><a href="#%E4%BD%95%E3%81%8C%E5%95%8F%E9%A1%8C%E3%81%8B">何が問題か</a></h3> <p>何が問題かというと、適切なセキュリティ設定が行われていない状態だと問題となる可能性がある。無料のSparkプランや月額制のFlameプランであればさほど問題にはならない。あるとしてもリソースを利用しつくされてサービスが止まるだけ。</p> <p>問題となるのは従量制のBlazeプラン。今回のCrieitのアプリケーションはこれだった。この場合、従量制なのでいたずらで無限ループなどをされると恐らくとんでもない料金になってしまう可能性がある。とはいえ僕の場合Realtime Databaseと匿名認証を有効化していただけなのでさほど問題にはなりにくかったかもしれない。Firestoreを利用している場合は危険な可能性がある。</p> <h3 id="セキュリティの設定"><a href="#%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E8%A8%AD%E5%AE%9A">セキュリティの設定</a></h3> <p>恐らく、SNS認証+Firestoreのセキュリティルール設定済み、であれば問題にはならないだろう。問題になりそうなのは、匿名認証+Firestoreという場合。SNS認証は認証可能なURLを設定できるため、その設定さえしておけば不正利用は難しい。しかし匿名認証はURL指定ができないため、APIキーを利用すれば誰でもアプリケーションを動かすことが出来てしまう。このパターンだとまずそう。ちなみに今回はこのパターン。</p> <p>ではこの場合どうすればいいのか。メールにも書かれていた。</p> <blockquote> <p>API キーに API キー制限を追加します(該当する場合)。</p> </blockquote> <p>そう、先程スクショで説明した認証情報のページで、該当のAPIキーをクリックすると認証情報の設定ができる。ここでAPIキーの利用制限の設定ができる。GCPで直接自分で作ったキーの場合はできることを知っていたのだが、なんとなくFirebaseが勝手に作ったものは同じものという認識がなかったので気づかなかった。</p> <p>とりあえず、リファラーの設定をしておいた。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5df2405e67e64.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5df2405e67e64.png?mw=700" alt="" /></a></p> <p>何か間違っていたら機能が止まってしまうかもしれないが、今回は大したことのない機能のために使っているので気にせず設定した。これで一覧ページに元々出ていたアラートアイコンも消えた。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>そもそもこの設定はFirebaseの方で出来た方がいいんじゃないか…と常々思っていた。わりとこのあたりの事を知らない方もいるのでは。</p> <p>とにかくクラウドの利用は気をつけよう。そういえば料金アラートは設定していたので何にしろ何かあってもすぐ気づけたかもしれない。</p> <p>細かく試して書いたわけではないため、もしこの記事で間違えている情報などあれば情報提供いただけるとありがたいです。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15553 2019-11-17T14:30:30+09:00 2019-11-17T14:30:30+09:00 https://crieit.net/posts/GCE GCEでインスタンスを作るときにやることリスト <p>今更ながらGoogle Compute Engine(GCE)を使ってみたいなと思い、<br /> インスタンス作るときにやった手順をまとめてみた。</p> <p>ほぼ、以下の2つの記事を見てやった手順をまとめただけの備忘録。<br /> ・ <a target="_blank" rel="nofollow noopener" href="https://qiita.com/ndxbn/items/7ef0a96e409a5b5837bd#ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F">GCE の無料枠のサーバを立るときに、初見でハマりそうなところ - Qiita</a><br /> ・ <a target="_blank" rel="nofollow noopener" href="https://qiita.com/riku-shiru/items/a870edd9dc0b132e092c#80443%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E8%A7%A3%E6%94%BE%E3%81%99%E3%82%8B">GCPで永久無料枠を利用してサービスを立ち上げたときにしたことの備忘録 - Qiita</a></p> <h3 id="1. インスタンス作成"><a href="#1.+%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E4%BD%9C%E6%88%90">1. インスタンス作成</a></h3> <p>imageはUbuntu 18.04(Minimal)を選択</p> <ul> <li>f1-microにする</li> <li>80, 433ポートを開放する <ul> <li>「HTTPトラフィックを許可する」にチェック</li> <li>「HTTPSトラフィックを許可する」にチェック</li> </ul></li> <li>IPを固定にする <ul> <li>「ネットワーキング」>「ネットワークインターフェース」>「外部IP」</li> <li><strong>「プライマリ内部IP」とは違うので注意</strong></li> </ul></li> </ul> <h3 id="2. SSHの設定"><a href="#2.+SSH%E3%81%AE%E8%A8%AD%E5%AE%9A">2. SSHの設定</a></h3> <h4 id="2-1. ポート変更"><a href="#2-1.+%E3%83%9D%E3%83%BC%E3%83%88%E5%A4%89%E6%9B%B4">2-1. ポート変更</a></h4> <ul> <li>メニューの「VPCネットワーク」>「ファイアウォールルール」から</li> <li>「ファイアウォール ルールの作成」を押して作成 <ul> <li>ターゲットタグ: original-allow-ssh</li> <li>ソースIPの範囲: 0.0.0.0/0</li> <li>プロトコルとポート: tcp 40022</li> </ul></li> <li>VMの「ネットワークタグ」に「ターゲットタグ」をつける</li> <li>「VMインスタンス」にある該当のVMの「接続」>「SSH」を押してブラウザでログイン</li> </ul> <pre><code class="shell"># apt updateしないとvimをインストールできない $ sudo apt update $ sudo apt install -y vim $ sudo vim /etc/ssh/sshd_config $ sudo systemctl restart sshd </code></pre> <pre><code class="diff"> #Port 22 + Port XXXX (XXXX は さっき開けたポート番号) #AddressFamily any #ListenAddress 0.0.0.0 #ListenAddress :: </code></pre> <p>sshdを再起動したら、<strong>編集したブラウザは閉じずに</strong>、<br /> 「接続」>「ブラウザからカスタムポートで SSH を開く」から<br /> 変更したポートで接続してみて、つながるかどうかを確認</p> <p>うまくできたらポートを閉じる</p> <ul> <li>「ファイアウォールルール」に移動</li> <li>「ファイアウォール ルールの作成」を押して作成 <ul> <li>ターゲットタグ: disallow-ssh22</li> <li>一致したときのアクション: 拒否</li> <li>ソースIPの範囲: 0.0.0.0/0</li> <li>プロトコルとポート: tcp 22</li> </ul></li> <li>VMの「ネットワークタグ」に「ターゲットタグ」をつける</li> </ul> <h4 id="2-2. 公開鍵の認証"><a href="#2-2.+%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E8%AA%8D%E8%A8%BC">2-2. 公開鍵の認証</a></h4> <pre><code class="shell"># 鍵を生成。アカウント名はmemorylovers $ ssh-keygen -t rsa -f ~/.ssh/gcp_key -C memorylovers $ chmod 400 ~/.ssh/gcp_key # 公開鍵をコピー $ cat ~/.ssh/gcp_key.pub | pbcopy </code></pre> <ul> <li>メニューの「VMインスタンス」から該当のVMを選択し、編集画面へ</li> <li>SSHキーに貼り付けて、保存</li> </ul> <p>接続確認をしてみる</p> <pre><code class="shell">$ ssh memorylovers@<IPアドレス> -p <指定したポート> -i ~/.ssh/gcp_key </code></pre> <h4 id="2-3. SSHの設定を変更"><a href="#2-3.+SSH%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E5%A4%89%E6%9B%B4">2-3. SSHの設定を変更</a></h4> <p>ポート番号以外について、確認・設定していく</p> <pre><code class="diff"> # プロトコルを2にする + Protocol 2 # rootログインを無効にする #PermitRootLogin prohibit-password + PermitRootLogin no # パスワード認証を無効にする PasswordAuthentication no ChallengeResponseAuthentication no # 認証の試行回数を制限する #MaxAuthTries 6 + MaxAuthTries 5 </code></pre> <p>設定が終わったらsshdを再起動して設定を反映</p> <pre><code class="shell">$ sudo systemctl restart sshd </code></pre> <p>以上!! これでインスタンスが作成できた!</p> <h2 id="こんなのつくってます!!"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%81%A3%E3%81%A6%E3%81%BE%E3%81%99%21%21">こんなのつくってます!!</a></h2> <p>積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!<br /> <a target="_blank" rel="nofollow noopener" href="https://tsundoku.site">積読ハウマッチ</a>は、Nuxt.js+Firebaseで開発してます!</p> <p><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478782/572d4947-f40b-e4dc-1c9c-bc584cd2a66c.png" width="200"/></p> <p>もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ</p> <p>要望・感想・アドバイスなどあれば、<br /> 公式アカウント(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/MemoryLoverz">@MemoryLoverz</a>)や開発者(<a target="_blank" rel="nofollow noopener" href="https://twitter.com/kira_puka">@kira_puka</a>)まで♪</p> <h1 id="参考にしたサイト"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88">参考にしたサイト</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ndxbn/items/7ef0a96e409a5b5837bd#ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F">GCE の無料枠のサーバを立るときに、初見でハマりそうなところ - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/riku-shiru/items/a870edd9dc0b132e092c#80443%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E8%A7%A3%E6%94%BE%E3%81%99%E3%82%8B">GCPで永久無料枠を利用してサービスを立ち上げたときにしたことの備忘録 - Qiita</a></li> </ul> きらぷか@積読ハウマッチ/SSSAPIなど tag:crieit.net,2005:PublicArticle/15546 2019-11-14T08:49:36+09:00 2019-11-14T08:49:36+09:00 https://crieit.net/posts/Google-Compute-Engine-gcloud Google Compute Engine利用時に使うgcloudコマンド備忘録 <p>Google Compute Engineを使っているとサーバーと接続するために色々なgcloudコマンドを利用する必要がある。普段はシェルの実行履歴から呼び出して使っているけど、何かのひょうしにPCが壊れて履歴がなくなってしまったら困るし、結構一から使い方を探すと見つからなかったりするのでとりあえずまとめておく。</p> <h2 id="SSH接続"><a href="#SSH%E6%8E%A5%E7%B6%9A">SSH接続</a></h2> <pre><code>gcloud compute --project "my-project-id" ssh --zone "us-east1-b" "instance-1" </code></pre> <h2 id="ポートフォワーディング"><a href="#%E3%83%9D%E3%83%BC%E3%83%88%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0">ポートフォワーディング</a></h2> <p>ローカルPCでサーバーのデータベースと接続するときとか</p> <pre><code>gcloud compute --project "my-project-id" ssh --zone "us-east1-b" "instance-1" -- -L 13306:localhost:3306 </code></pre> <h2 id="SCPで送信"><a href="#SCP%E3%81%A7%E9%80%81%E4%BF%A1">SCPで送信</a></h2> <p>SCPでファイルを送ったり受信したりする時。ファイルとフォルダによってちょっと違う。</p> <h3 id="ファイルを送信"><a href="#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E9%80%81%E4%BF%A1">ファイルを送信</a></h3> <pre><code>gcloud compute scp --project "my-project-id" --zone "us-central1-f" instance-1:/home/dala00/profile.sql.gz . </code></pre> <h3 id="フォルダを送信"><a href="#%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E9%80%81%E4%BF%A1">フォルダを送信</a></h3> <pre><code>gcloud compute scp --project "my-project-id" --zone "us-west1-b" --recurse instance-1:/home/dala00/questions localdir </code></pre> <h2 id="コマンドを実行する"><a href="#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B">コマンドを実行する</a></h2> <pre><code>gcloud compute --project "my-project-id" ssh --zone "us-west1-b" dala00@"instance-1" --command 'touch bbb.txt;rm aaa.txt' </code></pre> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14522 2018-09-04T18:37:50+09:00 2020-04-08T00:08:44+09:00 https://crieit.net/posts/Crieit-5b8e526e13820 Crieitの構成 <p>Crieitの構成をまとめたものが無かったのでまとめておきます。(2018/8現在)</p> <p>一応Qiitaには以前書いていましたのでより細かい部分が気になる場合はそちらを見てください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/dala00/items/963a8f65a7730ede8f3b">Qiitaの様なサービス作成中 ローカル環境構築 連載(1)</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/dala00/items/777c588687196bb0125a">Qiitaの様なサービス作成中 サーバーで公開する 連載(5)</a></p> <p>運用費は無料です。</p> <h2 id="言語&フレームワーク"><a href="#%E8%A8%80%E8%AA%9E%EF%BC%86%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF">言語&フレームワーク</a></h2> <ul> <li>PHP7.2</li> <li>Laravel5.8</li> <li>Vue2</li> </ul> <h2 id="データベース"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9">データベース</a></h2> <p>MySQL8.0</p> <h2 id="デザイン"><a href="#%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3">デザイン</a></h2> <p>Bootstrap Material Design</p> <h2 id="サーバー"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC">サーバー</a></h2> <ul> <li>Google Compute Engine (f1-micro 1台にDBまで全部のせ)</li> <li>Apache2.4</li> </ul> <p>追記)2020/4 Cloud Run+Cloud SQLに引っ越し<br /> <a href="https://crieit.net/posts/GCE-Cloud-Run">GCEからCloud Runに引っ越してみた</a></p> <h2 id="CDN"><a href="#CDN">CDN</a></h2> <p>Cloudflare</p> <h2 id="追加システム"><a href="#%E8%BF%BD%E5%8A%A0%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0">追加システム</a></h2> <h3 id="日本で最速の技術系記事投稿サービス"><a href="#%E6%97%A5%E6%9C%AC%E3%81%A7%E6%9C%80%E9%80%9F%E3%81%AE%E6%8A%80%E8%A1%93%E7%B3%BB%E8%A8%98%E4%BA%8B%E6%8A%95%E7%A8%BF%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9">日本で最速の技術系記事投稿サービス</a></h3> <p><a href="https://crieit.net/posts/Crieit-5c7c535c6fca2">Crieitの記事詳細ページが日本の技術系投稿サービスで最速になった</a></p> <h3 id="OGP画像生成サーバー"><a href="#OGP%E7%94%BB%E5%83%8F%E7%94%9F%E6%88%90%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC">OGP画像生成サーバー</a></h3> <p><a href="https://crieit.net/posts/Node-Chrome-Twitter">NodeでChromeを操作してTwitterシェア用画像を生成するサーバー作った</a></p> <h3 id="Nowを使ったCloud Storageのキャッシュサーバー"><a href="#Now%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9FCloud+Storage%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC">Nowを使ったCloud Storageのキャッシュサーバー</a></h3> <p><a href="https://crieit.net/posts/Now-Cloud-Storage">NowのエッジキャッシュでCloud Storage節約サーバー作成</a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14465 2018-06-07T08:47:36+09:00 2018-10-26T15:28:55+09:00 https://crieit.net/posts/Crieit-55 なぜCrieitを作り始めて55時間で公開できたのか? <p>先日Crieitをαααバージョンとして公開しました。公式ツイッターがつぶやいていたので多分5/29だと思います。</p> <p><a href="https://crieit.now.sh/upload_images/1097fa4ca9672593d6f693d102d94d3b5b1699be4da91.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1097fa4ca9672593d6f693d102d94d3b5b1699be4da91.png?mw=700" alt="Crieit コミュニティlike Qiita dev to 3公式 crieitcommunity さん Twitter.png" /></a></p> <p>そういえば作り始めたのはいつだっただろう、と思い見てみました。多分artisanの日付だと思うので5/1。</p> <p><a href="https://crieit.now.sh/upload_images/4efe5f3203817aa6dfc71f41b80f657c5b169aa2403c4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4efe5f3203817aa6dfc71f41b80f657c5b169aa2403c4.png?mw=700" alt="Screenshot from 2018-06-05 23-12-27.png" /></a></p> <p>ということで大体1ヶ月弱だったようです。</p> <p>毎日開発出来たわけではないと思いますが、ちょっと多めに作業した日もあると思いますのでだいたい平均2時間として、30日はいかないので多分おおよそ合計55時間ほどでしょうか。フルタイムで考えると約7人日。<del>仕事やめれば毎週これくらいの規模のものをリリースできることになりますね!</del></p> <p>これは速いのでしょうか? そうではないのでしょうか? 具体的に何をやってたかを述べつつ検証してみます。</p> <h2 id="開発環境構築"><a href="#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89">開発環境構築</a></h2> <p>開発環境はDockerで構築しました。PHP7.2のDocker環境は以前に作っていたので、ちょっと修正してちゃちゃっとdocker-compose.ymlを作って完了です。他にもElixir & Phoenixや、goの環境などもあります。普段から色々作って慣れておくと急に何か作りたい時に速く走り出せます。</p> <p>なので開発環境にDockerをよく使っているエンジニアだったらだいたいこんな感じで普通だと思います。</p> <p>あとはLaravel Installerを使ってインストールすればアプリケーションもすぐ動作します。</p> <h2 id="実際に開発すること"><a href="#%E5%AE%9F%E9%9A%9B%E3%81%AB%E9%96%8B%E7%99%BA%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8">実際に開発すること</a></h2> <p>実際の開発ですが、正直あまりコードも書いていないと思います。とりあえず色々なパーツを組み合わせていくことがメイン。具体的には下記のような事などです。</p> <h3 id="Laravel Socialite"><a href="#Laravel+Socialite">Laravel Socialite</a></h3> <p>Socialiteを使うことで簡単にソーシャルログインが作成できます。これもマニュアル通り作るだけ。</p> <p>僕はソーシャルログイン情報保存用にテーブルを分けましたが、Laravelは最初からユーザーのモデルとマイグレーションファイルも入ってますのでそれを改造するだけでもいいかもしれません。</p> <h3 id="JavaScript"><a href="#JavaScript">JavaScript</a></h3> <p>Laravelは最初からVueが入っています。そのためcsrfトークン用のヘッダーを設定したり色々初期化などしなくてもすぐVue & axiosで開発できます。</p> <pre><code class="sh">yarn run hot </code></pre> <p>でホットリロードできるので、jsファイルを更新するとすぐ勝手にブラウザに反映もされます。</p> <h3 id="記事編集画面"><a href="#%E8%A8%98%E4%BA%8B%E7%B7%A8%E9%9B%86%E7%94%BB%E9%9D%A2">記事編集画面</a></h3> <p>ここもタグ入力コンポーネントである<a target="_blank" rel="nofollow noopener" href="http://www.vue-tags-input.com/#/">vue-tags-input</a>と、markdownエディタである<a target="_blank" rel="nofollow noopener" href="http://ui.toast.com/tui-editor/">TOAST UI Editor</a>を使ったので、ほとんどそれでできてしまいます。あとはボタンをつけたり通信して保存したりするだけ。</p> <h3 id="はてなブログからのインポート"><a href="#%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%AD%E3%82%B0%E3%81%8B%E3%82%89%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88">はてなブログからのインポート</a></h3> <p>今回自分で使いたかったので、はてなブログからのインポートを作成しました。</p> <p>直リンクはダメだと思うので画像を取得して保存したり、はてなブログの独自リンクタグを通常のmarkdownに変換するために各リンクのhtml & titleタグを取得して、文字コードがおかしかったり404でエラーになったりして無限ループになり画像を何千も保存してしまったり(無料枠じゃなかったら怖いですね)</p> <p>本質とは関係ない機能なのですが、ここで結構時間を使ってしまったと思います。高速開発重視だったら絶対に手を出してはいけないところですね。</p> <h3 id="つまりは?"><a href="#%E3%81%A4%E3%81%BE%E3%82%8A%E3%81%AF%EF%BC%9F">つまりは?</a></h3> <p>まあ何しろ、上記のように実際には開発が速いわけではなく、そもそもそんなにやる事がない、という事が分かるかと思います。ベースとなるのは記事データのテーブルだけで、あとは適当にタグ等がbelong belongとくっついているだけですので。</p> <h2 id="公開作業"><a href="#%E5%85%AC%E9%96%8B%E4%BD%9C%E6%A5%AD">公開作業</a></h2> <p>公開方法は色々あると思いますが、僕はGoogle Compute Engineのf1-microがAlways Freeになってからはずっとそればかり使っています。もう7, 8アプリケーションくらいはそれで公開しているのでだいぶ慣れています。</p> <p>そもそも、仕事も趣味もプログラミングなので、それ以前からアプリケーションを公開するためのサーバー設定は慣れています。(メンテナンスとかはよくわかっていません)</p> <p>ただ、慣れているかは関係なく、Google Compute Engineでリリースしたアプリケーションについては、アプリケーションを公開するまでのコマンド実行手順を全部メモっているので、それを見て実行していくだけでちゃちゃっとリリース出来てしまいます。こうやって最初だけ頑張って色々書き残しておくと、その後が非常に楽です。</p> <h2 id="αバージョン"><a href="#%CE%B1%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3">αバージョン</a></h2> <p>そもそも、現在αバージョンです。前述の通り、メインとなる記事テーブル周りの処理だけを優先して作っており、それ以外のところはほとんど作っていません。ユーザーのプロフィール編集機能もありませんし、「いいね」機能もコメント機能すらありません。</p> <p>つまり、公開優先でそもそも完成すらしていないので、何もやっていないからすぐ公開できた、というだけなのです。多分同じくらいの経歴のエンジニアならサービス全体をちゃちゃっと見るとすぐ感じたと思いますが、特に何も速いわけではありません。むしろインポート作ってたせいで遅いくらいでしょう。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>以上の通り、公開できた理由は速かったわけではなく、単純にそれくらいしか作らなかったために早かっただけです。</p> <p>WEBサービスを実際にいくつか作った事がある人ならわかると思いますが、想像以上に人は集まりませんし成功しません。あまり頑張りすぎても誰も使ってくれず無駄になることが多いので、あまり作りこまずにとりあえず公開可能なところで区切って使ってみてもらうことが割と重要だったりします。どうやって速く作るかじゃなく、どうやって早く公開するか、というところです。</p> <p>もちろんガッツリ作りこんだ方がいいパターンもあるかもしれませんのでそれはプロジェクトの方針等から適宜決める必要があるのかもしれません。</p> <p>失敗したら次を考えて(既にもう色々作りたいものがあるので)どんどん作っていきたいので、こういった形でうまく行くかを早めに判断する手法は大字です。</p> <p>ちなみにCrieitは失敗しても僕のブログになるので特に終了することなく永久に継続予定です。</p> だら@Crieit開発者