SpringBoot+MySQLのWebアプリをElasticbeanstalkでデプロイする手順を雑に記録

hackbegin.hatenablog.com

で作ったアプリをElasticBeanstalkでデプロイします。

 

・ElasticBeanstalkの管理画面から「新しいアプリケーションの作成」をクリック。

・「アプリケーション名」任意の名前を入力。ここでは「DemoAppEB」と入力。

・環境枠は「ウェブサーバー環境」を選択。

・プラットフォームは「Tomcat」を選択。

・アプリケーションコードは「コードのアップロード」を選択し、DemoAppのwarをアップロード。

・「さらにオプションを設定」をクリック。

・「セキュリティ」からキーを登録。

・「データベース」からMySQLを選択。保持期間は「削除」を選択。

・「環境の作成」をクリック。

・環境の作成が終わったらMySQLにdemo_mstを作成する。

・ElasticBeanstalkのダッシュボードに表示されているURLを開いて、demo_mstのtextに登録した値が表示されていることを確認できればOK。

Spring Bootで作ったアプリのDB接続先を開発環境と本番環境で切り替える方法

application.yaml、application-dev.yaml、application-production.yamlを用意。

-devが開発環境で、-productionが本番環境。 それぞれのファイルにそれぞれの環境に沿った内容を記載。

application.yamlは以下のように記載する。

こうすることでデフォルトは-producionを見るようになる。

spring:
profiles:
active: production

Eclipseの「デバッグの構成」から上書きプロパティーでプロパティー「spring.profiles.active」、値「dev」を設定。 こうすることでEclipseからデバッグモードで起動した場合、-devの内容を見るようになる

Gradle+SpringBoot+MySQLの構成でWebアプリを作成するときの下準備を雑に記録

Gradle+SpringBoot+MySQLでWebアプリを作る際、最初の手順がいつも忘れがちなので備忘録として記録する。

使うIDEEclipse

1.プロジェクトの作成

・[ファイル]→[新規]→[Gradleプロジェクト]で「新規 Gradleプロジェクト」を開く

・[プロジェクト名]は任意の名前を入力。ここではDemoAppとする。「完了」をクリック。 f:id:y_shimabukuro:20180107130852p:plain

2.build.gradleの編集 ポイントは、あとからElasticbeanstalkでwarをデプロイしたいのでwarを作成するようにしたところ。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.6.RELEASE'
    }
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'war'

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.springframework.boot:spring-boot-devtools'
    compile 'org.springframework.boot:spring-boot-starter-web'
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'
    compile 'org.springframework.boot:spring-boot-starter-thymeleaf'

    compile group: 'mysql', name: 'mysql-connector-java', version: '6.0.6'
    compile group: 'commons-beanutils', name: 'commons-beanutils', version: '1.9.3'
    compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.3'
    compileOnly 'org.projectlombok:lombok:1.16.18'
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'

}

configurations {
    providedRuntime
}

3.Applicationクラスの作成 ・「src/main/java」の中に任意のパッケージを作成。ここでは「demoApp」で作成。 ・「demoApp」の中にDemoApplication.javaを作成。 ・クラスに「@SpringBootApplication」を指定。 ・起動時に設定ファイルを読み込ませるため「SpringBootServletInitializer」を継承し、「SpringApplicationBuilder」をオーバーライド。 ・mainメソッドでSpringApplication.runを実行。

package demoApp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(DemoApplication.class);
    }
}

5.EntityクラスとRepositoryクラスを作成 ・接続先DBの扱いたいテーブルに対応するEntityクラスとRepositoryクラスを作成。 ・ここではdemo_mstというテーブルに対応させる「DemoMstEntity」「DemoMstEntityPK」「DemoRepository」を作成。

6.コントローラーを作成 ・「demoApp」パッケージの中にWebController.javaを作成。 ・demo_mstからデータを取得して適当に表示するような処理を実装。

@RestController
public class WebController {

    @Autowired
    DemoRepository testRep;

    @RequestMapping("/")
    public String hello() {

        List<DemoMstEntity> demoMstList = testRep.findAll();

        DemoMstEntity dm = new DemoMstEntity();
        if (demoMstList != null && demoMstList.size() > 0) {
            dm = demoMstList.get(0);

            return "DBから取得したデータは " + dm.getText() + " です";
        } else {

            return ”DBから取得したデータはありません。”
        }
    }
}

7.application.ymlにDB接続情報を記載 ・「src/main/resource」の中にapplication.ymlを作成し、MySQL接続情報を記載

8.デバッグモードで起動し、demo_mstのtextカラムに登録されているデータが表示されていることを確認。

1つのVPCにWebサーバーとDBサーバーを別サブネットで作成する 後編

AWSで作った環境に実際にWordPressを入れていく。

 

1.環境がちゃんと作れたか確認

