GCPでWebアプリ環境構築

GCP 上で Web アプリを作成します。
GCP のプロジェクトはすでに作成済みで、GCP のコンソールが開けるものとします。

構成

GCP 上に Web アプリ(LAMP 環境)を構築します。Compute Engine 作成時にコンテナイメージを指定して、Compute Engine 上でコンテナを動かすことができるようなので、今回は、GCE(Compute Engine) + CloudSQL を使い、下記のような構成にしようと思います。

  1. Compute Engine 上でコンテナを稼働し、その上で apache + PHP を動かします。
    • PHP は、今回 PHP-FPM ではないので、コンテナで動かすのは apache のみです。
  2. VPC を使って、Compute Engine - CloudSQL 間の通信は PrivateIP でやり取りします。
  3. Web アプリ構築済みのコンテナイメージは必要なので、DockerFile 等、別途用意しておいてください。
    • ちなみに、今回のコンテナは CentOS7+Apache+PHP5.4 系 で構成されています。
  4. 用意したコンテナイメージは、 Container Registry に push して、Compute Engine 起動時に Container Registry から コンテナイメージを pull するようにします。

VPC でネットワークを作成

まずは VPC(Virtual Private Cloud)を用意します。

  1. 左上アイコンをクリックして、「VPC ネットワーク」を選択し、VPC ネットワークの画面を開きます。
  2. VPC ネットワークの画面が開いたら上部の「VPC ネットワークを作成」をクリックします。
  3. 下記のように適当に好きなネットワークの名前、サブネットの名前、リージョン(asia-northeast2 を選択)、IP アドレス範囲を入力したら、完了ボタン、作成ボタンを押して作成します。

VPC でプライベートサービス接続の設定

後で作成する CloudSQL がプライベート IP で接続できるように、先程作成したネットワークに対して、プライベートサービス接続の設定を行います。

  1. 先程作成したネットワークを選択して、詳細画面を開きます。
  2. 「プライベートサービス接続」をクリックして、表示される画面でプライベートサービス接続をオンにしてください。(下記はすでにオンにして、プライベートサービス接続済みのキャプチャです・・・)
  3. その後上記のように表示される「IP 範囲の割り当て」ボタンをクリックしてください。
  4. ここで、先程とはまた別に IP アドレス範囲を設定します。この IP アドレス範囲を、このあとで Cloud SQL に設定する private ネットワーク に割り当てます。「割り当て」を押して完了です。

Cloud SQL インスタンスを作成

  1. Cloud SQL の画面を開いて「インスタンスを作成」をクリックする。
  2. MySQL を選択する。
  3. インスタンスの新規登録画面が表示されるので、名前等入力してください。リージョンは asia-northeast2 (大阪)を選択してください。
  4. 「設定オプションを表示」を押し、「接続」をクリックすると下記の様に入力エリアが表示されます。
  5. 上記のように、public ネットワークはオフにして、private ネットワークのみ ON にしてください。
  6. private ネットワークには先程作成した VPC のネットワークを選択し、「割り当てて接続」ボタンを押してください。
  7. 一番下の「作成」ボタンを押すと、インスタンスを作成が完了します。

※ ここで、WEB アプリ用の DB のユーザ作成・DB 作成を作成可能ですが、コンソールで作成すると、root と同じ権限のユーザになってしまうので、コンテナ起動後、phpMyAdmin 等コンテナ経由でアクセスして DB のユーザ作成・DB 作成を行ったほうがいいです。

コンテナイメージを Container Registry に push

コンテナを Compute Engine で起動するために、Container Registry にコンテナイメージを push しておく必要があるため、push します。

  1. Container Registry のページにアクセスして、Container Registry を有効化してください。
  2. 下記手順に沿って sdk をローカルにインストールしてください。
  3. 下記手順を実行して、docker コマンドで push できるようにしてください。
  4. ローカルで、下記コマンドを実行して、対象のコンテナイメージ名をリポジトリ URL で commit してください。

リポジトリ URL は asia.gcr.io/プロジェクト名/好きな文字列 を指定してください。

  1. ローカルで、下記コマンドを実行して、Container Registry に push してください。

  1. 以上で、Container Registry 上にコンテナが push されたことが確認できるはずです。(下記は何度か push してみたあとのキャプチャです)

GCE 上でコンテナを起動する

