Google Cloud Platform Advent Calendar 2019 - Day 18

ふうせん🎈 Fu-sen. です。

えっ、Google Cloud Platform Advent Calendar 2019、空きが出ました!?
それならもう一つネタにしたい事があったので、しちゃいましょうね。
Google Cloud Run。やっぱり今年 2019 年はこれでしょ。


PHP

その前に PHP の話をしましょう。触れてなくても名前は聞いてる PHP。
だってアレもコレも PHP で動いてますもんね~。

PHP 7.4.0 が 2019年11月 に公開されたばかりです。
でも先日ご紹介している Google App Engine は 2019年12月現在、
PHP 7.2 が正式版で、PHP 7.3 はベータ版というお話をしていました。

共用レンタルサーバでも PHP 7.2~PHP 7.3 という状況。
最新の PHP 7.4 をテストしてみたいけど、
わざわざインストールするのは大変ですよね?

そこで、登場するのが……


Google Cloud Run

ドーーーン! Google Cloud Platform で 2019年11月より正式サービスとなった
Google Cloud Run であります。

クラスタで、コンテナで、う~ん……意味が分かりません 😅
という人でも心配要りません。
Git とかでシェルからコマンド叩いて使ってる人なら OK ですよ~。

……えっ、「クラウドは料金が怖い~~~ 😭」って?

Google Cloud Platform のいくつかのサービスには
Always Free っていう、毎月ある上限までは無料で使用できる料金の仕組みがあります。
Always Free のおかげで自分は Google Cloud Platform を使ってますよ~😄
この Always Free、Cloud Run も対象なのでご安心下さい。

  • CPU 最初の 180,000 vCPU 秒は無料
  • メモリ 最初の 360,000 GB 秒は無料
  • リクエスト 200 万リクエストまで無料
  • ネットワーキング 北米から下り 1GB まで無料

またビルド作業に Cloud Build が使われますが、
デフォルトで起動されるマシンタイプでは、
1 日あたり最初の 120 ビルド分は無料となっています。

更にファイルの保存として Cloud Storage が使われますが、
こちらも無料枠があります。

  • Standard Storage 5GB / 月
  • クラス A オペレーション 5000
  • クラス B オペレーション 50000
  • ネットワーク 下り・外向き 1GB

こんな感じです。

気をつけてほしいのは、Always Free な無料対象のストレージは
リージョン us-west1・us-central1・us-east1 のみが対象です。
日本の Cloud Storage だと転送・保存は有料になるという事です。
また、オーストラリア・中国からの参照は対象外となっています。
特に中国は URL を公開していると参照が多くなるので、
URL をブログや SNS に貼り付けて公開する時は、
ある程度課金が発生する事を覚悟した方が良いですね。

もちろん使い方次第では、他にも何か課金が発生するかもしれませんので、
そこは使って日数が経過してからコンソールで
お支払い 表示が上がっているか確認してみて下さい。
使って 1 年経過していない人だったら、$300 分の無料クレジットがあるので、
課金を怖がらずに使えますね~。😁


プロジェクトを作成

それでは使ってみますか! Google Cloud Platform コンソール に入ります。
ここではアカウント登録とかが終わってる前提でいきますよ~。

Google Cloud Platform コンソール

お試しで使う場合は、現在動作しているプロジェクトとは別に
Cloud Run 専用でプロジェクトを作る事をすすめします。
もし課金が発生した時、どこで発生しているかがわかりやすくなりますし、
不要であれば、容易にプロジェクトを削除するだけで完全停止できます。

という事で、まずはプロジェクトを作ります。
左上 Google Cloud Platform 右のプロジェクト名をクリックすると
プロジェクトの選択 という画面になるので、右上 新しいプロジェクト を選びます。

新しいプロジェクト

削除する前提でお試し使用であれば、二度と使わないプロジェクト ID にして下さい。
デフォルトに表示されているプロジェクト名・プロジェクト ID のままで良いでしょう。
この時のプロジェクト ID、後ほど使用します。(ここでは norse-ego-262313)

数秒待つと、プロジェクトが作成されます。
複数プロジェクトがある場合は、その作成したプロジェクトを選択します。
このプロジェクトはお支払いの対象にする必要があります。
左上からサイドバーのメニューを出し、お支払い を選びます。

お支払いを選択

「このプロジェクトには請求先アカウントがありません」と表示されるので、
請求先アカウントをリンク - アカウントを設定 と進めます。

請求先アカウントをリンク

この時上限に達してエラーになる場合は、(デフォルトで 5 プロジェクトまで)
お支払い - アカウント管理 から
特に使っていないプロジェクトで 課金を無効にする を選んで外した後、
もう一度プロジェクトの選択から行って下さい。


HTML とかを準備

Web 参照される領域部分を用意します。サーバへアップロードする中身ですね。
Windows であればエクスプローラ、Mac なら Finder で任意のフォルダを作り、
その中に公開するファイルを作っていきます。
まぁ、Web サイトで公開するファイルを突っ込んでいけば良いのですが……

