AWS CodePipelineでspringbootアプリをECSへデプロイしてみた

オンプレサーバで稼働しているシステムをAWSへ移行したいという話があり、AWS環境でCI/CDがどう出来るか確認してみました。
構成としては、開発用端末のIDE(IntelliJ IDEA)でコミット、CodeCommitのリポジトリにプッシュしたら、Mavenビルドを開始してECRへコンテナをプッシュ、ECSへデプロイという流れです。

下記AWS環境を用意します。
・ECSの設定(クラスタ、サービス、タスク定義)
・ECRにリポジトリを作成、springbootのアプリなのでopenjdkのイメージをプッシュ
・CodeCommitにリポジトリ作成
・CodePipelineを設定

ググれば、いろいろAWSに関する情報はあるのですが、なかなかうまく出来ません。
で、いろいろやってみた結果、ビルド用にbuildspec.yml、デプロイ用にDockerfileをリポジトリの直下に置くとデプロイが成功しました。

すいません、情報の参照元が解らなくなってしまいました。。
mvn install 結構時間掛かりますね。。

AWSは数年前にアカウントを登録してちょこっとだけ遊んでみただけだったので、ちゃんとAWS環境を理解した上で整理してからじゃないと実利用には遠い感じです。。

カテゴリー: Java

特別展「顔真卿」を見てきた

 何年前からか、仕事でエクセルとかワードとかにドキュメントを書く時や簡単なツールの画面には、フォントをMeiryoUIにする事にしています。デフォルトだと大抵はゴシックとか、明朝になっていますが、あまり他の人に選択されないフォントを選択するだけで、多少なりとも目に付きやすいし、対して面白くも無い仕事の資料だとしても何らかのアクセントになるかと。

 今、上野の国立博物館で開催している特別展「顔真卿 王羲之を超えた名筆」を見てきました。開門前から並んでチケット購入後もさらに並び、計30分くらいしてやっと入館。内容的にも季節的にも、中国から来ている人がかなり多いようです。

 展示は、王羲之から今回の主役である顔真卿と同時代の書家、空海といった日本の三筆等から比較的新しい時代まで、かなりありますが混んでいてゆっくり見るという感じでは無かったです。特に今回の目玉である「祭姪文稿」は30分並んで10秒も見れません。。。書物自体は5メートルくらいでしょうか、顔真卿の書はそのほんの一箇所だけで、それ以外は後世の人の感想とかが書かれている箇所になっています。今でいうところのSNS的な感じです。

 展示の説明には、顔真卿の字は明朝体のベースになったと書いてますが、拓本の展示が多かったので、誰が書いたものでも違いがよく解りません。展示後半の比較的新しい時代の書に対する説明にも個性を重んじた顔真卿の影響があるとか、言われてみればそうかも知れないが、、の空耳アワーな気しかしないのは筆者が書に対して教養が無いからなのでしょうけど、個性的である事が影響を受けていると言わせる程の凄い存在感なのでしょう。ちょっと、こじつけ感がしないでもないですが。。

 良いとされるモノはみんな真似をするので、同じようなモノがどんどん増えていき、今の時代となっては違いがよくわからない、良いけど目立たないモノも沢山あります。今回の展示を見て、少しでも良いものにしたいとの意識からフォントを変えるようにしてたんだよな、と思い出しました。

 昔の資料が出てきて、一瞬でオレが書いたのじゃん、とか、他の人にも誰が書いたかという事が一目で解ってもらえたり、このフォントで書かれたドキュメントは解りやすい、よく書かれているねとか感じてもらえると嬉しいですね。

Redmine4のプラグイン開発環境を整備してみた

 独自プラグインが複数入った既存のRedmine2.5をそろそろアップデートしたいという事で、つい先月リリースされたredmine4へアップデートする方向になり、プラグインの改修を行う為にredmine4用の開発環境を使っているWin端末に整備してみました。
 元々Redmine2.5用にWindows7 + Aptana Studio 3(eclipse) の開発環境があり、まずはruby2.0→ruby2.5.3にします。rubyは普通にWindows用のインストーラーで入れましたがruby2.0が入っているので、原始的ですが、環境変数をC:¥Ruby25-x64¥binが先になるように変更してruby2.5を有効にしました。

 次に、AptanaStrudioにrails プロジェクトを作成し、ダウンロードしてきたRedmine4を突っ込み、AptanaStudioのコンソールから、Redmineのインストールを行います。

    $ gem install bundler
    Fetching: bundler-2.0.1.gem (100%)
    Successfully installed bundler-2.0.1
    Parsing documentation for bundler-2.0.1
    Installing ri documentation for bundler-2.0.1
    Done installing documentation for bundler after 9 seconds
    1 gem installed

    $ bundle install –path vendor/bundle
    Fetching gem metadata from https://rubygems.org/……….
    Fetching gem metadata from https://rubygems.org/.
    Resolving dependencies….
    Fetching rake 12.3.2
    中略
    MSYS2 could not be found. Please run ‘ridk install’
    or download and install MSYS2 manually from https://msys2.github.io/

