GCP 上で Web アプリを作成します。
GCP のプロジェクトはすでに作成済みで、GCP のコンソールが開けるものとします。
目次
構成
GCP 上に Web アプリ(LAMP 環境)を構築します。Compute Engine 作成時にコンテナイメージを指定して、Compute Engine 上でコンテナを動かすことができるようなので、今回は、GCE(Compute Engine) + CloudSQL を使い、下記のような構成にしようと思います。
- Compute Engine 上でコンテナを稼働し、その上で apache + PHP を動かします。
- PHP は、今回 PHP-FPM ではないので、コンテナで動かすのは apache のみです。
- VPC を使って、Compute Engine - CloudSQL 間の通信は PrivateIP でやり取りします。
- Web アプリ構築済みのコンテナイメージは必要なので、DockerFile 等、別途用意しておいてください。
- ちなみに、今回のコンテナは CentOS7+Apache+PHP5.4 系 で構成されています。
- 用意したコンテナイメージは、 Container Registry に push して、Compute Engine 起動時に Container Registry から コンテナイメージを pull するようにします。
VPC でネットワークを作成
まずは VPC(Virtual Private Cloud)を用意します。
- 左上アイコンをクリックして、「VPC ネットワーク」を選択し、VPC ネットワークの画面を開きます。
- VPC ネットワークの画面が開いたら上部の「VPC ネットワークを作成」をクリックします。
- 下記のように適当に好きなネットワークの名前、サブネットの名前、リージョン(
asia-northeast2
を選択)、IP アドレス範囲を入力したら、完了ボタン、作成ボタンを押して作成します。
VPC でプライベートサービス接続の設定
後で作成する CloudSQL がプライベート IP で接続できるように、先程作成したネットワークに対して、プライベートサービス接続の設定を行います。
- 先程作成したネットワークを選択して、詳細画面を開きます。
- 「プライベートサービス接続」をクリックして、表示される画面でプライベートサービス接続をオンにしてください。(下記はすでにオンにして、プライベートサービス接続済みのキャプチャです・・・)
- その後上記のように表示される「IP 範囲の割り当て」ボタンをクリックしてください。
- ここで、先程とはまた別に IP アドレス範囲を設定します。この IP アドレス範囲を、このあとで Cloud SQL に設定する private ネットワーク に割り当てます。「割り当て」を押して完了です。
Cloud SQL インスタンスを作成
- Cloud SQL の画面を開いて「インスタンスを作成」をクリックする。
- MySQL を選択する。
- インスタンスの新規登録画面が表示されるので、名前等入力してください。リージョンは
asia-northeast2
(大阪)を選択してください。
- 「設定オプションを表示」を押し、「接続」をクリックすると下記の様に入力エリアが表示されます。
- 上記のように、public ネットワークはオフにして、private ネットワークのみ ON にしてください。
- private ネットワークには先程作成した VPC のネットワークを選択し、「割り当てて接続」ボタンを押してください。
- 一番下の「作成」ボタンを押すと、インスタンスを作成が完了します。
※ ここで、WEB アプリ用の DB のユーザ作成・DB 作成を作成可能ですが、コンソールで作成すると、root と同じ権限のユーザになってしまうので、コンテナ起動後、phpMyAdmin 等コンテナ経由でアクセスして DB のユーザ作成・DB 作成を行ったほうがいいです。
コンテナイメージを Container Registry に push
コンテナを Compute Engine で起動するために、Container Registry にコンテナイメージを push しておく必要があるため、push します。
- Container Registry のページにアクセスして、Container Registry を有効化してください。
- 下記手順に沿って sdk をローカルにインストールしてください。
- https://cloud.google.com/sdk/docs?hl=ja
- ※ すでに gcloud を使っていたなら、
$ gcloud init
コマンドで初回に認証情報を設定する必要があります。
- 下記手順を実行して、docker コマンドで push できるようにしてください。
- https://cloud.google.com/container-registry/docs/pushing-and-pulling?hl=ja
- おそらく、
$ gcloud auth configure-docker
を実行するだけでよいです。
- ローカルで、下記コマンドを実行して、対象のコンテナイメージ名をリポジトリ URL で commit してください。
1 |
$ docker commit コンテナ名 リポジトリURL(になる予定) |
リポジトリ URL は asia.gcr.io/プロジェクト名/好きな文字列
を指定してください。
- ローカルで、下記コマンドを実行して、Container Registry に push してください。
1 |
$ docker push リポジトリURL(上記で指定した「リポジトリURL(になる予定)」) |
- 以上で、Container Registry 上にコンテナが push されたことが確認できるはずです。(下記は何度か push してみたあとのキャプチャです)
GCE 上でコンテナを起動する
GCE のインスタンスを作成します。作成する際に、先程 push したコンテナイメージを指定して、GCE 上でコンテナを起動するようにします。
- Compute Engine で「インスタンスを作成」をクリックします。
- 表示される画面でインスタンス名等を入力してください。 1. リージョンは東京 or 大阪を選択してください。ゾーンはどこでも良いですが、CloudSQL や VPC でも設定となるべく揃えるのが無難です。
- コンテナ「この VM インスタンスにコンテナ イメージをデプロイします。」をチェックします。
- コンテナ イメージに、Container Registry のリポジトリ URL を入力します。
- 「コンテナの詳細オプション」をクリックし、「権限のあるユーザーとして実行」にチェックを入れます。
- 「環境変数」にコンテナで使用する環境変数を設定してください。
- MySQL のユーザや API キーなど、認証系の情報は環境変数で定義します。
- 「ボリュームのマウント」で「Add volume」をクリックする。ここでコンテナが使うソースコードのディレクトリなど、永続化するディレクトリをマウントするようにしてください。下記は例です。 1. 「マウントパス」に
/data
1. 「ホストのパス」に/var/www
(/data などにしたら権限でエラーになるので、このあたりのパスが無難そうです。)
- 「HTTP トラフィックを許可する」にチェックを入れる(これにより、インスタンスに 80 ポートでつなげる) 1. GCE 上で動くコンテナは、ホストの OS と同じネットワークにいるとみなして良いのです。
- 「 管理、セキュリティ、ディスク、ネットワーク、単一テナンシー」をクリックする
- 「ネットーワーキング」をクリックし、「ネットワーク インターフェース」に、さきほど作成した VPC のネットワークを指定します。(サブネットワークも)
- 「プライマリ内部 IP」を選択して、「静的内部 IP アドレスの予約」を選択して範囲内の IP を入力してください。
- 「外部 IP」で「IP アドレスを作成」を選択してください。
- 選択しなかったら、動的に変わるグローバル IP が自動で割り振られます。
- 「作成」ボタンを押してインスタンスを作成します。と同時に自動でコンテナが pull され、コンテナ起動されます。
これで、コンテナの起動は完了です。
うまく起動できていれば、外部 IP に 80 ポートアクセスすれば、コンテナ上で起動している WEB アプリにブラウザアクセスできます。
(アクセスできない場合は、Compute Engine 上からログを確認したり、今一度ローカルで作成したイメージをもとに、コンテナを起動してみてください。よくあるのが、ローカルではマウントしたディレクトリにソースを置いていたため、Compute Engine 上でコンテナからソースにアクセスできない(ソースが存在しない)、などです。)
Compute Engine(GCE) に SSH 接続する
ここまでの状態だと、まずは、インスタンスに SSH 接続するためのポート 22 が空いていないので空けます。
ポート 22 を開放
- VPC の画面を表示します。
- 作成した VPC のネットワークを選択します。(サブネットをクリックすると別の画面にいくので、ネットワークの方を選択します。)
- 「ファイアーウォール ルール」をクリックして、「ファイアーウォール ルールを追加」ボタンを押します。
- 名前等は適当なものを入力してください。「ターゲットタグ」に ssh 接続する際に設定する任意のタグ名を入力してください。(あとで Compute Engine 側にも同じタグを設定します)
- ソース IP の範囲に、
0.0.0.0/0
と入力します。- 本来であれば、接続する IP を絞るほうが好ましいのですが、それでは GCP の cloudshell 等からもアクセスできなくなるので、一旦このように設定します。
- 「tcp」に
22
と設定したら、「作成」ボタンを押します。
Compute Engine にタグを設定
- Compute Engine の画面を表示します。
- 対象のインスタンスをクリックします。
- 上部の「編集」をクリックして、「ネットワーク タグ」に先程作成したタグ名を入力してください。
cloudshell から秘密鍵を入手
下記で cloudshell を使って SSH 接続し、秘密鍵を入手します。
- Compute Engine の画面を表示します。
- 対象のインスタンスの接続列の「SSH」の左の三角のボタンを押し、「gcloud コマンドを表示」をクリックします。
- 画面下部に cloudshell が開くので、表示に従って接続してください。
- パスフレーズを聞かれますが、パスフレーズをいれると面倒なので、そのまま Enter を押したほうがいいです。
- このとき、cloudshell によって SSH の秘密鍵、公開鍵が生成されます。
- cloudshe 上で、
./.ssh/google_compute_engine
があることを確認します。
1 2 |
$ ls -la ./.ssh/google_compute_engine $ pwd ./.ssh/google_compute_engine |
- 確認できたら、cloudshell 右上に、「︙」ボタンを押し、「ファイルをダウンロード」を選択します。
./.ssh/google_compute_engine
と入力し、ダウンロードボタンを押すと、秘密鍵がローカルにダウンロードされます。- あとは、通常通り、秘密鍵を使って ssh 接続することが可能なので、任意の手段で SSH 接続してください。(putty の場合は pem -> ppk 変換すれば OK です)
コンテナに接続してシェルを開く
dokcer コマンドの使い方になりますが、上記でインスタンスに SSH 接続した状態で、下記手順でアクセスできます。
- 上記でインスタンスに SSH 接続した状態で、下記を実行し、対象のコンテナ名を確認します。
1 |
$ docker ps |
- 上記で確認したコンテナ名を指定して下記コマンドを実行する。
1 |
$ docker exec -it コンテナ名 bash |