Slide 1

Slide 1 text

1 © SMS Co., Ltd. 2025.7.9 株式会社エス・エム・エス 山口隆史 mysqlコマンドを実行したいだけなのに 〜AWS Step Functionsと歩んだ脱Jenkinsへの道〜

Slide 2

Slide 2 text

2 © SMS Co., Ltd. エレベーターピッチ 「たったひとつのmysqlコマンド」Jenkinsで使われていたバッチ をクラウドネイティブにしたいという一つの願い。 しかし、立ちはだかる見えない「制約」の壁。 新しいStep Functionsという新天地へ踏み出すにも、 既存のリソース、限られた時間、そして技術的な困難が重くのしか かる。 「無理だ」誰もがそう思った。しかし、彼らは諦めなかった。 これは、制約に挑み、不可能を可能にしたエンジニアたちの熱き物 語である。 X 千葉じぇクト

Slide 3

Slide 3 text

3 © SMS Co., Ltd. 自己紹介 氏名:山口隆史(やまぐちたかし) 所属:株式会社エス・エム・エス    プロダクト推進本部 技術推進グループ 業務:全社SREとしての活動 略歴:フリーランス、SIer、Web系を渡り歩く→現職(2024/05〜) 自称:Security Hub芸人 好きなAWSサービス:営業、Security Hub、GuardDuty 他:AWS Community Builder(Security & Identity)、   JAWS-UG千葉支部運営、Snyk Ambassador 第022587号

Slide 4

Slide 4 text

4 © SMS Co., Ltd.

Slide 5

Slide 5 text

5 © SMS Co., Ltd. 会社概要
 *1:第7期迄は単体数値、第8期より連結数値にて記載 
 基礎情報
 株式会社エス・エム・エス(英語表記)SMS Co., Ltd. 
 2003年 4月4日 
 東京証券取引所プライム市場(証券コード:2175) 
 25億5,172万円(2025年3月31日時点) 
 連結:4,528人、単体:3,049人(2025年3月31日時点) 
 国内:4社、海外:アジア・オセアニア等16の国と地域 
 
 「高齢社会に適した情報インフラを構築することで人々の 生活の質を向上し、社会に貢献し続ける」 
 
 高齢社会に求められる領域を、医療・介護/障害福祉・ヘルスケア ・シニアライフと捉え、価値提供先であるエンドユーザ・従事者・事 業者をつなぐプラットフォームとしての情報インフラを構築し、40以 上のサービスを展開 
 会社名 
 設立
 市場情報 
 資本金 
 従業員数 
 関連会社 
 
 ミッション 
 業績
 売上推移 *1
 (売上高・億円) 
 社会課題の解決につながる事業を
 創造・拡大し、継続的に成長


Slide 6

Slide 6 text