で、起動してみます。

    $ rails -s
    Could not find gem ‘rails (= 5.2.2) x64-mingw32’ in any of the gem sources liste
    Run bundle install to install missing gems

動きません。。。railsがインストール出来ていないようです。

前に出ていた、MSYS2 could not be found. という所で、MSYS2なるものを入れてビルドする必要があるようです。

DOS窓からridk installと打ち、1を選択するとインストーラー画面が出てインストール終了です。

で、railsをインストールします。

    C:¥Users¥maki>gem install rails
    Temporarily enhancing PATH for MSYS/MINGW…
    Building native extensions. This could take a while…
    ERROR: Error installing rails:
    ERROR: Failed to build gem native extension. current directory: C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/nio4r-2.3.1/ext/nio4r
    C:/Ruby25-x64/bin/ruby.exe -r ./siteconf20190117-14000-1ru4f4e.rb extconf.rb

    current directory: C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/nio4r-2.3.1/ext/nio4r
    make “DESTDIR=” clean
    ‘make’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。
    current directory: C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/nio4r-2.3.1/ext/nio4r
    make “DESTDIR=”
    ‘make’ は、内部コマンドまたは外部コマンド、
    操作可能なプログラムまたはバッチ ファイルとして認識されていません。

    make failed, exit code 1

    Gem files will remain installed in C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/nio4r-
    2.3.1 for inspection.
    Results logged to C:/Ruby25-x64/lib/ruby/gems/2.5.0/extensions/x64-mingw32/2.5.0
    /nio4r-2.3.1/gem_make.out


makeが無い??MSYS2に標準では入っていないようです。。

で、こちらを参考にさせて頂き、MSYS2環境に下記のコマンドを打っていきます。

    $ pacman -Su

    $ pacman -Su

    $ pacman -S mingw-w64-x86_64-gcc

ビルド環境は出来たようなので、AptanaStudioの該当プロジェクト上のターミナルよりrailsのみインストールしてみます。

    $ gem install rails -v 5.2.2
    Temporarily enhancing PATH for MSYS/MINGW…
    Building native extensions. This could take a while…
    Successfully installed nio4r-2.3.1
    Fetching: websocket-extensions-0.1.3.gem (100%)
    Successfully installed websocket-extensions-0.1.3
    Fetching: websocket-driver-0.7.0.gem (100%)
    Building native extensions. This could take a while…
    中略
    Installing ri documentation for railties-5.2.2
    Parsing documentation for sprockets-3.7.2
    Installing ri documentation for sprockets-3.7.2
    Parsing documentation for sprockets-rails-3.2.1
    Installing ri documentation for sprockets-rails-3.2.1
    Parsing documentation for rails-5.2.2
    Installing ri documentation for rails-5.2.2
    Done installing documentation for nio4r, websocket-extensions, websocket-driver,

入ったような気がするが。。。
rails s
まだ動かない。。。

    $ bundle update
    Fetching gem metadata from https://rubygems.org/……….
    Fetching gem metadata from https://rubygems.org/.
    Resolving dependencies…..
    Using rake 12.3.2
    Using concurrent-ruby 1.1.4
    中略
    Fetching rmagick 2.16.0
    Installing rmagick 2.16.0 with native extensions
    Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory:
    C:/work/Dev/workspace/redmine4/vendor/bundle/ruby/2.5.0/gems/rmagick-2.16.0/ext/
    C:/Ruby25-x64/bin/ruby.exe -r ./siteconf20190117-11036-fkmn5g.rb extconf.rb
    *** extconf.rb failed ***
    Could not create Makefile due to some reason, probably lack of necessary
    libraries and/or headers. Check the mkmf.log file for more details. You may
    need configuration options.