・WebServer用EC2(mywebserver)の確認

 ・sshでログインできることを確認

  ・Tera Termのホストにmywebserverの「IPv4 パブリック IP」に表示されているIPを入力し、「OK」をクリック

  ・「ユーザー名」に「ec2-user」を入力

  ・「RSA/DSA/ECDSA/ED25519鍵を使う」をチェックし、mywebserverインスタンス作成時に保存した秘密鍵を選択

  ・「OK」をクリック

 ・インターネットに到達可能か確認する

  ・「ping www.google.com」を実行し、pingが応答を返していることを確認。

 ・HTTP通信できるかどうかを確認

  ・「curl www.google.com」を実行し、コンテンツが取得できていることを確認

 ・パブリックIPアドレスを確認

  ・「curl 169.254.169.254/latest/meta-data/public-ipv4」を実行し、帰ってきたIPと「IPv4 パブリック IP」のIPが一致していることを確認

 

・DBServer用EC2(mydbserver)の確認

 ・今回の場合、「mywebserver」が踏み台サーバーとなって「mydbserver」にログインすることになるので、「mywebserver」にTera Termの[SSH SCP]を使ってキーペアファイルを配置する

  ・[SSH SCP] の「From」にはキーペアファイルを、「To」には「~/.ssh」を指定し「Send」をクリック

  ・「chmod 600 ~/.ssh/[キーペアファイル名].pem」でパーミッションを変更

 ・mywebserverからmydbserverにログインする

  ・「ssh ec2-user@10.0.1.10 -i ~/.ssh/[キーペアファイル名].pem」でログイン

  ・コマンドプロンプトの左側にmydbserverのインスタンスのIP(10.0.1.10)が表示されていればOK

 

2.mydbserverにmysqlをインストール

・「sudo yum install -y mysql-server」を実行

・「sudo service mysqld start」でMySQLサーバーを起動

・「mysql -u root -p」でMySQLをrootユーザーで起動

・「create user 'wordpress' IDENTIFIED BY 'mypassword';」でユーザーを作成

・「create database wordpressdb;」でデータベースを作成

・「grant all privileges on wordpressdb.* to 'wordpress';」でユーザー(wordpress)に全権限を与える

・「FLUSH PRIVILEGES;」でフラッシュして設定を有効にする

MySQLの設定は終わりなので「exit」でログアウトする

・「sudo chkconfig mysqld on」でEC2インスタンスが起動したときに、MySQLも自動的に起動するようにする

・「exit」でmywebserverに戻る

 

3.mywebserverにWordPressをインストール

・「sudo yum install -y httpd」でApatchをインストール

・「cd ~」「mkdir wordpress」「cd wordpress」で適当な作業用ディレクトリを作成

・「wget https://wordpress.org/latest.tar.gz」でソースコードを入手

・「tar xzvf latest.tar.gz」で展開

・初期設定する

 ・「cd wordpress」「cp wp-config-sample.php wp-config.php」で初期設定ファイルの雛型をコピーして実ファイルを作成

 ・wp-config.phpを編集する

  ・database_name_here → wordpressdb

  ・username_here → wordpress

  ・password_here → mypassword

  ・localhost → 10.0.1.10

  ・AUTH_KEY~NONCE_SALT → 「https://api.wordpress.org/secret-key/1.1/salt」に表示された内容で差し替える。

・「sudo mv * /var/www/html/」でApacheのドキュメントルートに移動させる 

・「sudo yum -y install php」でphpをインストール

 ・「sudo yum -y install php-mysql」でMySQLに接続するためのPHP用のDBライブラリをインストール

・「sudo service httpd restart」でApatchを再起動

・「http://[パブリックIPアドレス]/」にアクセスするとWordPressの初期設定画面が開きます

1つのVPCにWebサーバーとDBサーバーを別サブネットで作成する 前編

f:id:y_shimabukuro:20171231214826j:plain

こんな感じのやつ。

Webサーバーにapatchを入れて、DBサーバーにMySQLを入れてWordPressを動かしてみる。

 

前編は主にAWSでの環境構築、後編で実際にWordPressを入れていく手順を書く。

 

1.VPCの作成

アベイラビリティゾーンは「東京(ap-northeast-1a)」

・マネジメントコンソールから「 VPC」を選択し、「VPCダッシュボード」を開く

・「VPCの作成」をクリック

・名前は「myvpc」、IPv4 CIDRブロックは「10.0.0.0/16」

・「はい、作成する」をクリック

 

2.Publicサブネットの作成

・「VPCダッシュボード」から「サブネット」をクリック

・「サブネットの作成」をクリック

・名前は「mysubnet」、VPCは1で作成した「myvpc」を選択

アベイラビリティゾーンはVPCと同じ「ap-northeast-1a」を選択

IPv4 CIDRブロックは「10.0.0.0/24」

