Mavenプロジェクトを用いてAPP ENGINEにアプリをデプロイする


この記事は [ウェブクルー Advent Calendar 2017](https://qiita.com/advent-calendar/2017/webcrew)の13日目の記事です。
昨日は@isgrさんの「[スマホ向けにOpenVPNを社内で導入したお話](https://qiita.com/isgr/items/0a6ae3d1f1f24ca7fda4)」でした。

#はじめに
皆さんこんにちは、ウェブクルー2017新卒の@kouchanne です。
13日目は @kouchanne  がつとめます！！
新卒研修で構成・設計したアプリをAPP ENGINEで動かしました。
APP ENGINEへデプロイする手順はノウハウがあまり無く、かなり手探りで苦戦したのでこの場を借りて共有させていただきます。


#概要
- Mavenプロジェクトで作成したJavaプロジェクトをAPPENGINEへデプロイする。
- Eclipseでやる場合はAppEngineのEclipseプラグインがありますがあえてMavenでデプロイしてます。
- 今回はMavenプロジェクトをEclipseで作成してそれをデプロイするまでの手順を紹介します。
- やり方は複数あると思いますが、自分が実際にデプロイ出来た手順を紹介します。

#前提条件
- GCPプロジェクトは作成済み（カード情報の登録とかを済ませてある状態）
- ローカル環境にMavenがインストールしてある(Eclipseをフルパッケージでインストールした場合デフォルトで入っている)

#APP ENGINEの設定
初めにコンソール上でアプリの設定をしていきます。

1. [Google Cloud Console](https://console.cloud.google.com/) からAPPENGINEのアプリを新規作成
 * 今回はJavaをデプロイするのでJavaを選択する
![appengine.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/2f41aa32-bb5a-fb96-7572-a8c33881777e.png)
1. アプリをデプロイするリージョンを選択する
  * ※ここで選択したリージョンは変更が出来ないので注意が必要
![リージョン選択.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/b3a9c9f5-c255-b198-f3ed-729fdd2f55fd.png)
1. 次にチュートリアルが出てきますがやってもやらなくても大丈夫です。
<br>
<br>
<strong>これでコンソール側の設定は完了です。</strong>

# Mavenプロジェクトの作成
続いてはローカル上でMavenプロジェクトを作成していきます。

1. 新規プロジェクトの作成
    * Eclipseのメニューバーから `ファイル⇒新規⇒プロジェクト⇒Maven⇒Mavenプロジェクト` を選択し次へ進む
   <br>
![Mavenプロジェクト作成.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/184b6912-bc98-bd23-e93a-79bed23728f3.png)

1. アーティファクトIDの設定
    * 今回はWebアプリを作成するので `maven-archetype-webapp` を選択します
![アーティファクトID.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/ea6673ba-6e59-398a-c604-dd1d57041892.png)
1. プロジェクトのプロパティ設定
    * ここはお好きな感じで設定します。 アーティファクトIDがプロジェクト名になる形です。
![プロファイル.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/a543106e-c482-b7d7-9032-7fca25c6e962.png)
<br>
<br>
<strong>Mavenプロジェクトが完成しました。</strong>

#Mavenプロジェクトの設定
プロジェクトの作成が完了したので、プロジェクトの設定をしていきます。

1. まずは`pom.xml`にAPPENGINEへデプロイするためのプラグインを追加します。
    * `<build>`タグの間に下記のプラグインを追加します。
   
    ```xml:pom.xml
    <plugin>
       <groupId>com.google.appengine</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>1.9.54</version>
    </plugin>
    ```
※この時[version](http://mvnrepository.com/artifact/com.google.appengine/appengine-maven-plugin)は最適なものを選択する

1. 続いてAPPENGINEの設定ファイルをWEB-INFへ追加していきます。
    APPENGINEでは設定ファイルをxmlに追加することで追加の設定ができます。
    ここではアプリケーションIDなどを設定する[appengine-web.xml](https://cloud.google.com/appengine/docs/standard/java/config/appref?hl=ja)を設定してきます。
    * プロジェクトの`scr⇒main⇒webapp⇒WEB-INF`に `appengine-web.xml` というファイルを新規作成
    ![ディレクトリ.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/fb4fd25a-d814-44f4-7291-ecbb733f4d42.png)

1. 作成した`appengine-web.xml`に設定を追加していきます。
    * 【プロジェクトID】は[Google Cloud Console](https://console.cloud.google.com/)で作成したプロジェクトのIDを指定します。
    *  `<module>`には任意でサービス名をつけます。　省略した場合defaultで作成されます。
    *  `<version>`はデプロイする時のversionを指定します。
    
     ```xml:appengine-web.ml
       <?xml version="1.0" encoding="utf-8"?>
      <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
        <application>【プロジェクトID】</application>
        <module>【サービス名】</module>
  　    <version>one</version>
        <threadsafe>true</threadsafe>
      </appengine-web-app>
```
他にも[設定できる項目](https://cloud.google.com/appengine/docs/standard/java/config/appref?hl=ja)が色々ありますがとりあえずアプリをデプロイできます。
<strong>これでデプロイするための準備は揃いました！！！</strong>

#アプリをデプロイする
さて、いよいよアプリをデプロイしていきます。
手順は簡単、mavenにはビルドのゴールを設定することができるのですが、ゴールに`appengine:update`を指定してあげればデプロイできます。

1. 初めに新規の実行の構成を作成します。
    * Eclipseのプロジェクトを右クリック`実行⇒実行の構成`
    * Mavenビルドを右クリックして `新規`　でプロジェクトを新規作成します
    * 基底ディレクトリーに`${project_loc:【プロジェクト名】}`
    * ここでゴールに `appengine:update`を指定します。
        * 私は一つ一つやるのがめんどくさいので `clean`と`install`も一緒に指定してます。
    * 今回はとりあえずデプロイなのでテストはスキップしても大丈夫です。
  ![実行の構成.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/2fcf644d-4f3d-8bd3-c18f-a01a81705df6.png)

1. 実行！！！
    * 実行するとデプロイが始まります。
    * `BUILD SUCCESS`なのでデプロイ完了です。  
    ![サクセス.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/d16346fb-a5d1-0eb3-7f64-14cb569572b0.png)
 * <strong>※注意　このときAPP ENGINEのアプリケーションを無効にしているとエラーになります。</strong>(私はこれで１時間位ハマりました…)
 ![アプリ無効.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/b5bf0174-0f30-4159-c190-fc3a9ee77811.png)

#終了
これでアプリをデプロイすることが出来たので、[Google Cloud Console](https://console.cloud.google.com/)にアプリが上がっていることを確認します。
![完了.PNG](https://qiita-image-store.s3.amazonaws.com/0/206268/0477b39c-329f-caa9-dc19-ce3a0187c4ee.png)

これで無事アプリをデプロイすることが出来ました。
やったぜ！

#まとめ
今回はAPP ENGINEにとりあえずアプリをデプロイするところを紹介しました。

APP ENGINEには今回紹介していない`cron.xml`やJavaの`Logger`を使ってGCPのログに吐き出すなど便利な機能がいっぱいあるので[公式ドキュメント](https://cloud.google.com/appengine/docs/standard/java/?hl=ja)を見て試して見てください。

今回手探りでやった部分がありましたが、簡単にアプリを公開することができました。

明日は @wc-kobayashiT さんです。よろしくお願いします！

#最後に
ウェブクルーでは一緒に働いていただける方を随時募集しております。
お気軽にエントリーくださいませ。

[開発エンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000005)
[フロントエンドエンジニアの募集](http://www.webcrew.co.jp/recruit/creative.html)
[データベースエンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000023)