rmagickのインストールでエラーが出ているようなので、除外してインストールし直し

    $ bundle install –without rmagick –path vendor/bundle
    Fetching gem metadata from https://rubygems.org/……….
    Fetching gem metadata from https://rubygems.org/.
    Resolving dependencies…..
    Using rake 12.3.2
    中略
    Bundle complete! 27 Gemfile dependencies, 74 gems now installed.
    Gems in the groups rmagick and rmagik were not installed.
    Bundled gems are installed into ./vendor/bundle
    Post-install message from yard:
    ——————————————————————————–
    As of YARD v0.9.2:

    RubyGems “–document=yri,yard” hooks are now supported. You can auto-configure
    YARD to automatically build the yri index for installed gems by typing:

    $ yard config –gem-install-yri

    See yard config --help for more information on RubyGems install hooks.

    You can also add the following to your .gemspec to have YARD document your gem
    on install:

    spec.metadata[“yard.run”] = “yri” # use “yard” to build full HTML docs.

    ——————————————————————————–

やっと動きました!
DBのマイグレーションはしなかったけど、とりあえず動いたので、これから少しずつプラグインを導入しながら、もぐら叩きが始まります。。

手段は一人で歩いていく

 1年ちょっと前から、筆者は毎週2回早朝にジョギングする事を日課にしていますが、元々は運動不足解消が目的でした。それが、ある程度続いた後に、目的から明確な目標になり、その目標も都度変わってましたが、現在の週2回という目標に基づいた日課、週課?になってます。

 慣れていくにつれて何キロ走るとか、何キロまで歩かないで走るとか、元旦なら近所の神社を何箇所初詣するとか、毎回少し違った目標も絡めながら楽しんでますが、運動不足解消という目的に対しての走るという手段は変わりません。でも、システム開発の仕事をしていると、この手段がいつの間にか目的に変わっている事をよく見かけます。

 何らかのシステムを構築するという事は、何らかのシステムで実現したい目的があってこそなのですが、目的を達成する為の一手段でしかないシステム構築自体が目的化するという、あるある話で、その時の立場によっては、あれ?何かおかしいよ?と感じても主張しずらいんですよね。特にシステム方式が殆ど決まっているようなフェーズから参加するとそれを覆すのは並大抵の事ではありません。一度、偉い人にプレゼンした形は変わりません。何故なら、既にプレゼンした形を実現するのが目的になってしまっているので。。

手段が目的に変わってしまうのは、目的が曖昧だったり、そもそも実現性が無かったり、時間を経て目的が陳腐化していたりと、色々背景が違いますが、手段が一人歩きして本来の目的からずれていると気がついたら早めに何らかの対処をしたいものですね。

ROBOCOPY再び

 Windows端末にインストールする形で提供しているアプリについて、変更都度インストールしなきゃいけないのが面倒という話があり、ファイルサーバからリソースをコピーする形にしようと思います。
 対象のアプリは下記のようなフォルダ構成で、基本的に初期インストール以外はファイルを配置するのみです。

アプリルートフォルダ¥src
アプリルートフォルダ¥img
アプリルートフォルダ¥data
アプリルートフォルダ¥log

 上記フォルダのうち、logとdataのフォルダはコピー対象外となります。
 また、アプリ変更時は数人に先行して使ってもらって評価した後に他の利用者へ配布するという運用なので、端末側に新しいリソースがある場合はコピーしないようにします。

結果こうなりました。

robocopy ファイルサーバの所定フォルダ アプリルートフォルダ /E /XO /XD log data /NDL /NFL /NJH /R:2 /W:3

前回使ったrobocopyコマンドを参考に、/XD でlogとdataのフォルダを対象外にし、/E /XO /XD で端末側が新しければコピーしないという形にします。

Swagger + SpringBoot で APIサイトを作ってみる

既存システムのDBへアクセスしてデータを参照するようなAPIを、って事で、
SwaggerでAPIを定義し、Swaggerから自動生成したソースを使って実装してみました。
なお、今回対象としているのは参照系がメインでRESTって雰囲気ではありません。
対象が既存システムのDBなので。。

とりあえず、ざっくりとした要求と応答の仕様を整理し、Swagger Editorにyamlを書いてみます。

なお、Swagger Editorは、別件で使っていた端末内のxampp/htdocsにGitHubからダウンロードしたZIPを解凍して使ってます。
ある程度、定義を書いた後、Swagger EditorからGenerate ServerでSpringのサーバソースを出力してみます。

自動生成されたJavaソースはこんな構成です。