・「はい、作成する」をクリック

・「サブネットのアクション」から「自動割り当てIP設定の変更」をクリック

・「パブリックIPv4アドレスの自動割り当てを有効にする」にチェック

・「保存」をクリック

 

3.インターネットゲートウェイの作成

・「VPCダッシュボード」から「インターネットゲートウェイ」をクリック

・「インターネットゲートウェイの作成」をクリック

・名前は「myig」

・「はい、作成する」をクリック

・「VPCにアタッチ」をクリック

・1で作成した「myvpc」を選択

 

4.ルートテーブルの作成

・「VPCダッシュボード」から「ルートテーブル」をクリック

・「ルートテーブルの作成」をクリック

・名前は「inettable」

VPCは1で作成した「myvpc」を選択

・「はい、作成する」をクリック

・「ルート」タブを開く

・「編集」をクリック、「別ルートを追加」をクリック

・「送信先」に「0.0.0.0/0」を指定、「ターゲット」に3で作成した「myig」を指定

・「保存」をクリック

 

5.Publicサブネットのルートテーブルを変更

・「VPCダッシュボード」から「サブネット」をクリック

 ・2で作成したサブネットを選択

・「ルートテーブルタブ」を開き、「編集」をクリック

・変更先に4で作成した「inettable」を選択し「保存」をクリック

 

6.Privateサブネットの作成

・「VPCダッシュボード」から「サブネット」をクリック

・「サブネットの作成」をクリック

・名前は「privatesubet」、VPCは1で作成した「myvpc」を選択

アベイラビリティゾーンはVPCと同じ「ap-northeast-1a」を選択

IPv4 CIDRブロックは「10.0.1.0/24」

・「はい、作成する」をクリック

 

7.NATゲートウェイの作成

・「VPCダッシュボード」から「NATゲートウェイ」をクリック

・「NATゲートウェイの作成」をクリック

・「サブネット」に6で作成した「mysubnet」を選択

・「新しいEIPの作成」をクリック

・「NATゲートウェイの作成」をクリック

・「ルートテーブルの編集」をクリック

・「ルートテーブルの作成」をクリック

・名前は「nattable」

VPCは1で作成した「myvpc」を選択

・「はい、作成する」をクリック

・「ルート」タブを開き、「編集」ボタンをクリック、「別のルートを追加」をクリック

・「送信先」に「0.0.0.0/0」、「ターゲット」に7で作成した「nat-xxxxx」を選択

・「保存」をクリック

 

8.Privateサブネットのルートテーブルを変更

・「VPCダッシュボード」から「サブネット」をクリック

・6で作成したサブネットを選択

・「ルートテーブルタブ」を開き、「編集」をクリック

・変更先に4で作成した「nattable」を選択し「保存」をクリック

 

9.PublicサブネットにWebサーバーとなるEC2インスタンスを配置

・マネジメントコンソールから「EC2」を選択し、「EC2ダッシュボード」を開く

・「インスタンス」をクリック

・「インスタンスの作成」をクリック

・ステップ1~2は無料枠を選択

・ステップ3.インスタンスの詳細の設定

 ・「ネットワーク」は1で作成した「myvpc」を選択

 ・「サブネット」は2で作成した「mysubnet」を選択

 ・「自動割り当てパブリックIP」は「サブネット設定を使用(有効)」を選択

 ・「次の手順:ストレージの追加」をクリック

・ステップ4はデフォルトのまま

・ステップ5.タグの追加

 ・「タグの追加」をクリック

 ・「キー」に「Name」、「値」に「mywebserver」を入力

 ・「次の手順:セキュリティグループの設定」をクリック

・ステップ6.セキュリティグループの設定

 ・「セキュリティグループの割り当て」は「新しいセキュリティグループを作成する」を選択

 ・「セキュリティグループ名」は「webserver」を入力

 ・「ルールの追加」をクリック

 ・「タイプ」は「HTTP」、「ソース」は「任意の場所」

 ・「ルールの追加」をクリック

 ・「タイプ」は「HTTPS」、「ソース」は「任意の場所」

 ・「確認と作成」をクリック

 ・「作成」をクリック

 ・キーペアは既存のがあれば既存のものを選択

 

10.PrivateサブネットにDBサーバーとなるEC2インスタンスを配置

・マネジメントコンソールから「EC2」を選択し、「EC2ダッシュボード」を開く

・「インスタンス」をクリック

・「インスタンスの作成」をクリック

・ステップ1~2は無料枠を選択

・ステップ3.インスタンスの詳細の設定

 ・「ネットワーク」は1で作成した「myvpc」を選択

 ・「サブネット」は2で作成した「privatesubnet」を選択

 ・「自動割り当てパブリックIP」は「サブネット設定を使用(無効)」を選択

 ・「ネットワークインターフェース」の「プライマリIP」に「10.0.1.10」を指定

 ・「次の手順:ストレージの追加」をクリック