とりあえず、最低限の index.html ファイルをまず置きましょう。
メモ帳でも、よく使っているテキストエディタでも……

<html>
<body>
Hello, Cloud Run!
</body>
</html>

今回は最新の PHP を動かすという事で phpinfo で確認したいですね。
phpinfo.php がわかりやすいですね。index.html と同じところに保存します。

<?php
  phpinfo();

フォルダ内は index.html と phpinfo.php

こんな感じですね。もちろん画像なども入れても構いません。


Docker Hub - PHP Docker Official Images

自宅サーバとか、VPS・専用サーバで各種サーバを
インストールからやってみた事ありますか?
すっごい面倒くさい! 時間もかかる!
んじゃ最初から動く状態の仮想環境を作ってしまおう!
というのが Docker コンテナ と呼ばれるものです。そう、これがコンテナ。
「サーバとかを突っ込んだ容器」というわけです。

この Docker コンテナ、有名どころはおおよそ公式のイメージがあります。
PHP にももちろん PHP Docker 公式イメージがあるんです。
公式だから……

使用できる Dockerdile の一覧

ちゃんと……ほら!

7.4.0 の記載がある

公開されたての 7.4.0 がイメージにあるんですね~。
しかもよくみると、apache という記載もあります!
Apache は有名な Web サーバです。多くのサーバで現在も採用されています。
という事で最新の PHP に Apache が含まれた
7.4-apache イメージを使ってみる事にします。

なお、PHP がサポートしているバージョンに限られるので、
記載時(2019年12月)時点で最も古いバージョンは 7.2 系です。
すでに PHP 5 はサポート終わってますので……


Dockerfile

Docker というのを使う場合は、通常 Dockerfile が入ります。
Docker Hub のどこからイメージもってきて、コマンド入れるわけですが……
まぁ、簡単にこんな感じ。

FROM php:7.4-apache
COPY ./ /var/www/html/
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

このまま Dockerfile というファイル名で index.html などがあるところに
保存します。

Dockerfile を追加

こんな感じです。

ちょっと Dockerfile を説明していきましょうか。

FROM php:7.4-apache

PHP Docker 公式イメージより 7.4-apache イメージを得ます。
FROM php:7.4.0-apache とバージョン決め打ちもできますが、
しなければ 7.4 系の最新版となります。

COPY ./ /var/www/html/

./ は現在のディレクトリ(フォルダ)です。COPY します。
例えば Hugo だったら public/ とかしたいかもしれません。
/var/www/html/ が Web 公開されるディレクトリです。
詳しい説明は省略。ここに入れた内容が Web で公開される、という事で。

RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

この行は Cloud Run 独自の記載です。環境変数 PORT に開いてるポートが入ります。
デフォルトの 80 から置き換えます。まぁ、この行もこのままで良いです。
sed はファイルの文字列を置き換えする時に使うコマンドですね。

RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

PHP を手作業でインストールしている人なら php.ini の構築をしていますよね?
ここでは開発者向け php.ini-development を php.ini に変えています。
公開向けならば php.ini-production にして下さい。
mv はファイル名を変更するコマンドです。Windows は REN・RENAME でしたっけ?


Cloud Run 使用開始!

それでは Google Chud Platform コンソールの画面に戻り、
いよいよ Cloud Run を使ってまいります。

左上からメニューを出し、コンピューティング 内の Cloud Run を選びます。

Cloud Run の使用を開始する

こんな画面が出てきますので、Cloud Run の使用を開始する を選びます。

Cloud Run 準備完了

この画面で準備 OK です。👌

ちなみにプロジェクト作りたてであれば、左上のメニューから
ツール 内の Cloud Build - 設定 を参照し、 Cloud Build API も有効にしておきます。


シェルの起動

さあ、シェルを起動しましょう。
Windows でエクスプローラを開いているのであれば、
現在の場所を表示しているところに cmd か powershell と入力します。
Windows 10 では PowerShell が追加されています。
自分は コマンド プロンプト よりは PowerShell を使ってますね~

powershell と入力

または Git を入れているのであれば、空いているところを右クリックすると
Git Bash Here って出てきます。この Git Bash でも良いです。

Git Bash here を選択

こうすると、わざわざ cd うんちゃら ってする必要がありません。


コンテナのビルド(アップロード)

では、コンデナをビルドします。まぁ、ファイルのアップロードだと思って良いです。
ここで、プロジェクトを作成した時の プロジェクト ID を使用します。
覚えてます?メモってましたか?……あ、忘れた? 😅
コンソールより、左上 Google Cloud Platform の右、プロジェクト名を選ぶと、
プロジェクトの一覧でプロジェクト ID も出てきます。
先程の例では norse-ego-262313 でしたね。作成した ID に置き換えて下さい。
その後ろに任意の イメージ名 を付けます。ここは cloud-run としましょう。

gcloud はインストール済みという前提で……次のように入力します。