Controllerとレスポンスエンティティのモデルが揃ってます。全体的なソース構成は、コントローラ層、サービス層、データアクセス層という3構成になりますかね。
コントローラ層は概ねSwaggerで生成したので、データアクセス層も自動生成しようと、Doma2を使ってみます。
doma-gen-build.xmlに接続先DB情報と出力先ソースの設定等を記述し、こちらもGenerate!

結果、ソースを手書きする必要があるのは、

・サービス層全体

・Swaggerで自動生成されたSpringBootApplicationクラスのComponentScanにサービス層のパッケージを追記
  @ComponentScan(basePackages = { “io.swagger”, “io.swagger.api”,”jp.esoro.api” })

・Swaggerで自動生成されたControllerにServiceをコールする箇所を追記

・DAOインターフェースに下記アノテーションを追記
@ConfigAutowireable
@Repository

・自動生成不可能なSQL文の作成し、それに合わせてDAOにメソッド追加

といったところで、とりあえずの動作確認が出来ました。

ただ、実用するには認証やページング等も必要なので、こんな単純な話にはなりませんし、APIの仕様をちゃんと整理してからSwaggerでソースを生成して着手しないと後が面倒ですね。

カテゴリー: Java

法人登記を変更してきた

 法人3期目が終了し、今まで決算申告を自力でやって来ましたが、3期目になると消費税の申告が必要になるのと、自己流でこれ以上やってもあまり得るモノが無さそうな気がして来たところに、今年に入って引っ越しした先のすぐ近所に税理士事務所があったのでお願いする事にしました。Tax Cafeさんです。
 弥生会計の仕訳をしたデータをお渡しして、その後、色々指摘頂いたところを修正、後日事務所に伺って納付書を書いてもらい、あとは申告しておきますので、納付の方をお願いしますと。こちらは銀行で各種税金を納付して終了。だいぶ楽になりました。
 その時に税理士の方に見せた法人登記の代表者住所が引っ越し前の住所になっていたのに気が付き、法人登記を変更しないといけないなあ、と、全く気乗りはしませんが平日時間が取れたのでやる事にしました。
 変更だけなんで近くでも出来るのかなと、最寄りとなる柏法務局に電話すると、やはり支局では出来ず、千葉地方法務局でしか扱っていないとのこと。
 で、千葉地方法務局に電話すると、相談予約した方がよいと言われ、空いてる時間を予約し、持ち物を聞くと印鑑と変更を証明できるものがあればとの事。
 法務局のHPに
 1-5 株式会社役員変更登記申請書(住所移転)
というのがあったので、その記載例を見るとオンラインがどうたらで全く理解出来ず、解る範囲を記入し印刷、念の為過去取得した法人登記を持参し、変更の証明となると住民票でも用意しとけばいいのかなと法務局行きがてら住民票の写しを取りに行って、3年ぶりにはるばる千葉みなとへ。

 予約時間になって初老の法務局員に途中まで書いた申請書を見せ、さらに住民票や法人登記を見せ局員の方が言った通り加筆したり代表印を捺印したりで終了。法務局HP記載例のオンライン何たらは全く必要なかったです。1万円の収入印紙を貼って窓口へとの事で、これで1万ですかと局員の方も申し訳なさそうにお願いしますと、また10年くらい後に登記申請が必要ですので、と何のことか解らず聞いたら、この事でした。ネットで完結出来ないのか聞いたところ、できるが月々2000円程度かかるとの事。郵送も受付ていますと言ってましたが、法務局のHPを見直しして貰わないと素人には出来ない気がします。また、申し訳無さそうに10年後は制度も変わっているかも知れませんので、と相談終了。法務局2階で収入印紙を買って貼り付けて1階に戻り申請を提出、トータル10分程度で終了。登記完了は22日と書いてました。

 なんか、、とても無駄な一日を過ごした気がしてなりません。ちょっとの変更がこんなにメンドくさくて、完了は2週間後、しかも変更費用が普通じゃありえない金額。10年後くらいには、より効率的で納得できる仕組みに変わっている事を願って止みません。

厚生年金に加入してきた

 昨年の事ですが、所轄の年金事務所に行って厚生年金加入の手続をしようと
 
 ・新規適用届
 ・被保険者資格取得届

