AWS ECS上に構築するSpringアプリケーション(4)

【連載】

AWSで作るクラウドネイティブアプリケーションの基本

【第7回】AWS ECS上に構築するSpringアプリケーション(4)

[2019/04/24 08:00]川畑 光平 ブックマーク ブックマーク

開発ソフトウェア

前回までに、以下のイメージの構成に沿って、VPC環境とALB(アプリケーションロードバランサ)を構築し、ECSコンテナ上で動くパブリック/プライベートサブネット用の2種類のアプリケーションを作成しました。

アプリケーションの構成イメージ

今回は、実装したSpringアプリケーションのDockerコンテナイメージを作り、レジストリへプッシュしてみましょう。

Dockerコンテナの作成/DockerHubへのプッシュ

ECSの実態はDockerコンテナなので、前回実装したSpringアプリケーションのコンテナイメージを作成し、「DockerHub」や「AWS Elastic Container Registry(ECR)」などのレジストリにプッシュしておくと、ECSクラスタ・タスク・サービスの定義で、レジストリからコンテナイメージを取得し、ECSコンテナとして実行することができるようになります(ECSクラスタ・タスク・サービスについては次回以降で説明します)。

それでは、前回実装したSpringアプリケーションのプロジェクトを基に、Dockerイメージを作成していきましょう。Dockerイメージを作成する場合は、「Dockerfile」と呼ばれる定義ファイルを作成します。

前回作成したSpringBootアプリケーションのMavenプロジェクト内に、各々以下のようなDockerファイルを作成してコミットし、GitHubへプッシュします。

■Backendアプリケーションのプロジェクトに作成するDockerfile

# Dockerfile for sample service using embedded tomcat server

# (A)
FROM centos:centos7
# (B)
MAINTAINER debugroom

# (C)
RUN yum install -y \
    java-1.8.0-openjdk \
    java-1.8.0-openjdk-devel \
    wget tar iproute git

# (D)
RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
# (E)
RUN sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
# (F)
RUN yum install -y apache-maven
# (G)
ENV JAVA_HOME /etc/alternatives/jre
# (H)
RUN git clone https://github.com/debugroom/mynavi-sample-aws-ecs.git /usr/local/mynavi-sample-aws-ecs
# (I)
RUN mvn install -f /usr/local/mynavi-sample-aws-ecs/pom.xml

# (J)
RUN cp /etc/localtime /etc/localtime.org
# (K)
RUN ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# (L)
EXPOSE 8080

# (M)
CMD java -jar -Dspring.profiles.active=production /usr/local/mynavi-sample-aws-ecs/backend/target/mynavi-sample-aws-ecs-backend-0.0.1-SNAPSHOT.jar

■BFF(Backend For Frontend)アプリケーションのプロジェクトに作成するDockerファイル

# Dockerfile for sample service using embedded tomcat server

# (A)
FROM centos:centos7
# (B)
MAINTAINER debugroom

# (C)
RUN yum install -y \
       java-1.8.0-openjdk \
       java-1.8.0-openjdk-devel \
       wget tar iproute git

# (D)
RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
# (E)
RUN sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
# (F)
RUN yum install -y apache-maven
# (G)
ENV JAVA_HOME /etc/alternatives/jre
# (H)
RUN git clone https://github.com/debugroom/mynavi-sample-aws-ecs.git /usr/local/mynavi-sample-aws-ecs
# (I)
RUN mvn install -f /usr/local/mynavi-sample-aws-ecs/pom.xml

# (J)
RUN cp /etc/localtime /etc/localtime.org
# (K)
RUN ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# (L)
EXPOSE 8080

# (M)
CMD java -jar -Dspring.profiles.active=production /usr/local/mynavi-sample-aws-ecs/backend-for-frontend/target/mynavi-sample-aws-ecs-backend-for-frontend-0.0.1-SNAPSHOT.jar

内容は2つともほぼ同じなので、以下ではBackendアプリケーションプロジェクトのDockerfileを基に解説します。

Dockerfileの実行コマンドは、次のとおりです。

項番 コマンド
説明
A FROM centos:centos7
コンテナイメージのベースとなるOSイメージを指定します
B MAINTAINER debugroom
メンテナンスしている組織や個人の名称を指定します。省略可能です
C RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget tar iproute git
OSにJDK、wgetコマンド、tarコマンド、iprouteコマンド、gitをインストールしています
D RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo
Apache Mavenのインストールに必要な資材をwgetコマンドで取得しています
E RUN sed -i s/$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
/etc/yum.repos.d/epel-apache-maven.repoのリリースバージョンを置換しています
F RUN yum install -y apache-maven
Apache Mavenをインストールしています
G ENV JAVA_HOME /etc/alternatives/jre
JAVA_HOME環境変数をインストールされたJDKのディレクトリに設定しています
H RUN git clone https://github.com/debugroom/mynavi-sample-aws-ecs.git /usr/local/mynavi-sample-aws-ecs
GitHubへプッシュしたSpringアプリケーションを/usr/local/mynavi-sample-aws-ecsへgit cloneしています。ディレクトリは適宜変更しても構いません
I RUN mvn install -f /usr/local/mynavi-sample-aws-ecs/pom.xml
アプリケーションをmvn installコマンドでビルドしています。なお、fオプションでpom.xmlを直接指定しています
J RUN cp /etc/localtime /etc/localtime.org
OSのタイムゾーンを変更するため、タイムゾーンファイルを一度バックアップします
K RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
シンボリックリンクを上書き作成して、アプリケーション実行環境のタイムゾーンを東京に変更しています
L EXPOSE 8080
コンテナのポート8080をオープンします
M CMD java -jar -Dspring.profiles.active=production /usr/local/mynavi-sample-aws-ecs/backend-for-frontend/target/mynavi-sample-aws-ecs-backend-for-frontend-0.0.1-SNAPSHOT.jar
IでビルドしたSpringBootアプリケーションをプロファイルproductionで実行しています。ExecutableJar形式なので、アプリケーションが組み込みTomcat内で起動します

