【クラウド初心者向け】Google Cloud Platform(GCP)でWebサイトを公開してみよう!


はじめに

みなさんこんにちは、プロダクト開発本部の亀梨です。
普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う
統合プラットフォームの開発を担当しています。

背景

わたくしは最近プライベートで開発したWebサービスをインターネット上に公開しました。
その際にインフラ環境をどうやって構築しようかなーと思ったのですが、レンタルサーバーだとエンジニアとしてどうかなと思ったのと、AWSは普段の開発で触れているのとネット上に知見が貯まりまくっているのでつまらないなーと思ったので、今回は今まで触ったことのなかったGoogle Cloud Platform(GCP)を使って環境構築にトライすることに決めました。

非常に簡単に環境を構築することができたので、同じようにGCPやクラウド使ってみたいというビギナーの方向けにナレッジを共有できればと思い本記事を書くことにしました。

前提 – Webサイトを公開するために必要な環境

Webサイトを公開するにあたっては、最低限以下の環境が必要になってきます。

  • Webサーバー
    • 作成したHTML/CSS等ファイルのインターネット上の置き場所
  • DB(データベース)サーバー
    • サイトに必要なデータの保存場所
  • DNS(ドメインネームシステム)
    • インターネット上の住所、ドメイン(当サイトでいうhttp://yebisupress.dac.co.jp)とIPアドレス(インターネット上の住所のコンピュータが認識できる形式)を紐付けるシステム

これら必要な環境をすべてGoogle Cloud Platform上の各種サービスでまかないたいと思います。

Google Cloud Platformとは

Google Cloud Platform(GCP) とは、Google がクラウド上で提供するサービス群の総称です。
Google 社内で使われているものと同じテクノロジーやインフラを使用して、お客様のインフラ環境をクラウド化できます。
基本的な構成要素が初めから各種サービスとして用意されているため、それらを使用してすばやく開発を行うことができます。

それではWebサイトを公開するために必要な各種サービスを詳しく見ていきましょう。

Google Compute Engine(GCE)


前提で挙げたWebサーバーにあたるものがこちらで、AWSでいうEC2に相当するものとなります。
特徴は何といっても、 Google が実際に運用環境で使用している強力なインフラの上で動くということでしょう。
GCE のインスタンスは Google の高品質なインフラ上で動作するため、高いネットワーク性能や物理的にセキュアな環境に置かれることといった利点が期待できます。

Google Cloud SQL

前提で挙げたDBサーバーにあたるものがこちらで、AWSでいうRDSに相当するものとなります。
クラウド上の PostgreSQL と MySQL のリレーショナル データベースを簡単に設定、維持、運用、管理できるようにするフルマネージド データベース サービスです。

Google Cloud DNS

前提で挙げたDNSにあたるものがこちらとなります。
ドメイン名・IPアドレスを変換するDNSの基本機能です。Google社が自社サービス用として、世界中にあるDNSサーバーを使用し、あらゆる地域からのDNSルックアップをサポートしているので、高い拡張性・可用性があります。

いざ実践

それでは早速GCPの登録と各種サービスの設定を行ってまいりましょう。
今回は、

  • Googleのアカウントを持っていること
  • 開発言語はPHP
  • DBはMySQL

であることを前提とします。

GCPの登録、新規プロジェクトの作成

こちらからアクセスしてスタートページに進みます。
GCPを初めて利用する場合は12ヶ月間の無料トライアルを利用できるので、まずはこちらを登録していきましょう。

「無料トライアルをお試しください」をクリックすると登録画面に進みます。

必須事項を選択し「同意して続行」ボタンをクリックすると、次の画面でアカウントの氏名、住所、クレジットカード情報を入力したら「無料トライアルを開始」ボタンをクリックします。
無料トライアルのエントリーが完了すると、「Google Cloud Platform コンソール」に切り替わり登録が完了します。

次にホーム画面から新規プロジェクトを作成します。


適当なプロジェクト名を入力して「作成」ボタンをクリックします。完了するまで少し時間がかかる場合があります。
プロジェクトの作成が終わるとそのプロジェクトのダッシュボード画面が表示されます。

これで完了です。

Google Compute Engineインスタンスを作成する

では次にGCEでWebサーバーを構築してみましょう。以下の環境を順番に作っていきます。

  • OS:CentOS7
  • Webサーバー:Apache
  • 開発言語:PHP7
  • DB:MySQL(後述のGoogle Cloud SQL接続用)

CentOS7インスタンスの立ち上げ

まずナビゲーションメニューよりGCEの管理画面に遷移します。

画面中央の「作成」をクリックします。

入力画面が表示されたら、名前を好きな名前に、リージョンを「asia-northeast1(東京)」、ブートディスクを「CentOS7」、ファイアウォールを「HTTPトラフィックを許可する」にチェックを付けて最後に「作成」ボタンをクリックします。

作成したインスタンスが、GCEのインスタンス一覧画面に表示されます。
この状態ですでにグローバルIPアドレスが割り当てられており、SSHで接続することができます。
では自分のPCから作成したインスタンスにSSH接続するために公開鍵を登録します。左メニューの「メタデータ」をクリックします。

メタデータの画面で「SSH認証鍵」タブをクリック→「SSH認証鍵を追加」をクリックします。

入力フィールドにSSH公開鍵を入力し保存をクリックします。
保存が完了すると一覧に表示されます。


それでは準備が整ったのでMacのターミナルでGCEインスタンスにSSH接続してみましょう。

はい、無事に接続ができました。

Apache(Webサーバー)のインストール

ではこのCentOS7インスタンス環境に、yum経由でまずはApacheをインストールしていきましょう。

インストールしたら次は自動起動の設定をしておいた上で、実際にApacheを起動してみます。

起動したら、早速ブラウザからIPアドレスでアクセスしてみましょう。
Apacheのテストページが表示されたら成功です。

はい、成功です。

PHP7のインストール

続いてはPHPのインストールです。
CentOS7系の標準リポジトリのPHPバージョンは5.4で、それ以外のバージョンを使用したい場合は、EPELリポジトリとRemiリポジトリの追加が必要になります(EPELはこのCentOS7インスタンスにプリインストール済)。順にインストールしていきます。

はい、無事にインストールができてバージョンも確認ができました。
次にPHPの設定ファイルでタイムゾーンを設定し、その設定を反映させるためApacheを再起動しておきます。

これで準備万端ということで、ドキュメントルートにphpinfoを出力するphpファイルを作成します。

それではブラウザからphpinfo.phpにアクセスしてみましょう。

はい、これでPHPが使えることが確認できましたね。

MySQLのインストール

GCEパートはここで最後です。もう一息。
MySQLは実際は後述のGoogle Cloud SQL上のMySQLを使用しますが、このGCEインスタンスからGoogle Cloud SQLインスタンスに接続するためにMySQLコマンドを使う必要があるため、ここでインストールしておく必要があります。

ターミナルからGCEインスタンスに接続した状態で、yum経由でインストールします。
なおCentOS7にプリインストールされているmariaDBがMySQLと競合を起こすため、まず初めにmariaDBのアンインストール→MySQLインストールという流れが必須です。インストール後の自動起動設定と起動も合わせてやってしまいます。

無事インストールができ、起動することもできました。これでGCEパートは以上となります。

Google Cloud SQLインスタンスを作成する

さて、続いてはDBサーバーとなるGoogle Cloud SQLインスタンスを作成していきます。
まずはダッシュボードの左ナビゲーションメニューより「SQL」をクリックします。

次の画面で「インスタンスを作成」をクリックします。

データベース選択画面で、「MySQL」を選択した状態で「次へ」をクリックします。

MySQLインスタンスタイプ選択画面で、「第2世代を選択」をクリックします。

次の画面で、インスタンスIDに好きなID名を、rootパスワードを入力、ロケーションのリージョンとゾーンはGCEインスタンスと揃える形で設定した上で「作成」ボタンをクリックします。

作成が完了すると、Google Cloud SQLダッシュボードの一覧に表示されます。
ここからインスタンスIDをクリックすると詳細画面に遷移します。


と、ここで大事な設定を行います。
詳細画面では、このGoogle Cloud SQLインスタンスが先に作成したGCEインスタンスからしか接続できないようにしてセキュリティを担保する設定を行います。承認タブよりGCEインスタンスのIPアドレスを追加し「完了」→「保存」ボタンをクリックします。

これでGoogle Cloud SQLの設定はすべて完了です。それでは接続を試してみましょう。
ターミナルからGCEインスタンスに接続→GCEインスタンスからGoogle Cloud SQLインスタンスのMySQLに接続してみます。

はい、無事に接続できました。
PHPコード上からDBに接続する際はホスト名にCloud SQLのIPアドレスを設定すれば接続することができます。

補足としてGUIツールからGCEインスタンス経由でGoogle Cloud SQLに接続する方法も記しておきます。以下キャプチャーはMySQLの「Sequel Pro」というGUIツールですが、このように設定することで接続することができます。

Google Cloud DNSの設定

さてさてようやくラストパート、DNSの設定です。
ここではDNSの設定に必要な、

  • DNSゾーンの作成
  • Aレコードの追加
  • レジストラへの登録

というのを順に行っていきます。DNSに関する詳細な説明は省きますが、ネット上にたくさんの有益な記事がありますので、不明な点はググっていただければと思います。

DNSゾーンの作成

まずはダッシュボードの左ナビゲーションメニューより「ネットワークサービス」>「Cloud DNS」をクリックします。

GCDNS一覧画面で「ゾーンを作成」をクリックします。

ゾーン作成画面で、適当なゾーン名を入力し、DNS名に設定したいドメイン名を入力した上で「作成」をクリックします。

ゾーンが作成されると詳細画面にNSレコードとSOAレコードが作成された状態で表示されます。

Aレコードの追加

次にAレコードを追加するために、ゾーン詳細画面より「レコードセットを追加」をクリックし、入力画面でDNS名にwwwを追記(wwwなしでアクセスさせたい場合は何も入力しない)、リソースレコードのタイプが「A」となっていることを確認、IPv4アドレスにGCEインスタンスのグローバルIPアドレスを入力した上で「作成」ボタンをクリックします。

Aレコードが作成されるとゾーン詳細画面で確認ができます。


これでGoogle Cloud DNS上での設定は完了です。

レジストラへの登録

Cloud DNSで登録したドメインのDNSサーバーを、レジストラ(お名前.com等のドメイン管理機関)のネームサーバーに指定する必要があります。
先程のゾーンに設定された以下のNSレコードにある4つのDNSサーバーを登録します。

これにより、他のDNSサーバーに対して、指定したドメイン情報は上記のDNSサーバーで管理されているという情報が、レジストラのDNSサーバーから伝達されるようになります。ただし、全てのDNSサーバーに情報が伝達されるには、しばらく時間がかかります。
仮にお名前.comでドメインを取得した場合は、お名前.comでのネームサーバーの変更を参照しながら設定をしてみてください。設定後しばらくしたらブラウザから設定したドメイン(URL)にアクセスして正しくページが表示されるか確認してみてください。

以上です。

というわけで、Compute Engine、 Cloud SQL、Coud DNSの設定が完了しWebサイトが公開できる環境が構築できました。
画面キャプチャーが多くなってしまったのでページが長くなってしまいましたが、設定自体はそれほど項目数が多いわけでもなくGCPに慣れていない方でも簡単に設定できるかと思います。個人的にはAWSよりUIが分かりやすくて設定しやすいので今回のトライでGCP大好きになりました。

今回紹介したサービス以外にもできることがたくさんありますので、自分もこれからもっともっとGCPを活用していければと思っています。また知見が貯まりましたら当ブログで紹介していきます。それではまたー。


DACエンジニア採用情報

  関連記事

自社サービスのDocker化(後編)

こんにちは。 インフラ開発部の上田です。 前回、前編としてDockerについて書き、早半年も経ちました。 前編はこちらです 今回は後編として、以下について書いてみたいと思います。 ■複数プロセス起動 前編で書いた通り、通常のOS起動時とは異なり、コンテナ上で個別にプロセスを起動する必要があります。 …

no image
AWSにRailsアプリをデプロイする(準備編)

今回は、せっかくRailsで開発したアプリをAWS上に公開してみたいので その構築方法をまとめていきたいと思います。 (前回の記事:初心者がRailsで開発 – deviseでユーザー認証設定 ) AWSの設定はすでに社内で使用できるようになっていたので割愛します。 ★やりたいこと Gitlabでコ …

【HTML5】4ツール出力ファイルサイズ比較

こんにちは、近江です。 前回もHTML5のSwiffyについて書かせて頂きましたが、まだまだHTML5について調査しています。 今回はSwiffyを含めた4つのHTML5系ツールで、同じ素材で同じアニメーションを作成した時のファイルサイズを比較したいと思います。 何故ファイルサイズの比較をするかと言 …

x-callback-urlを使ってみた

x-callback-urlとは? iOSのアプリ間連携の仕様の一つみたいです。簡単に言うと、ディープリンクを行うためにカスタムURLスキームを利用するが、アプリ毎にバラバラな規則でURLスキームを設定するとアプリ間連携をスムーズに行うことができないため、どのような規則でURLスキームを設定するかを …

全ファイルを検索
意外と知らないかも? Chrome DevTools の機能10選

みんな使っている Chrome DevTools。 Web開発やトラブルシューティングには必須ですが、便利な機能を知らないで使っている人がいたり、Web で使い方を調べても古い情報だったりすることがあるので、部内で Chrome DevTools についての勉強会を開催しました。 ここでは、その中か …

Treasure Dataで大規模なマスタデータを扱う際にはtimeカラムインデックスを活用しよう

DACではTreasure Dataを利用して各種データの蓄積や集計を行っています。Treasure Dataは時系列のデータを扱うのに特にすぐれたアーキテクチャなのですが、セグメントIDとユーザーIDの組み合わせといった大量のマスタデータを利用した計算にも利用することもできます。そのような場合にt …

ゼロからAngularでSPAを作ってみた(3) CI: 継続的インテグレーション編

前回までのおさらいと今回やること 前々回(はじめてのアプリ編)と前回(デプロイ・公開編)で、作成した Angular のチャットアプリを Web に公開するところまでいきました。 でも、デプロイするのに、毎回決まったコマンドを打つのって面倒ですよね。 今回は GitHub でソースコードを管理して、 …

Tableauを利用してMySQLとRedshiftのクロスDBジョインを実現する

はじめに RedshiftやTreasureDataなどのデータマート用のDBにはID単位の解析結果が格納され、ローカルのMySQLにはIDに紐づいた名称マスタが管理されている構成の場合、データマートのクロス集計結果に対してIDに紐づいた名称を付与したいことがあります。 データマート用に用意したDB …

ActiveDirectoryをフォレスト間で移行する(その2)

こんにちは。インフラ開発部の福本です。 2015年も残り約半分ですね。ボーっとしていると、あっという間に日々が過ぎていきます。 その中、少しずつ迫るWindowsServer2003のサポート期限。 保守切れとなるサーバOSの移行に忙殺されているサーバ管理者の方も、いらっしゃるのではないでしょうか。 …

自社サービスのDocker化(前編)

こんにちは。 インフラ開発部の上田です。 普段は自社開発システムのインフラ担当として、日々頑張って仕事をしています。 今回は、近年話題になっているDockerについて、取り上げてみようと思います! なぜDockerなのか・・・? そもそもDockerとは何か・・・?   当社では様々なサー …