6 © SMS Co., Ltd. 分野
 区分
 サービス
 キャリア 
 介護キャリア 
 
 
 医療キャリア 
 
 介護・障害福祉 事業者 
 
 
 ヘルスケア 
 
 
 
 
 
 
 シニアライフ 
 
 
 海外
 
 
 *1.柔道整復師、あん摩マッサージ師、はり師、きゅう師のこと 
 サービス一覧 
 看護師向け 
 人材紹介 
 介護・医療・福祉の 
 資格講座情報 
 PT/OT/ST向け
 人材紹介 
 介護職向け求人情報 
 ケアマネジャー向け
 人材紹介 
 看護学生向け 
 就職情報 
 放射線技師向け 
 人材紹介 
 高校生・看護学生 
 向け奨学金情報 
 臨床検査技師向け 
 人材紹介 
 看護師・看護学生向け 
 コミュニティ 
 臨床工学技士向け 
 人材紹介 
 保育士向け 
 人材紹介 
 治療家*1・セラピスト向け
 人材紹介 
 介護事業の 
 経営者・管理者向け情報 
 高齢社会の 
 調査・研究・情報発信 
 医療従事者向け医薬情報 
 治療家*1・セラピスト向け求 人情報 
 柔道整復師・あはき師
 向け受験参考書 
 管理栄養士・栄養士向け 
 人材紹介 
 介護職向け人材紹介 
 介護で働く人の
 ためのスクール 
 介護で悩む人向け
 コミュニティ
 高齢者向け
 食事宅配紹介
 高齢者向け
 住宅紹介 
 遠隔指導特定保健指導 
 サービス 
 管理栄養士・栄養士向け 
 コミュニティ 
 企業の介護離職 
 防止ソリューション 
 ICTを活用した 
 禁煙サポート 
 認知症患者とその家族
 向け認知症情報 
 認知症予防
 ソリューション 
 認知症予防の 
 習慣化サポート 
 遠隔指導重症化予防 サービス 
 女性の健康経営
 サポート 
 産業保健に
 関わる人向け情報 
 企業の健康管理 
 業務サポート 
 リフォーム会社
 紹介
 葬儀社紹介 
 ケアマネジャー 
 向けコミュニティ 
 医療従事者向け人材紹介 
 (マレーシア、フィリピン、アイルランド、UK、ドイツ等) 
 看護師向け
 キャリアサービス 
 行動療法に特化した
 禁煙サポート
 自治体向け調査・
 計画策定・予防事業
 医療介護業界特化型
 ストレスチェック
 介護/障害福祉
 事業者向け経営支援
 
 看護師の職場を 診断するツール 
 障害のある方向け
 就労支援事業所情報
 障害のある方向け
 人材紹介
 建設業界向け
 人材紹介


Slide 7

Slide 7 text

7 © SMS Co., Ltd. ここから本題

Slide 8

Slide 8 text

8 © SMS Co., Ltd. 01 02 03 04 05 06 今回のシステムの説明 なぜJenkinsから脱却したい流れになったか 実行していたバッチ処理の概要 rakeコマンドを実行しているバッチの移行 mysqlコマンドをどうするか まとめ 目次

Slide 9

Slide 9 text

9 © SMS Co., Ltd. 01 02 03 04 05 06 今回のシステムの説明 なぜJenkinsから脱却したい流れになったか 実行していたバッチ処理の概要 rakeコマンドを実行しているバッチの移行 mysqlコマンドをどうするか まとめ 目次

Slide 10

Slide 10 text

10 © SMS Co., Ltd. 今回の対象システム ● 看護学生向け就職情報「ナース専科」 就職 ○ 病院検索や説明会・インターンシップ・採用試験申込み、 無料適職診断など、就職活動に役立つ情報を提供していま す。オンライン就活ゼミや合同就職フェアも実施しキャリ ア形成を支援しています。看護学生向けの求人サービスで す。

Slide 11

Slide 11 text

11 © SMS Co., Ltd. システムの特徴 ● Ruby on Railsのモノリス ● オンライン系はECS on Fargateでコンテナ化済み ● バッチ系はEC2(Jenkins)で稼働 ○ こちらもRails ○ 最新ソースの反映はGitHubからのwebhookで実現(ブラ ンチ指定) ○ Sidekiq等は使用していない ● デプロイ周りはCodeシリーズを使用

Slide 12

Slide 12 text

12 © SMS Co., Ltd. アーキテクチャ図

Slide 13

Slide 13 text

13 © SMS Co., Ltd. 01 02 03 04 05 06 今回のシステムの説明 なぜJenkinsから脱却したい流れになったか 実行していたバッチ処理の概要 rakeコマンドを実行しているバッチの移行 mysqlコマンドをどうするか まとめ 目次

Slide 14

Slide 14 text

14 © SMS Co., Ltd. 現状のリリースフロー ● ブランチ ○ Prd、Staging ● デプロイ ○ PrdへのマージでProductionへデプロイ ○ StagingへのマージでStagingへデプロイ ● リリース ○ デプロイ=リリース ● image tag ○ latest運用

Slide 15

Slide 15 text

