カヤック技術部の竹田です
この記事は面白法人グループAdvent Calendar 20252日目の記事になります
ちょうど1年前の2024/12/2の記事 レガシーサーバーをコンテナで再構築した、その5年後の移行と解体 の報告です。
爆破解体(未完)のその後を書くぞ!
これまでのあらすじ
ここ数年に渡り社内のサービスを近代化・廃止してきた
- レガシーサーバーを現代の技術で再構築(6年前)
- この際廃止できるものは廃止してついでに運用コストも削減。必要なものはCloudFront + Lambda + S3 で構築し直した (1年前)
最終的に Redmine だけが残り、爆破解体待ちの状態となった

:
:
:
果たして爆破解体すべきか否か
Redmine はいずれ廃止する予定でしたが、過去のチケットやプロジェクトを参照する機会が稀にあり、完全に削除すると業務上の支障が出ます。 そこで 要件を整理し絞りつつ存続させる方針に変更しました。
- 整理した要件
- 新規利用や更新を行うことはない
- 稀に過去プロジェクト・チケットを確認したいことがある
- 利用者は一部
さらなるコストの削減
閲覧頻度は月に数回程度。この用途で ECS+RDS を維持するのは明らかに非効率なので、Lambda Web Adapter(LWA)+ Aurora Serverless v2 へ移行し、コスト最適化を狙います。
Lambda Web Adapter でウェブアプリを (ほぼ) そのままサーバーレス化する
移行への課題
長年動き続けた Redmine を近代化しつつLWAへ移行するには、いくつか解決すべきポイントがあります。
Redmineのアップグレード
稼働中の Redmine Version 3 は、最新のプラグインやセキュリティ要件に対応できておらず、このまま安全性を確保できない運用を続けるのは難しい状況でした。
そこで Version 6 へのアップグレードに着手。Dockerfile にマイグレーション処理を組み込み、イメージをビルドしながら移行を進めます。
一発成功とはいかず、古いプラグイン由来のエラーやスキーマ差分などに対処し最終的に安定した環境へ移行できる形になりました。
MySQLのバージョンアップ
Amazon Aurora Serverless v2 は MySQL 8.0 互換エンジンのため MySQL 5.7 のままでは移行できません。
そのため DB スキーマをダンプし手元で再構築、 MySQL 8.0 へマイグレーションを繰り返しスキーマとデータを整えました。
mysql> select * from wiki_pages order by id; +----+---------+-----------------------------------+---------------------+-----------+-----------+ | id | wiki_id | title | created_on | protected | parent_id | +----+---------+-----------------------------------+---------------------+-----------+-----------+ | 1 | 8 | Wiki | 2010-04-09 15:22:24 | 0 | NULL | | 2 | 7 | Wiki | 2010-04-12 10:08:05 | 0 | NULL | | 3 | 8 | サイト、Subversion情報 | 2010-04-14 11:13:34 | 0 | NULL | ...
"Subversion" の文字が、、、時の経過を感じます。
Lambda Web Adapter (LWA) への対応
LWAで実行するためには、いくつかのハードルがあリます。
- ストレージは基本読み取り専用
- /tmpディレクトリは書き込み可能だが、実行はLambdaのライフサイクルに依存するので短時間で破棄される
- 公式にはRedmine (Rails) に対応していない?ので工夫が必要
対応するためにコードの修正と設定の変更を行いました。
- キャッシュの無効化(ファイル書き込みのスキップ)
- ログの出力先をファイルから標準出力に変更
- public/ディレクトリの静的ファイル(画像/CSS/JS)をアプリケーションで配信する設定
- Lambda Adapter を Dockerfile に追加し LWA を有効化
# Dockerfileに追加 Lambda内部プロセス(Rapid)と接続するための拡張機能 COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.0 /lambda-adapter /opt/extensions/lambda-adapter
認証方法について
現状のID/パスワードをリセットしアカウント自体を無効化しました。20年近く使い続けているアカウント情報とようやくオサラバ👋
利用者には新しいID/パスワードを発行し二段階認証を必須とします。
Lambda Web Adapter (LWA) へデプロイ
各課題をクリアしビルドできました。ビルドイメージをECRにプッシュしたら次はデプロイです。
LWAへのデプロイには lambrollを使用します。
function.json で "PackageType":"Image" と "ImageUri": "..." を指定するだけでLWA対応はOKです。
{
"FunctionName": "redmine-comeback",
:
"PackageType": "Image",
:
"Code": {
"ImageUri": "xxxxxxxxxxxxxxxxxxxx.ecr.ap-northeast-1.amazonaws.com/redmine-xxxxxxxx:latest"
}
}
まとめ
昨年の記事通りに無事に爆破解体することができました。

2025年12月現時点では、最小構成で再生し必要な時だけ起動する仕組みに生まれ変わっています。
CloudFront → Lambda Function URL → Lambda Web Adapter → Redmine

次にあるとすれば、いよいよ本当の解体かもしれません。

明日は id:rtshaaaa さんの記事になります。