2017年やったことと2018年にやりたいこと


いつか書こうと思っているうちに気づけばもう1月も終わりですね。 さすがに1月中には書きたいと思ってこうして書いてます。 なかなか筆が進まなかった理由は、去年も今年の抱負的なことを書いたんだけど全くその通りに過ごせなかったからです。 なので2017年については振り返りというかやったことを纏める形にします。

2017年やったこと

コミュニティ活動

Xamarinもくもく会を6回開催しました。

当時は仕事でXamarinを使うことになりそうだったので自分の勉強もかねて会社の先輩と開催しました。 6月~12月で6回なので結構なペースで開催してますね。 でも最後のほうはXamarinをもくもくしている人はいなくて自由にその時自分たちがやりたいことをもくもくしてる感じでした。 名前は変えても良いかもなー。

アウトプット

Qiita投稿4件

全部Xamarin関係で最後の投稿が8月でした。 8月まではXamarin触ってたみたいです。 そのあと仕事でJavaのプロジェクトへ2018年から異動することが決定しJavaを勉強しだすことになります。

ブログ投稿64件

結構書いてるように見えますが9割くらいはWrite Code Every Dayの記録で中身のないものです。

Write Code Every Day 連続99日

途中から中身のない記事を書くのもなーと重い毎日ブログに記録するのはやめましたがWrite Code Every Day自体は続けていて、久しぶりカウントしたらなんと昨日(1/30)時点で99日連続!! とりあえず目標にしていた連続100日まであと1日でした。 言語は主にJavaで後述するWebサービスを書いてました。 仕事ではマネジメントばかりでめっきりコードを書く機会が減りましたが、Write Code Every Dayのおかげ日々技術の筋トレができたと思います。 速く走るよりも長く走ったほうが遠くへ行ける。と誰かが言ってたような気がします。少しずつでも毎日続けて遠くへ行こうと思います。

プロダクト

Webサービスを1つリリース(できず?)

もくもく会を一緒に開催していた会社の先輩と一緒にクラウドワークス経由で受注した仕事ではありますがWebサービスを開発していて2017年の年末に「いったん」作り終えました。「いったん」としたのはお客さんの確認待ちやドメイン取得待ちなどがあり本番稼働していないからです。

2017年やったことはこんな感じです。

2018年やりたいこと

絶対やりたい

Podcastサービスをリリース

毎年言ってる気がするやつです。 今年こそはPodcastサービスをリリースします。 いままでAndroidやらXamarinやらフラフラしてましたが今年はフラフラしません! まずは去年のWrite Code Every Dayで勉強したJava(Spring Boot)でWeb版を1Qでリリースします。その次、iOS版をリリースします。

英語

英語を本格的に勉強します。 来年の1月までにTOEIC600点を目指します。 (2017年1月に受けたときは300点台だった。) まずはDuo3.0を暗記。

できればやりたいなぁ

AWS系の資格取得

異動するプロジェクトの主要技術がJava以外にAWSもあるのでAWS系の資格を取りたいなぁ。

プチフリーランス

仕事以外の収入の柱を作りたいとはずっと思っていてその第一歩としてクラウドソーシングサービスを利用してお小遣い稼ぎをしたい。

2018年も頑張っていきます。

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で作ってたアプリの環境構築が簡単にできるようにしてみよう。