GCE のインスタンスを作成します。作成する際に、先程 push したコンテナイメージを指定して、GCE 上でコンテナを起動するようにします。

  1. Compute Engine で「インスタンスを作成」をクリックします。
  2. 表示される画面でインスタンス名等を入力してください。 1. リージョンは東京 or 大阪を選択してください。ゾーンはどこでも良いですが、CloudSQL や VPC でも設定となるべく揃えるのが無難です。
  3. コンテナ「この VM インスタンスにコンテナ イメージをデプロイします。」をチェックします。
  4. コンテナ イメージに、Container Registry のリポジトリ URL を入力します。
  5. 「コンテナの詳細オプション」をクリックし、「権限のあるユーザーとして実行」にチェックを入れます。
  6. 「環境変数」にコンテナで使用する環境変数を設定してください。
    • MySQL のユーザや API キーなど、認証系の情報は環境変数で定義します。
  7. 「ボリュームのマウント」で「Add volume」をクリックする。ここでコンテナが使うソースコードのディレクトリなど、永続化するディレクトリをマウントするようにしてください。下記は例です。 1. 「マウントパス」に /data 1. 「ホストのパス」に /var/www (/data などにしたら権限でエラーになるので、このあたりのパスが無難そうです。)
  8. 「HTTP トラフィックを許可する」にチェックを入れる(これにより、インスタンスに 80 ポートでつなげる) 1. GCE 上で動くコンテナは、ホストの OS と同じネットワークにいるとみなして良いのです。
  9. 「 管理、セキュリティ、ディスク、ネットワーク、単一テナンシー」をクリックする
  10. 「ネットーワーキング」をクリックし、「ネットワーク インターフェース」に、さきほど作成した VPC のネットワークを指定します。(サブネットワークも)
  11. 「プライマリ内部 IP」を選択して、「静的内部 IP アドレスの予約」を選択して範囲内の IP を入力してください。
  12. 「外部 IP」で「IP アドレスを作成」を選択してください。
    1. 選択しなかったら、動的に変わるグローバル IP が自動で割り振られます。
  13. 「作成」ボタンを押してインスタンスを作成します。と同時に自動でコンテナが pull され、コンテナ起動されます。

これで、コンテナの起動は完了です。
うまく起動できていれば、外部 IP に 80 ポートアクセスすれば、コンテナ上で起動している WEB アプリにブラウザアクセスできます。
(アクセスできない場合は、Compute Engine 上からログを確認したり、今一度ローカルで作成したイメージをもとに、コンテナを起動してみてください。よくあるのが、ローカルではマウントしたディレクトリにソースを置いていたため、Compute Engine 上でコンテナからソースにアクセスできない(ソースが存在しない)、などです。)

Compute Engine(GCE) に SSH 接続する

ここまでの状態だと、まずは、インスタンスに SSH 接続するためのポート 22 が空いていないので空けます。

ポート 22 を開放

  1. VPC の画面を表示します。
  2. 作成した VPC のネットワークを選択します。(サブネットをクリックすると別の画面にいくので、ネットワークの方を選択します。)
  3. 「ファイアーウォール ルール」をクリックして、「ファイアーウォール ルールを追加」ボタンを押します。
  4. 名前等は適当なものを入力してください。「ターゲットタグ」に ssh 接続する際に設定する任意のタグ名を入力してください。(あとで Compute Engine 側にも同じタグを設定します)
  5. ソース IP の範囲に、 0.0.0.0/0 と入力します。
    • 本来であれば、接続する IP を絞るほうが好ましいのですが、それでは GCP の cloudshell 等からもアクセスできなくなるので、一旦このように設定します。
  6. 「tcp」に 22 と設定したら、「作成」ボタンを押します。

Compute Engine にタグを設定

  1. Compute Engine の画面を表示します。
  2. 対象のインスタンスをクリックします。
  3. 上部の「編集」をクリックして、「ネットワーク タグ」に先程作成したタグ名を入力してください。

cloudshell から秘密鍵を入手

下記で cloudshell を使って SSH 接続し、秘密鍵を入手します。

  1. Compute Engine の画面を表示します。
  2. 対象のインスタンスの接続列の「SSH」の左の三角のボタンを押し、「gcloud コマンドを表示」をクリックします。
  3. 画面下部に cloudshell が開くので、表示に従って接続してください。
    • パスフレーズを聞かれますが、パスフレーズをいれると面倒なので、そのまま Enter を押したほうがいいです。
    • このとき、cloudshell によって SSH の秘密鍵、公開鍵が生成されます。
  4. cloudshe 上で、./.ssh/google_compute_engine があることを確認します。

  1. 確認できたら、cloudshell 右上に、「︙」ボタンを押し、「ファイルをダウンロード」を選択します。
  2. ./.ssh/google_compute_engine と入力し、ダウンロードボタンを押すと、秘密鍵がローカルにダウンロードされます。
  3. あとは、通常通り、秘密鍵を使って ssh 接続することが可能なので、任意の手段で SSH 接続してください。(putty の場合は pem -> ppk 変換すれば OK です)

コンテナに接続してシェルを開く

dokcer コマンドの使い方になりますが、上記でインスタンスに SSH 接続した状態で、下記手順でアクセスできます。

  1. 上記でインスタンスに SSH 接続した状態で、下記を実行し、対象のコンテナ名を確認します。

  1. 上記で確認したコンテナ名を指定して下記コマンドを実行する。