Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
脆弱性対応を支える技術/20221127_JJUG-CCC-2022-Fall
Search
skaji18
November 27, 2022
Technology
2
1.2k
脆弱性対応を支える技術/20221127_JJUG-CCC-2022-Fall
JJUG CCC 2022 Fallの発表資料
です。
関連資料
・
変わりゆくAPI連携仕様との付き合い方
・
新規プロダクトの開発速度と品質の両立を支える自動テスト
skaji18
November 27, 2022
Tweet
Share
More Decks by skaji18
See All by skaji18
Vue.js + Firebase のプロジェクトに自動テストを導入した話/20220216_frontend-lt-vol6
skaji18
1
1.2k
走り出したプロジェクトが歩みを止めるまで/20210818 OSS LT vol2
skaji18
0
410
Other Decks in Technology
See All in Technology
夢の印税生活 / Life on Royalties
tmtms
0
280
認知戦の理解と、市民としての対抗策
hogehuga
0
360
事業価値と Engineering
recruitengineers
PRO
1
220
どこで動かすか、誰が動かすか 〜 kintoneのインフラ基盤刷新と運用体制のシフト 〜
ueokande
0
190
EKS Pod Identity における推移的な session tags
z63d
1
200
LLMエージェント時代に適応した開発フロー
hiragram
1
410
JuniorからSeniorまで: DevOpsエンジニアの成長ロードマップ
yuriemori
0
180
自社製CMSからmicroCMSへのリプレースがプロダクトグロースを加速させた話
nextbeatdev
0
140
AIとTDDによるNext.js「隙間ツール」開発の実践
makotot
5
690
[CVPR2025論文読み会] Linguistics-aware Masked Image Modelingfor Self-supervised Scene Text Recognition
s_aiueo32
0
210
ABEMAにおける 生成AI活用の現在地 / The Current Status of Generative AI at ABEMA
dekatotoro
0
660
Yahoo!広告ビジネス基盤におけるバックエンド開発
lycorptech_jp
PRO
1
280
Featured
See All Featured
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
For a Future-Friendly Web
brad_frost
179
9.9k
It's Worth the Effort
3n
187
28k
The Cult of Friendly URLs
andyhume
79
6.5k
Visualization
eitanlees
147
16k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
Thoughts on Productivity
jonyablonski
69
4.8k
Balancing Empowerment & Direction
lara
2
590
Building an army of robots
kneath
306
46k
Faster Mobile Websites
deanohume
309
31k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Transcript
©2022 RAKUS Co., Ltd. 脆弱性対応を支える技術 JJUG CCC 2022 Fall -
2022.11.27 梶紳之介
自己紹介 • 梶紳之介 • 株式会社ラクス • 人事労務管理サービス の開発 • Java、Vue.js、(PHP)
2 @s_kaji_18
脆弱性対応、うまくいってますか? 3
例えばこんな課題、ありませんか? 4
やらなきゃいけないけど... • 自動テストがなく、手動テストが必要 ◦ 😇 品質担保に時間がかかる ◦ 😇 テストにかける人員/リソースを用意できない •
リリースにサービス停止が必要 ◦ 😇 顧客影響が発生するため、ビジネスサイドから敬遠される 5 特に 緊急リリース の場合
今日お話すること 6 私達の開発チームが実践している、脆弱性対応をより早く、より安全 にリリースするためのポイントをご紹介します キーワード • 自動テスト • 無停止リリース
目次 • 前提 ◦ 技術スタック概要 • 脆弱性対応のポイント解説 ◦ バージョンアップ環境の準備 ◦
テストによる品質担保 ◦ リリース ◦ メンバーのローカル環境更新 • まとめ 7
8 技術スタック概要 ※今日お話する内容に関連する技術のみ抜粋 • アプリケーション構成 ◦ Java ◦ Spring Boot
• 実行環境 ◦ コンテナ(Docker) on AWS
過去事例に沿ってポイント解説 9 ※事例として Javaのアップデート を扱います
• バージョンアップ環境の準備 ◦ • テストによる品質担保 ◦ • リリース ◦ •
メンバーのローカル環境更新 ◦ ・Oracle Critical Patch Updates の公開 ・脆弱性対応バージョン のリリース 10
11 • バージョンアップ環境の準備 ◦ • テストによる品質担保 ◦ • リリース ◦
• メンバーのローカル環境更新 ◦ ・Oracle Critical Patch Updates の公開 ・脆弱性対応バージョン のリリース
12 バージョンアップ環境の準備 Java を脆弱性対応バージョンにアップデートする • 前提: コンテナ(Docker)を採用 • → Dockerfile
を1行更新するだけ - FROM amazoncorretto:17.0.3-alpine3.15 + FROM amazoncorretto:17.0.4-alpine3.15 ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]
補足: 依存ライブラリの更新 • 前提: Javaプログラムの依存関係は Gradle で管理 • build.gradle の依存関係を更新するだけ
13 … plugins { - id 'org.springframework.boot' version '2.7.3' + id 'org.springframework.boot' version '2.7.4' } …
14 • バージョンアップ環境の準備 ◦ • テストによる品質担保 ◦ • リリース ◦
• メンバーのローカル環境更新 ◦ ・Oracle Critical Patch Updates の公開 ・脆弱性対応バージョン のリリース
自動テスト で品質担保 テストによる品質担保 15 テスト観点・指標 カバレッジ リグレッション テスト手法 ユニットテスト E2Eテスト
Java プログラムのメソッドレベルの入出力が期待どおりの動作をし ているかを確認する • JUnit5 を採用 • カバレッジは 約85% ◦
サービス開発当初から「テストは書くことが当たり前」の文化 ◦ 特にユニットテストは開発ガイドラインとして定めている ユニットテスト 16
17 ユニットテスト リグレッション観点では、以下の重要機能の動作を確認している • 帳票PDF作成 ◦ ◦ • 外部API連携
ユニットテスト リグレッション観点では、以下の重要機能の動作を確認している • 帳票PDF作成 ◦ 作成したPDFのレイアウトが崩れていないか確認する ◦ Apache PDFBox で画像変換して新旧比較
• 外部API連携 ◦ 想定しているフロー/データのままで連携できるか確認する ◦ 連携先でバッチ処理される(15分前後)までポーリングする 18
ユニットテスト リグレッション観点では、以下の重要機能の動作を確認している • 帳票PDF作成 ◦ 作成したPDFのレイアウトが崩れていないか確認する ◦ Apache PDFBox で画像変換して新旧比較
• 外部API連携 ◦ 想定しているフロー/データのままで連携できるか確認する ◦ 連携先でバッチ処理される(15分前後)までポーリングする 19 関連資料: 変わりゆくAPI連携仕様との付き合い方 https://speakerdeck.com/nologyance/good-practice-of-using-api?slide=23
E2Eテスト ユーザと同じようにブラウザを操作し、システム全体を通して期待ど おりの動作をしているかを確認する • Puppeteer を採用 • ハッピーパス(正常系の代表操作) の動作を担保 20
関連資料: 新規プロダクトの開発速度と品質の両立を支える自動テスト https://speakerdeck.com/noriharu3/automation-testing-supports-both-development-speed-and-quality-of-new-product?slide=23
21 • バージョンアップ環境の準備 ◦ • テストによる品質担保 ◦ • リリース ◦
• メンバーのローカル環境更新 ◦ ・Oracle Critical Patch Updates の公開 ・脆弱性対応バージョン のリリース
リリースモジュールの作成 • Gitのタグを打つと自動で作成する ◦ Java プログラムのビルド ◦ Docker イメージのビルド 〜
プッシュ ※継続的デプロイ には対応していない 22
リリース • イメージをもとにコンテナを起動するだけ ◦ 何台もあるサーバの1台1台にインストールしていくような作業は不要 23
リリース • イメージをもとにコンテナを起動するだけ ◦ 何台もあるサーバの1台1台にインストールしていくような作業は不要 • 無停止でリリース可能 ◦ AWS ECS
の rolling update で実現 24
リリース • イメージをもとにコンテナを起動するだけ ◦ 何台もあるサーバの1台1台にインストールしていくような作業は不要 • 無停止でリリース可能 ◦ AWS ECS
の rolling update で実現 • 無停止 = 顧客への影響が出ない ◦ 顧客への事前周知が不要 25
リリース • イメージをもとにコンテナをきどうするだけ ◦ 何台もあるサーバの1台1台にインストールしていくような作業は不要 • 無停止でリリース可能 ◦ AWS ECS
の rolling update で実現 • 無停止 = 顧客への影響が出ない ◦ 顧客への事前周知が不要 → 開発/インフラチームの準備が整い次第リリースできる!! 26
27 • バージョンアップ環境の準備 ◦ • テストによる品質担保 ◦ • リリース ◦
• メンバーのローカル環境更新 ◦ ・Oracle Critical Patch Updates の公開 ・脆弱性対応バージョン のリリース
Java のバージョン管理ツール(SDKMAN!) を採用 • バージョンアップ担当者 ◦ Git リポジトリの設定ファイル(.sdkmanrc)を更新 • メンバー
◦ SDKMAN! から Java のインストールを促されるので、そのコマンドを実 行するだけ 28 メンバーのローカル環境更新 # Enable auto-env through the sdkman_auto_env config # Add key=value pairs of SDKs to use below - java=17.0.3-amzn + java=17.0.4-amzn
まとめ 29
まとめ • コンテナやパッケージ管理ツールを採用 ◦ バージョンアップ作業が簡単 ◦ 本番環境への反映もコンテナを置き換えるだけ • 自動テストで品質担保 ◦
品質担保にかかるリソースを削減 ◦ テスト品質が実施者に依存せず、毎回一定水準を担保できる • 無停止でリリース ◦ 顧客影響が無いため、ビジネスサイドから理解を得やすい 30