1
/
5
This page is intended for users in Japan(English). Go to the page for users in United States.

【Tech Blog #1】CI/CDツールをJenkinsからCircleCIに移行した話

こんにちは!ユニオンテックでエンジニアをしている石川です。
弊社サービス「CraftBank」のインフラからフロントエンドまで色々開発をしています!
最近の悩みは、他社のエンジニアとの会話で「何の開発をされているのですか?」と聞かれた時に
「全部です」と答えると、逆に何もしてない人みたいな印象を与えてしまうことですw
可能な限り短くて的確な良い回答を探しているのですが、なかなか見つからないのでどなたか正解を教えてください・・・。

我々エンジニアチームでは、最近「環境開発改善」に積極的に取り組んでいます。
そこで今回、Tech Blog 第一弾として、少し前に行った「CI/CDツールをJenkinsからCircleCIに移行した話」をご紹介しようと思います!

■CI/CDツールとしてJenkinsを採用・移行した背景

弊社サービスの「CraftBank」は発足時は100%外注で作成されており、当時はトップページのレスポンスが10秒以上返ってこないような悲惨な状態だったため(今どき考えられない・・・)、サービスを外注から内製にしてちゃんとしたものを作り直そう!というプロジェクトが立ち上がりました。

その際、サービスの作り替えに重きを置き、いかに可能な限り早く作り替えを達成させるかを考えた時に
知見があるJenkinsが目的を達成するのに最も適していると判断され、採用されました。

しかし、サービスが無事内製化されエンジニアチームが拡大されていくと共に、Jenkinsの保守運用にリソースが割かれる回数が増えてきて、徐々にリソースが圧迫されてきたので、保守運用から解放されるCircleCIに移行しよう!というのが事の発端です。(長々と書きましたがよくある移行理由ですw)

■CircleCIに移行するにあたっての問題点

JenkinsからCircleCIに移行するにあたってアプリケーション構成上の問題がありました。
移行前のアプリケーションの構成は以下のようになっていました。

CraftBankは、「実際にユーザがアクセスするアプリケーション」(以下CraftBank)と、「社内で社員が利用するアプリケーション」(以下Admin)の2つで構成されており、CraftBankはECS(Fargate)、AdminはEC2で稼働しています。

JenkinsはCraftBank、Adminと同じVPC内のEC2で稼働していたので特に問題なく接続できていたのですが、CircleCIに移行するとなるとVPC外から接続することになります。

CraftBankのデプロイはECSのAPIでどうにかなるのですが、AdminはDeployerでデプロイしているのと、セキュリティグループで社内IPでしか接続できないように設定しているため、このままだとCircleCIがAdminに接続できないという問題がありました。

■CircleCIで踏み台サーバを経由してEC2にデプロイする

そこで、CircleCIがAdminのEC2インスタンスにデプロイできるように以下を行いました。

  1. 踏み台サーバ・AdminのサーバにCircleCI用のユーザを作成
  2. 踏み台サーバを経由した多段sshの設定を書いたconfigを作成・設定
  3. 一時的にCircleCIがsshできるようにセキュリティグループの設定を変更

1. 踏み台サーバ・AdminのサーバにCircleCIのユーザを作成

↓の記事等を参考にCircleCIがsshするためのユーザを作成します。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/new-user-accounts-linux-instance/

2. 踏み台サーバを経由した多段sshの設定を書いたconfigを作成・設定

まず、踏み台サーバの/etc/ssh/sshd_configを修正してsshdを再起動し、多段sshを行えるようにします

/etc/ssh/sshd_config

AllowTcpForwarding yes
$ service sshd restart

次に、↓の記事を参考に1.で作成したユーザがsshできるように秘密鍵を設定し、.ssh/authorized_keysに公開鍵を設定します。
https://circleci.com/docs/ja/2.0/add-ssh-key/
秘密鍵の設定完了後fingerprintが発行されるので、そのfingerprintを使って多段ssh用のconfigを作成・設定します。

circleci_ssh_config

Host basting
HostName {踏み台サーバのIP}
User {踏み台サーバに作成したユーザ}
IdentityFile /home/circleci/.ssh/id_rsa_{発行されたfingerprintの':'を消した文字列1}
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null

Host production
HostName {AdminのローカルIP}
User {Adminに作成したユーザ}
IdentityFile /home/circleci/.ssh/id_rsa_{発行されたfingerprintの':'を消した文字列2}
ProxyCommand ssh -W %h:%p basting # 多段sshの設定
StrictHostKeyChecking no
UserKnownHostsFile=/dev/nul

.circleci/config.yml

steps:
- checkout
- add_ssh_keys:
fingerprints:
- "発行されたfingerprint_1"
- "発行されたfingerprint_2"
- run:
name: Add ssh config
command: cat ~/workspace/.circleci/circleci_ssh_config >> ~/.ssh/config

3. 一時的にCircleCIがsshできるようにセキュリティグループの設定を変更

2でCircleCIがsshできる準備が整ったので、CircleCIが踏み台サーバに接続できるように
aws-cliでデプロイ時のみセキュリティグループを変更します。
CircleCIはbuild毎にIPが変わるので、コマンド内でIPを取得して設定します。

.circleci/config.yml

orbs:
aws-cli: circleci/aws-cli@1.1.0

...

- aws-cli/install
- run:
name: Add inbound rule to basting server's security group for Circleci
command: |
IP=`curl -s ifconfig.me`
aws configure set region {リージョン名}
aws ec2 authorize-security-group-ingress --group-id {踏み台サーバのセキュリティグループID} --protocol tcp --port 22 --cidr ${IP}/32
- run:
name: Deploy
command: /usr/local/bin/dep deploy {Deployerで設定したhostname}
- run:
name: Rollback basting server's security group
command: |
IP=`curl -s ifconfig.me`
aws configure set region {リージョン名}
aws ec2 revoke-security-group-ingress --group-id {踏み台サーバのセキュリティグループID} --protocol tcp --port 22 --cidr ${IP}/32
when: always # デプロイに失敗してもセキュリティグループの設定を元に戻すように when: always をつける

■CircleCIのデプロイに移行した所感

version 2.1 の新機能が便利

orbs、commands、executors、whenなどversion 2.1で使用できるキーを使うと、configがスッキリしたり自分で一からconfigを書く必要がなくなったりするので、積極的に使ってよかったです。
https://circleci.com/docs/ja/2.0/reusing-config/

デプロイが速くなった

これは副産物ですが、Jenkins用のインスタンスが低スペックだったので、CircleCIに乗り換えたらデプロイ時間が2/3くらいになりましたw

■CI/CDに関する今後の展望

EC2をECSへ移行

EC2へのデプロイがアクロバティックなのと、開発環境はDockerで構築されているので、EC2からECSに移行してデプロイフローをシンプルにする & 環境差異を無くしたい。

ユニットテスト・Prettier・lint等を回したい

今回はCDのみの話でしたが、CIがまだ整備され切ってない部分があるので、ユニット・E2Eテスト・Prettier・lint等をPull Request毎に実行し引っかかったらmergeできない、みたいな状態に持っていきたい。(一部もう回し始めてます)

このように、技術的な環境が整ってないところがまだあるのが実情です。なので、こういった環境を積極的に改善していきたい!という意欲のあるエンジニアを大募集しています。
そして、その中からより良いプロダクトを生み出し、建設業界をより魅力的な業界に変えてみたい、そんな風に感じる方、ぜひご連絡お待ちしています!!

クラフトバンク株式会社's job postings
8 Likes
8 Likes

Weekly ranking

Show other rankings
If this story triggered your interest, go ahead and visit them to learn more