15 © SMS Co., Ltd. 現状のリリースフローの課題 ● マージ、デプロイ、リリースが別れていない ○ デプロイ=リリースなので先行開発ができない ● latest運用なのでロールバックできない ○ 何かトラブルがあってロールバックする場合はデプロイし なおさないといけない ○ デプロイし直せばOKという運用の単純さはある

Slide 16

Slide 16 text

16 © SMS Co., Ltd. toBEのリリースフロー ● マージ、デプロイ、リリースを分ける ○ Feature Flagの導入 ○ ブランチをmain一本にする ■ mainへのマージでStaging環境へデプロイ ■ Tagの発行でProduction環境へデプロイ ● image tagをハッシュに変更する ○ タスク定義を戻せばロールバックできる状態にする

Slide 17

Slide 17 text

17 © SMS Co., Ltd. ここでふっと気づきました ● あれ、Jenkinsへ最新ソースを反映するタイミングないよな ○ ブランチ戦略が変わると既存のwebhookが使えなくなる ○ だったらJenkins辞めるか、の流れになった

Slide 18

Slide 18 text

18 © SMS Co., Ltd. が、作業的にはおまけがメインとなる稀によくあるやつです

Slide 19

Slide 19 text

19 © SMS Co., Ltd. すでに認識していたJenkinsのつらみ ● Jenkinsにadd-onが入れるのが大変 ○ ちょっとしたことで起動しなくなって全体障害に繋がる ● 運用コストの負担が大きくなってきた ○ バッチジョブの内容を確認しようとしするとWebUIを確認 しないとわからない ■ 管理画面へのアクセスに社内VPNが必須 ○ 何かあったらSSHで入って調査 ○ EC2のパッチ適用 ○ 等々

Slide 20

Slide 20 text

20 © SMS Co., Ltd. ここまでのまとめ ● なぜJenkinsから脱却したいという流れになったかを説明しま した ○ おまけが作業のメインになる稀によくあるやつです

Slide 21

Slide 21 text

21 © SMS Co., Ltd. 01 02 03 04 05 06 今回のシステムの説明 なぜJenkinsから脱却したい流れになったか 実行していたバッチ処理の概要 rakeコマンドを実行しているバッチの移行 mysqlコマンドをどうするか まとめ 目次

Slide 22

Slide 22 text

22 © SMS Co., Ltd. 実行しているバッチ処理の整理

Slide 23

Slide 23 text

23 © SMS Co., Ltd. 整理して分かったこと ● rakeコマンドを実行しているバッチがほとんど ● 一部mysqlコマンドを実行しているものがある

Slide 24

Slide 24 text

24 © SMS Co., Ltd. 01 02 03 04 05 06 今回のシステムの説明 なぜJenkinsから脱却したい流れになったか 実行していたバッチ処理の概要 rakeコマンドを実行しているバッチの移行 mysqlコマンドをどうするか まとめ 目次

Slide 25

Slide 25 text

25 © SMS Co., Ltd. rakeコマンドを実行しているバッチの移行方針で考えたこと ● 実行について ○ ECS run taskが実行できれば問題ない ■ タスク定義のoverrideができるのでrakeコマンド実行 できる ● 既存のimageがそのまま使えそう ○ 定期実行が主体なので、EventBridge Schedulerは必須 ■ 直接叩いてもいいかも

Slide 26

Slide 26 text

26 © SMS Co., Ltd. rakeコマンドを実行しているバッチの移行方針で考えたこと ● エラー制御について ○ リトライ制御はStep Functionsを使った方が制御が楽 ○ Step Functionsの失敗でよければエラー通知も楽できそう ● 通知系 ○ エラー時はSlack通知したい ○ EventBridgeで拾えると既存の通知系に載せられる

Slide 27

Slide 27 text

27 © SMS Co., Ltd. アーキテクチャ図

Slide 28

Slide 28 text

28 © SMS Co., Ltd. 実装 Step Functions

Slide 29

Slide 29 text

29 © SMS Co., Ltd. Run Taskの実装

