本連載では、マイクロサービスアーキテクチャでの継続的デリバリ(CD:Continuous Delivery:CD)を以下のようなパイプラインで実装する方法について、解説を進めています。

本連載で実装を進めている継続的デリバリのパイプライン

今回は、E2Eテストが完了したWeb(BEF:BackendForFrontend)アプリケーションのコンテナイメージをビルドして、DockerHubへプッシュするパイプラインを構築します。

Web(BFF)アプリケーションのコンテナイメージのビルド

  1. CodeBuildがBFFアプリケーションのステージング環境向けbuildspec.ymlに記載したビルド処理を行うコンテナを実行します。
  2. ビルド処理の中で、BFFアプリケーション実行コンテナイメージを作成し、DockerHubへプッシュします。

Web(BFF)アプリケーションのコンテナイメージのビルド

buildspec.ymlおよびDockerfileの作成

第13回でBackendマイクロサービスアプリケーションのコンテナイメージを構築するbuildspec.ymlを作成した際と同様に、アプリケーションをコンテナイメージ化するbuildspec.ymlをbackend-for-fronted/build/staging/配下に作成します。

[project-root]

├-[backend-for-frontend]
│ ├- src
│ │ ├- main …..
│ │ └- test …..
│ ├- build
│ │ ├- production
│ │ | └- dockerfile
│ │ ├- staging
│ │ | ├- buildspec_e2e.yml
│ │ │ └- buildspec.yml
│ │ …..
│ └- pom.xml
│ …..
└- pom.xml

buildspec.ymlの実装内容は第13回と同様なので、詳細についてはそちらの解説をご覧ください。

 version: 0.2
 env:
   parameter-store:
     DOCKER_USER: "DOCKER_USER"
     DOCKER_PASSWORD: "DOCKER_PASSWORD"
     DOCKER_REPO : "DOCKER_REPO"
     IMAGE_REPO_NAME: "BACKEND_FOR_FRONTEND_IMAGE_REPO_NAME"
     IMAGE_TAG: "BACKEND_FOR_FRONTEND_IMAGE_TAG_STAGING"
 phases:
   install:
     runtime-versions:
       docker: 18
   pre_build:
     commands:
       - echo Logging in to Docker Hub...
       - docker login -u $DOCKER_USER -p $DOCKER_PASSWORD $DOCKER_REPO
   build:
     commands:
       - echo Build started on `date`
       - echo Building the Docker image...
       - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG backend-for-frontend/build/production
       - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $IMAGE_REPO_NAME:$IMAGE_TAG
   post_build:
     commands:
       - echo Build completed on `date`
       - echo Pushing the Docker image...
       - docker push $IMAGE_REPO_NAME:$IMAGE_TAG
       - printf '[{"name":"mynavi-sample-continuous-delivery-bff-staging","imageUri":"%s"}]' $IMAGE_REPO_NAME:$IMAGE_TAG > imagedefinitions.json
artifacts:
  files:
    - imagedefinitions.json

また、buildspec.yml内でdocker buildコマンドによって実行されるDockerfileは以下の通りです。

# Dockerfile for sample service using embedded tomcat server

FROM centos:centos7
MAINTAINER debugroom

RUN yum install -y \
    java-1.8.0-openjdk \
    java-1.8.0-openjdk-devel \
    wget tar iproute git

RUN rm -f /etc/rpm/macros.image-language-conf && \
    sed -i '/^override_install_langs=/d' /etc/yum.conf && \
    yum -y reinstall glibc-common && \
    yum clean all

ENV LANG="ja_JP.UTF-8" \
    LANGUAGE="ja_JP:ja" \
    LC_ALL="ja_JP.UTF-8"

RUN wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo

RUN sed -i s/\$releasever/6/g /etc/yum.repos.d/epel-apache-maven.repo
RUN yum install -y apache-maven
ENV JAVA_HOME /etc/alternatives/jre
RUN git clone https://github.com/debugroom/mynavi-sample-continuous-integration.git /usr/local/mynavi-sample-continuous-integration
RUN mvn install -f /usr/local/mynavi-sample-continuous-integration/common/pom.xml
RUN mvn package -f /usr/local/mynavi-sample-continuous-integration/backend-for-frontend/pom.xml -Dspring.profiles.active="production"
RUN cp /etc/localtime /etc/localtime.org
RUN ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