・ステップ4はデフォルトのまま

・ステップ5.タグの追加

 ・「タグの追加」をクリック

 ・「キー」に「Name」、「値」に「mydbserver」を入力

 ・「次の手順:セキュリティグループの設定」をクリック

・ステップ6.セキュリティグループの設定

 ・「セキュリティグループの割り当て」は「既存のセキュリティグループを選択する」を選択

 ・「default」のセキュリティグループを選択

 ・「確認と作成」をクリック

 ・「作成」をクリック

 ・キーペアは既存のがあれば既存のものを選択

 

11.Publicサブネットにもdefaultのセキュリティーグループを設定

・マネジメントコンソールから「EC2」を選択し、「EC2ダッシュボード」を開く

・「インスタンス」をクリック

・9で作成したインスタンス「mywebserver」を選択

・右クリック、「ネットワーキング」、「セキュリティグループの変更」をクリック

・「default」のセキュリティグループを選択

・「セキュリティグループの割り当て」をクリック

【メモ】Amazon Web Services実践入門 第3章

仮想サーバの強化(EC2応用編)

 

・バックアップの作成

インスタンスの現在の状態をもとにAMIを作成することでインスタンスのバックアップが可能。

AMIはEBSも含めた状態でアーカイブするが、EBS単体でアーカイブすることが可能。

 

・スケールアップ

一読。

 

・ディスク容量の追加

一読。

 

・I/Oの高速化

プロビジョンドIOPSってIOPS(I/O per Second ディスクが1秒当たりに処理できるI/Oアクセスの数)をプロビジョニング(必要に応じてネットワークやコンピューターの設備などのリソースを提供できるよう予測し、準備しておくこと)するってことかな

 

・セキュリティの向上

 一読。

 

・管理の効率化

簡単に使えるけど自由度低いのがElastic Beanstalkで難しいけど自由度高いのがCloudFormationでその間にOpsWorksがいるって理解した。

とりあえずElastic Beanstalkでspring bootで作ってたアプリの環境構築が簡単にできるようにしてみよう。

 

【メモ】Amazon Web Services実践入門 第2章

仮想サーバの作成

 

・EBS(Elastic Block Store)とインスタンスストアの違い

EC2にはEBSとインストタンスストアの2種類のストレージがある。

EBSはタイプの種類があってそれぞれ特徴があるので用途に合わせて使う。

docs.aws.amazon.com

 

インスタンスストアはインスタンスが起動している間のみ利用できる。

なので消えてしまっては困るデータは置いてはいけない。

ただ、インスタンスと直接つながっているため、EBSより高いパフォーマンスが期待できる。計算時の一時ファイルなどを置くのに使うとよい。

インスタンスストアもEBSと同様にタイプの種類がある。

docs.aws.amazon.com

 

・EC2の起動

特にハマらなかった。

 

・アプリケーションのインストール

「Webアプリケーションの配置」でrailsをインストールするときコマンドそのまま実行したらrubyが古いよというエラーが出た。

ちなみに「ruby -v」でバージョンを確認すると2.0.0だった。

複数バージョンのrubyを入れるためにはrbenvというやつを使うらしい。

rbenvで最新のrubyも入れることにした。

この記事を参考にインストールした。

qiita.com

「5. ruby-build を インストール(clone)する」まで行ったらこの記事を参考にrubyの最新版をインストール。

mawatari.jp

 

それでもエラーになってしまった。

エラーメッセージに「Try running `yum install -y readline-devel` to fetch missing dependencies.」と書いてたので「sudo yum install -y readline-devel」した後にrubyをインストールするとちゃんと入った。

ここで「ruby -v」でバージョンを確認してみるとまだ「ruby 2.0.0p648 (2015-12-16)」だったので「ruby global 2.4.3」を実行。

そのあと「ruby -v」するとちゃんと「ruby 2.4.3p205 (2017-12-14 revision 61247)」に切り替わっていた。

そのあとrailsをインストールするとちゃんと入った。

rails -v」すると「5.1.4」だった。本では「4.2.4」だったのでだいぶ積読したんだなーと反省。

 

・EC2の停止/削除/再起動(マネジメントコンソール)

インスタンスを停止するとインスタンスが物理サーバー上からなくなる。再度起動することで停止前とは別のAWS上の物理サーバ上でインスタンスが起動する。

この特性を利用すれば、AWSの物理サーバの障害が発生した際に停止と再起動を行うことでインスタンスが動作するハードウェアが変更され、それにより復旧させることができる。停止と再起動の組みあわせとマネジメントコンソール上での再起動は動作が異なるので注意。

インスタンスに紐づかないEIPを持っていると課金されるので要注意。

 

AWS CLIによる操作

スキップ。本を一周読み終えたらCLIからの操作を試す。