Slide 30

Slide 30 text

30 © SMS Co., Ltd. 実装 EventBridge Scheduler

Slide 31

Slide 31 text

31 © SMS Co., Ltd. 実装 EventBridge SchedulerのTerraformコード

Slide 32

Slide 32 text

32 © SMS Co., Ltd. 実装 EventBridge SchedulerのTerraformコード(module)

Slide 33

Slide 33 text

33 © SMS Co., Ltd. 実装 EventBridge SchedulerのTerraformコード(module)

Slide 34

Slide 34 text

34 © SMS Co., Ltd. 実装 EventBridge rule(エラー通知)

Slide 35

Slide 35 text

35 © SMS Co., Ltd. これだけで動きます AWS Step Functions最高

Slide 36

Slide 36 text

36 © SMS Co., Ltd. 移行してみてどうだったか ● EventBridge Schedulerの設定を追加するだけでバッチ処理が 移行できるのは控えめに言っても最高 ● 複数コマンドも実行できる ● エラー通知がデフォルトだとわかりにくいが、Transformerで 整形したらまともになった

Slide 37

Slide 37 text

37 © SMS Co., Ltd. 修正した通知内容の比較 変更前 変更後

Slide 38

Slide 38 text

38 © SMS Co., Ltd. トランスフォーマの定義(入力パス) {"executionArn":"$.detail.executionArn","input":"$.detail.input","nam e":"$.detail.name","status":"$.detail.status"}

Slide 39

Slide 39 text

39 © SMS Co., Ltd. トランスフォーマの定義(出力テンプレート) { "content": { "description": "*Status*\n\n\n*Input*\n``````\n\n|More Details>", "textType": "client-markdown", "title": ":x: `` failed to execute" }, "source": "custom", "version": "1.0" }

Slide 40

Slide 40 text

40 © SMS Co., Ltd. (再掲)修正した通知内容の比較 変更前 変更後

Slide 41

Slide 41 text

41 © SMS Co., Ltd. 移行中に発生したトラブル集 ● 同時刻にバッチ処理多数実行したらECS runTaskのAPIスロッ トリングが発生 ● 対策 ○ Step Functionsのワークフローにランダムに遅延させる処 理を追加 ○ ECS runTaskにもリトライ設定を追加 ● Jenkinsの場合は、実行時刻設定でHを指定するとジョブ名の ハッシュ値になる仕様があり適宜バラされて実行していた ○ しかもEC2なのでCPU、MEMの限界まで実行可能だった

Slide 42

Slide 42 text

42 © SMS Co., Ltd. 注意事項 ● タスク単位にリトライ処理を入れる場合は、タスクの内容が冪 等である必要があります ○ というかバッチ処理はできるだけ冪等にしましょう

Slide 43

Slide 43 text

43 © SMS Co., Ltd. 実装 Step Functions EventBridge Scheduler のフレックスタ イムウィンドウでも実現可能ですが、Step Functionsに寄せることでTerraformコー ドをシンプルにしたかった

Slide 44

Slide 44 text

44 © SMS Co., Ltd. 実装 Step Functions

Slide 45

Slide 45 text

45 © SMS Co., Ltd. ここまではできた あとはmysqlコマンドをどうするか

Slide 46

Slide 46 text

46 © SMS Co., Ltd. 01 02 03 04 05 06 今回のシステムの説明 なぜJenkinsから脱却したい流れになったか 実行していたバッチ処理の概要 rakeコマンドを実行しているバッチの移行 mysqlコマンドをどうするか まとめ 目次

Slide 47

Slide 47 text

47 © SMS Co., Ltd. mysqlコマンドのバッチ移行で考えたこと ● どう実装するか ○ mysqlコマンド実行のためだけにEC2は立てたくない ○ Lambdaは書きたくない ○ CloudShellは自動化できない ○ Fargateだったらなんでもできるな ● 移行方針 ○ Step Functions+ECS Fargate に決定!

Slide 48