EXPOSE 8080

CMD java -jar -Dspring.profiles.active=production /usr/local/mynavi-sample-continuous-integration/backend-for-frontend/target/mynavi-sample-continuous-integration-backend-for-frontend-0.0.1-SNAPSHOT.jar

こちらも、第13回と同様、プロダクション環境に配置するコンテナイメージを想定して作成しています。

AWS Sysmtems Managers Parameter Storeでの環境変数の定義

CodePipelineの設定を行う前に、前節のbuildspec.ymlで使用する環境変数を定義しておきます。こちらの設定の要領も第13回と同様です。以下のパラメータを定義します。

- “BACKEND_FOR_FRONTEND_IMAGE_REPO_NAME”:debugroom/mynavi-sample-backend-for-frontend
- “BACKEND_FOR_FRONTEND_IMAGE_TAG_STAGING”:1.0.SNAPSHOT

ビルドプロジェクトの作成とCodePipelineの設定

これまで作成してきたCodePipelineを編集し、BFFアプリケーションのコンテナイメージを作成するためのCodeBuildプロジェクトを作成/設定します。AWSコンソールの「CodePipeline」サービスを選択し、パイプラインを選択して、「編集する」ボタンを押下します。

「編集する」ボタンを押下する

今回は、前回作成したE2Eテストのステージにアクションを追加するので、「ステージを編集する」ボタンを押下し、アクションを追加します。

「ステージを編集する」ボタンを押下する

コンテナイメージをビルドするための設定を行います。以下の要領でアクションを設定し、「完了」ボタンを押下します。

  • アクション名:任意のアクション名を追加します。
  • アクションプロバイダー:「AWS CodeBuild」を選択します。
  • リージョン:ステージング環境があるリージョンを選択します。
  • 入力アーティファクト:1番目のパイプラインで出力アーティファクトとなっている「SourceArtifact」を選択します。なお、これはGitHubからチェックアウトしたソースコードプロジェクトで、実体はS3にZIPアーカイブされて保存されています。
  • プロジェクト名:「プロジェクトを作成する」ボタンを押下して、後述する要領で「CodeBuild」プロジェクトを作成します。
  • 出力アーティファクト:出力アーティファクトはこれまでのアーティファクト名と重複しない任意の名称を入力します。

アクションの設定

また、CodeBuildプロジェクトの設定要領は基本的に第11回と同様ですが、以下の点に留意して設定しましょう。

入力箇所 項目 説明
環境 特権付与 buildspec.yml内で、dockerコマンドなどを実行する場合、チェックが必要です
サービスロール CodeBuildの実行に必要なポリシーをアタッチしたサービスロールを設定します。複数のビルドプロジェクトで関連付けが可能ですが、最大10のビルドプロジェクトまでしか関連付けができないので注意が必要です。なお、サービスロールを新規作成する場合は作成後にSystemsManagerのアクセス権限を付与します
Buildspec buildspec名 デフォルトではソースコードのルートディレクトリにあるbuildspec.ymlが選択されますが、別の名前や場所を使用している場合に入力します。ここでは、前節で作成したbackend-for-frontend/build/staging/buildspec.ymlを指定します

CodeBuildプロジェクトの設定

特権付与とサービスロールの設定

追加設定

BuildSpecの設定

プロジェクトを作成したら、CodeBuildからSystemsManagerParameterStoreに環境変数のアクセスができるよう、サービスロールに権限を付与しておきます。

サービスロールに権限を付与する

権限の付与後、「変更をリリースする」ボタンを押下し、パイプラインを起動して、正常にビルドが完了するか確認します。

正常にビルドが完了するか確認

また、DockerHub上にもコンテナイメージがプッシュされていることを確認します。

DockerHub上の確認

これでBFFアプリケーションのコンテナイメージをビルドして、DockerHubへプッシュするパイプラインが作成できました。次回は、BFFアプリケーションをステージングデプロイするパイプラインを構築します。

著者紹介


川畑 光平(KAWABATA Kohei) - NTTデータ 課長代理

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

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

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