を持って行ったところ、会社の登記簿謄本が必要との事で一旦撤収、一人法人だし、、正直加入したい訳でも無いし、、、そんなに急ぐ必要も無いかな?と放置状態になっていました。。
 その後、年金事務所から数回通知が届いてましたが、今度は「来所通知」という書類が届き、8月●日●時に来なさいとの事。ちょっと放置し過ぎたと、指定の日時は都合が付かないので、電話して日時を変更した上で、年金事務所へ行って来ました。

 既に、申請に必要な書類も、銀行でハンコを押してもらった口座引落の書類も用意出来ていたので、担当の方がなんども書類を指差し確認しつつ、説明しつつでスムーズに手続終了。
 よくよく見ると、厚生年金は兎も角、健康保険については、国民健康保険と比べて少し安くなってました。
その足で、国民年金のカード引落を停止する必要があるとの事で、同じ事務所内の年金窓口の方で「国民年金保険料クレジットカード納付辞退申出書」を提出して手続終了。

 それから2週間くらいした後、健康保険証と「適用通知書」って書類が届きました。と、その数日後、今度は「国民年金保険料納付案内書」が到着。あれ?厚生年金加入で自動的に国民年金は終了しているのでは?

 さらに後日、国民健康保険証を返却しに市役所へ行き、返却と同時に「国民健康保険資格喪失届」を記入し提出、その場で、国民年金の納付書を見てもらったところ、どうも加入手続による脱退と請求とのタイミングズレみたいなことらしく、納付書は廃棄してくださいとの事。

 その1週間くらいのち、「健康保険・厚生年金保険資格取得確認および標準報酬決定通知書」という書類が到着。加入時に提出している「被保険者資格取得届」に書いた報酬月額から、保険料額表に合わせた標準報酬月額が書いてあるのですが、保険料額表上で1等級の上下は申請不要と聞いたので、決算期のタイミングで自分の給与をちょっとあげてやろうかと思います。

情報処理安全確保支援士に登録申請してみた

 2年前くらい前ですが、セキュリティスペシャリストに合格していたので、せっかくなんで、情報処理安全確保支援士に登録申請してみました。
 登録したところで何のメリットがあるんだろう??と、微妙なところで暫く保留してたのですが、それなりのコストがかかるとはいえ、専門分野とは言い難いし、トレンドもあるので定期的に学習する機会があるならそれは一応メリットだし、何かしら役にたつかと。

 申請書類はIPAのサイトからダウンロードして記入すればよいのですが、その他いろいろ必要な書類があります。

 市役所に行って住民票を、本籍地が都内なので区役所行って身分証明書を、もうひとつ「登記されていないことの証明書」というのを法務局で取得しなければいけないのですが、こちらは法務局の出張所では受け付けておらず、九段の東京法務局まで行って取得。法務局内で書類申請を書いて窓口に提出すると、それがコピーされて「上記の者について、・・・・・・を証明する」と書かれた書類を渡されました。

 さらに郵便局で印紙を購入、銀行で登記手数料の振込、まる一日かかりました。平日休みが取れないと無理です。

 書類送付後、しばらく何の連絡も来ないのですが、半月以上経ってから領収書が届き、1ヶ月くらいしてからメールで受け付けた旨の連絡が来ました。

NTLM認証のサイトからファイルをダウンロードする

SpringBootで作成中のアプリに、企業内のWebサイトよりエクセルファイルをダウンロードする要件があったので、何となくBasic認証のサイトだろうなと思い込んで実装を始めましたが全然繋がりません。

wget ‘http://username:password@filestore.bbb.co.jp/web/download/downloadfile.xlsx’
でファイルは取れます。

でも、
curl ‘http://username:password@filestore.bbb.co.jp/web/download/downloadfile.xlsx’
では動きません。

試しにwgetをデバッグモードでやってみて気が付きました。。

WWW-Authenticate: NTLM

このサイト、NTLM認証ですね。。

下記を参考に認証箇所を変更
http://code-addict.pl/reporting-services-rest-url-client/

また依存が増えてしまいましたが。。

ダウンロードファイルが更新されていた時だけダウンロードするという対応も必要なので、サーバ内にダウンロードしたローカルファイルとサイト上のファイルタイムスタンプをチェックし、一致しなければファイルをダウンロードしタイムスタンプをサイト上と同じ時間に書き換えるという対応になりました。

で、タイムスタンプはどこ?ここに書いてました。

確かにhttpヘッダに
Last-Modified:Tue, 14 Aug 2018 08:53:30 GMT
と書いてあります。

結局、こんな感じのコンポーネントを用意しました。

テストしてみます。

とりえあず、動いたので整理してから実装します。

カテゴリー: Java