Slide 48 text

48 © SMS Co., Ltd. mysqlコマンドを実行できるimageを作る(1) ● LLMに作ってもらってシュッとできたように見えたが ○ AmazonLinux2023だとmariadbしかシュッとは入らない ○ user追加しようとしたらuseraddがない ○ ・・・ ○ 追加できたけどシークレットに登録されていたのは接続 URLでmysqlコマンドに必要なHOST、USER、PASSWORD がなかった

Slide 49

Slide 49 text

49 © SMS Co., Ltd. mysqlコマンドを実行できるimageを作る(2) ● mysqlコマンドではなくmysqlshに路線変更 ○ 接続URLが使えるmysqlshコマンドを実行できる環境を 作ってみた ■ やってみたらmysqlshコマンドではやりたいことがで きなかった ■ スタートに戻る

Slide 50

Slide 50 text

50 © SMS Co., Ltd. mysqlコマンドを実行できるimageを作る(3) ● 接続URLを分解して環境変数にあげてみる (機密情報を複数持ちたくなかった) ○ shを作ってENTRYPOINTに指定してみた ■ ENTRYPOINTとCMDを両方指定するとエラーになる ■ CMDがENTRYPOINTの引数として実行されるので、sh の末尾のexec "$@"がないとエラーになる ● shの末尾にexec "$@"を追加した

Slide 51

Slide 51 text

51 © SMS Co., Ltd. mysqlコマンドを実行できるimageを作る(4) ● ecs execでコンテナに入ってみた ○ 環境変数がセットされない ○ ENTRYPOINTのプロセスとecs execの親プロセスが違うの でexportしても環境変数が参照できない ■ 起動時に実行するシェルで /etc/profile.d/dbvars.shに環境変数としてexportする ワンライナーを書いた ログイン後にsourceコマンドや、コマンド実行前にシェル を実行すれば環境変数にセットされますが、バッチ処理で 毎回するのは手間なので、省けるようにこだわりました

Slide 52

Slide 52 text

52 © SMS Co., Ltd. mysqlコマンドを実行できるimageを作る(5) ● こんどはpermission error ○ 起動はroot以外のユーザーだったので/etc/profile.dに対す る書き込み権限がなかった ■ Dockerfileで '. /workspace/eval.sh' > /etc/profile.d/dbvars.sh して/workspace/eval.shを書き換える方針に変更

Slide 53

Slide 53 text

53 © SMS Co., Ltd. mysqlコマンドを実行できるimageを作る(6) ● やはり環境変数にセットされない ○ 非ログインシェルで入ったので/etc/profile.dが読まれな かった ■ ログインシェルで入るようにした (bash -l -c) ■ 完了

Slide 54

Slide 54 text

54 © SMS Co., Ltd. できたコード(Dockerfile)

Slide 55

Slide 55 text

55 © SMS Co., Ltd. できたコード(Dockerfile)

Slide 56

Slide 56 text

56 © SMS Co., Ltd. できたコード(eval.sh)

Slide 57

Slide 57 text

57 © SMS Co., Ltd. 01 02 03 04 05 06 今回のシステムの説明 なぜJenkinsから脱却したい流れになったか 実行していたバッチ処理の概要 rakeコマンドを実行しているバッチの移行 mysqlコマンドをどうするか まとめ 目次

Slide 58

Slide 58 text

58 © SMS Co., Ltd. まとめ ● AWS Step Functionsは、バッチジョブのクラウドシフトに最 適なツール ● 「mysqlコマンドの実行」のようなレガシーな課題も、工夫次 第でクラウドネイティブに実行可能 ● 「the elephant in the room」のような認識しているが、大 きすぎて無視しているような課題も、粘り強く対応すれば解決 の糸口が見つかるかも

Slide 59

Slide 59 text

59 © SMS Co., Ltd. 今回のポストモーテム ● 機密情報を複数持ちたくない・メンテしたくないというところ に目をつぶればこんなに苦労しなかったかも