先に挙げたようなDockerファイルを用意し、DockerがインストールされたLinuxマシン上でdocker buildコマンドを実行することにより、Dockerイメージを作成することができます。

補足

Cent OSでDockerやGitを利用するための前準備は次の通りです。

■CentOSのDockerインストール方法

EC2でCentOS7を実行した場合、以下のコマンドでDockerをインストールできます。
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo yum update -y
// omit
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo yum install -y docker
// omit
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.serv    ice to /usr/lib/systemd/system/docker.service.
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo systemctl start docker.service

■dockerコマンドの実行

dockerコマンドを利用する際は sudoが必要です。 sudoなしでdockerコマンドを実行するには、dockerグループを作成し、実行ユーザーを追加する必要があります。
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo groupadd docker
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo gpasswd -a $USER docker
 Adding user centos to group docker
[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo systemctl restart docker
[centos@ip-XXX-XXX-XXX-XXX ~]$ exit

■CentOSのGitインストール方法

EC2でCentOS7を実行した場合は、以下のコマンドでGitをインストールできます。適当なディレクトリでインストールコマンドを実行してください。
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo yum -y install wget make gcc perl-ExtUtils-MakeMaker curl-devel expat-devel gettext-devel openssl-devel zlib-devel autoconf
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo wget https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo tar xvzf git-2.9.5.tar.gz
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ cd git-2.9.5
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo make configure
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo ./configure --prefix=/usr
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ sudo make install
// omit
[centos@ip-XXXX-XXX-XXX-XXX ~]$ git --version
git version 2.9.5

以降は、EC2でCentOS7を実行し、DockerやGitをインストールしたマシン上での操作を前提に話を進めます。

では、GitHubへプッシュしたBackend、BFF双方のソースコードプロジェクトにあるDockerfileを使って、Dockerイメージを作成しましょう。

以下では、ソースコードをGitHubからクローンし、Backendアプリケーションのプロジェクト直下にあるDockerfileを指定して、docker buildコマンドでDockerイメージを作成しています。GitHubからチェックアウトするソースコードのプロジェクトやdocker buildコマンドで指定する-tオプションのレポジトリ名は適宜、自身が実行する環境に合わせて変更してください。ここでは、レジストリとしてDocker Hubを前提にしています。

[centos@ip-XXX-XXX-XXX-XXX ~]$ sudo git clone https://github.com/debugroom/mynavi-sample-aws-ecs.git
[centos@ip-XXX-XXX-XXX-XXX ~]$ cd mynavi-sample-aws-ecs
[centos@ip-XXX-XXX-XXX-XXX mynavi-sample-aws-ecs]$ docker build backend/ -t debugroom/mynavi-sample-ecs-backend:latest
// omit
[centos@ip-XXX-XXX-XXX-XXX ~]$ docker images
REPOSITORY                                                   TAG                 IMAGE ID            CREATED             SIZE
debugroom/mynavi-sample-ecs-backend                          latest              1f3ea8c79c62        1 minites ago       985 MB

Dockerイメージが作成されたら、Docker Hubへプッシュします。

[centos@ip-XXX-XXX-XXX-XXX ~]$ docker login
// omit  - enter USERID and password
[centos@ip-XXX-XXX-XXX-XXX ~]$ docker push debugroom/mynavi-sample-ecs-backend:latest

これでコンテナイメージをレジストリにプッシュできました。次回は、実際にECSコンテナを実行するためのECSクラスタを構築します。

著者紹介


川畑 光平(KAWABATA Kohei)

某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professionalなどの資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。

本連載の内容に対するご意見・ご質問は Facebook まで。

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

この記事に興味を持ったら"いいね!"を Click
Facebook で IT Search+ の人気記事をお届けします

会員登録(無料)

注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
[解説動画] 個人の業務効率化術 - 短時間集中はこうして作る
知りたい! カナコさん 皆で話そうAIのコト
教えてカナコさん! これならわかるAI入門
対話システムをつくろう! Python超入門
Kubernetes入門
AWSで作るクラウドネイティブアプリケーションの基本
PowerShell Core入門
徹底研究! ハイブリッドクラウド
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

ページの先頭に戻る