gcloud builds submit --project norse-ego-262313 --tag gcr.io/norse-ego-262313/cloud-run

もし、課金が若干上がっても良いので日本の Cloud Storage を使う場合は、
gcr.io を asia.gcr.io にすると転送は無料になるかと思います。

実行結果

いろいろ出てくるのですが、
最終的に SUCCESS とこんな感じにでてこればビルド成功です。
ここ、Docker に慣れている人は、docker コマンドでも OK です。


イメージのデプロイ(公開)

で、更にイメージのデプロイという作業をします。まぁ、公開ですね。
コンテナを選択する事で、前の状態に戻したりでき、
また公開するサーバの場所(リージョン)や同時参照数なども変更できます。

ここでは Web ブラウザの コンソール 画面上から行います。
Cloud Run の画面から変更していた場合は、左上のメニューから Cloud Run を選びます。
Cloud Run の画面から サービスを作成 を選びます。

サービスの作成を選択

サービスの作成 画面になります。

Cloud Run サービスの作成

コンテナ を 選択 すると、先程ビルドしたコンテナが表示されます。
これを選びます。

デプロイメント プラットフォーム はできるだけ無料にしたいなら
us-central1 のままにします。
課金が上がっても良いので、日本にしたい場合、
東京は asia-northeast1、大阪は asia-northeast2 です。

サービス名 はコンテナをデプロイした時のイメージ名が入っているでしょう。
必要ならば変更します。

認証 は 未認証の呼び出しを許可 のままで良いです。
ここを変更すると、Web ブラウザから参照できなくなるので、変更しないで下さい。

下へスクロールして、デプロイ を選択します。

Cloud Run サービスの作成

最終的に URL のところに https://うんちゃら.a.run.app が出てきます。
新サービスなので、当然 SSL が効いて https になっています。
また、ランダムが文字列が付加されていて、いかにも開発用の一時的な URL ですね。
ではこれをブラウザで見てみましょう。URL をクリックすると……

Hello, Cloud Run!

無事に表示されました! index.html の中身ですね。
後ろに /phpinfo.php を入れれば phpinfo が表示されるはずです。どれどれ……

Hello, Cloud Run!

やった~~~! PHP Version 7.4.0!! 最新の PHP 環境が動いてます!!

ファイルを更新したい場合は index.html などの部分を変えた後に、
コンテナのビルド→イメージのデプロイ をしなおします。

gcloud コマンドからでもデプロイできます。こんな感じです。

gcloud run deploy --project norse-ego-262313 --image gcr.io/norse-ego-262313/cloud-run --platform managed

このコマンド、beta 付で記載されているブログが多いかと思いますが、
正式サービスになりましたので、beta は不要になっています。
上のようにして、失敗する場合は、コンポーネントの更新をしていないでしょう。
gcloud components update ですね。

なお、ある程度課金されても良いので、このまま公開してしまう場合は
独自ドメインを設定したいでしょう。
Cloud Run の一覧画面から カスタムドメインを管理 で設定が行えます。
robots.txt とか入れるのを忘れないで下さいね~~~。
今回 Apache なので、.htaccess も使用できます。


プロジェクトの削除

URL を公開しなければ、参照される恐れは少ないですが、
完全に使わないなら、課金の心配がないように消しておいた方が良いですね。
必要になったら、またプロジェクト作成をすれば良いのです。

使い終わった時の削除ですが、Cloud Run の場合は、ちょっと面倒で、
Cloud Run API を無効にしたり、Cloud Storage 内を削除したりする必要があります。
なので、一番手っ取り早いのはプロジェクトそのものを削除してしまう方法です。
お試しの時は Cloud Run 用にプロジェクトを作って~という理由がここでしたね。

左上からメニューを出し、IAM と管理 - 設定 を選びます。
(または 右上 Google アカウントアイコンの左にある
 縦 3 つの点を選んで プロジェクトの設定)
この画面で シャットダウン を選びます。
プロジェクト ID を入力して シャットダウン を行って下さい。

……あ、自分もこの記事で紹介しているプロジェクトはシャットダウンしてあります。
なので、画像で URL を公開していますが、この URL は参照できなくなっています。


PHP の最新環境が素早く使える!

最新の PHP を使うために、PHP や Apache などの Web サーバを
わざわざインストールする必要はありません。
Cloud Run で最新の PHP が動作する Web サーバが簡単に使えてしまいます。
作成していた PHP のソースが最新の PHP で動作するか確認するとか、
最新の PHP で開発を行う必要があるとか、そういう時には便利ですね。

クラウドサービスは課金以外にも複数のサービスを連動する事がが多く、
その点でも使いにくさを感じる事があります。
でも今回のように Cloud Run だけのシンプルな使い方もできます。
公開せずに開発・テスト向けなどであれば、課金も無料~少額で済みます。

Google Cloud Platform の新サービス、Cloud Run で
新しい PHP をお試し下さい。


Google Cloud Platform Advent Calendar 2019

Google Cloud Platform Advent Calendar 2019 | Qiita