【AWS】EC2＋RDSを使用したRedmine構築（エラー発生時の備忘録含む）

## はじめに
　今回は、AWSコンソール上にEC2とRDSを作成し、その上でRedmine手動構築（Linux + Apache + Passenger + Redmine）を行うハンズオンとなります。詰まった部分がありますので、備忘録として共有させていただきます。（見づらかったらすいません。。。）
 ※ちなみに、ChatGPT4oを使用しての構築作業となります。

## 構成概要
| サービス       | 用途                          |
| ---------- | --------------------------- |
| EC2        | Redmineアプリケーションサーバー（Webサーバ） |
| RDS（MySQL） | Redmineのデータベース              |

## 前提条件
・EC2：Amazon Linux 2 または Ubuntu 20.04（ここでは Amazon Linux 2 で進行）

・RDS：MySQL 8.0

・Redmineバージョン：5.1系推奨

## 構築手順
１．EC2インスタンス作成（Amazon Linux 2）
２．RDS（MySQL）インスタンスの作成
３．EC2内にRedmineをインストール
４．Passenger + Apacheの設定
５．ブラウザで確認


１．EC2インスタンス作成（Amazon Linux 2）
・Amazon Linux 2 を選択

・インスタンスタイプ：t2.micro（無料枠）使用　※t3.small以上推奨

・セキュリティグループで以下を許可
　TCP 22 (SSH)
　TCP 80 (HTTP)

２．RDS（MySQL）インスタンスの作成
RDS > 「データベース作成」

エンジン：MySQL

DBバージョン：8.0

DBインスタンス識別子：redmine-db

マスターユーザー：admin

パスワード：任意（控えておく）

パブリックアクセス不可

セキュリティグループにEC2のアクセスを許可

３．EC2内にRedmineをインストール
① 依存ライブラリのインストール
```sudo yum update -y
sudo yum install -y gcc gcc-c++ make zlib-devel curl-devel openssl-devel httpd-devel mariadb-devel git
```

② Ruby（rbenv + ruby-build）
```sudo yum install -y git
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init - bash)"' >> ~/.bash_profile
source ~/.bash_profile

git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 3.2.2
rbenv global 3.2.2
```

【備忘録】
rbenv install 3.2.2コマンド実行時エラー発生、
エラー内容：Ruby 3.2.2 を rbenv でインストールする際に 必要なネイティブライブラリが不足しているため に一部の拡張（fiddle, psych, readline）がビルドできず、最終的にビルド失敗していた模様
 解決手順：以下のコマンドで必要な開発パッケージを追加インストール
 
```
sudo yum install -y gcc gcc-c++ make \
  openssl-devel readline-devel zlib-devel \
  libffi-devel libyaml-devel \
  bzip2 tar git

```
上記ののエラーで必要なのは以下のパッケージです。
| 拡張機能     | 解決するパッケージ        |
| -------- | ---------------- |
| fiddle   | `libffi-devel`   |
| psych    | `libyaml-devel`  |
| readline | `readline-devel` |

```
③ Redmine本体のダウンロード
```cd /var/www
sudo git clone https://github.com/redmine/redmine.git -b 5.1-stable redmine
cd redmine
```
④ データベース設定
```
cp config/database.yml.example config/database.yml
vi config/database.yml
```
【編集内容】
```
production:
  adapter: mysql2
  database: redmine
  host: ＜RDSエンドポイント＞
  username: admin
  password: ＜RDSパスワード＞
  encoding: utf8mb4
```
【備忘録】
/var/www/redmine配下の実行権限がないため、redmineインストール後に権限付与
```
chmod 777 /var/www/redmine
```

⑤ Gem・Bundle設定
```gem install bundler
bundle config set --local without 'development test'
bundle install

```
【備忘録】
bundle installコマンド実行時、エラー発生
エラー内容：nokogiri のプリコンパイル済みバイナリ（gem）が、Amazon Linux 2 の GLIBC バージョンと互換性がないこと
※Amazon Linux 2 の glibc は通常 2.26 です。しかし nokogiri のバイナリは GLIBC_2.28 以上を必要としているそうです。
解決方法：
| 方法    | 内容                                 | 難易度 | 推奨度          |
| ----- | ---------------------------------- | --- | ------------ |
| ✅ 方法① | Nokogiri のバージョンを 1.15.7 に下げる       | 低   | ◎ 初心者にもおすすめ  |
| 方法②   | libxml2 をソースからビルドしてインストール          | 中〜高 | ◯ 理解ある人向け    |
| 方法③   | OSを Amazon Linux 2023 や Ubuntu に変更 | 中   | ◯ 新規環境ならおすすめ |

今回は、➀を採用しました。
 方法①：Nokogiri のバージョンを下げる
 ・Gemfile を以下のように修正
 ```
 gem 'nokogiri', '~> 1.15.7'
 ```
 ・そのあとの操作
 ```
 bundle config --delete build.nokogiri
bundle install --redownload --force
```
※bundle show nokogiri の出力が -x86_64-linux-gnu でなければ成功です。
 

⑥ 初期化コマンド
```
RAILS_ENV=production bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data
```
【備忘録】
RAILS_ENV=production bundle exec rake generate_secret_tokenコマンド実行時、エラー発生
エラー内容：
```secret_token.rb ファイルを書き込もうとしたが、現在のユーザー（おそらく ec2-user）に書き込み権限がない
Errno::EACCES: Permission denied @ rb_sysopen - /var/www/redmine/config/initializers/secret_token.rb
```
解決方法：
➀Redmineディレクトリの所有者を ec2-user に変更
```
sudo chown -R ec2-user:ec2-user /var/www/redmine
```
➁再実行
```
cd /var/www/redmine
bundle exec rake generate_secret_token
```
【備忘録】
RAILS_ENV=production bundle exec rake db:migrateコマンド実行時エラー発生
エラー内容：Redmine が接続しようとしている MySQL データベース redmine がまだ存在していない
```
ActiveRecord::NoDatabaseError: Unknown database 'redmine'
```
解決方法：
➀MySQLクライアントをインストール
```
sudo yum install -y mariadb
```
➁RDSに接続
```
mysql -h <RDSのエンドポイント> -u admin -p
```
➂データベース作成
```
CREATE DATABASE redmine CHARACTER SET utf8mb4;
EXIT;
```
４．Passenger + Apacheの設定
```
sudo yum install -y httpd
gem install passenger
passenger-install-apache2-module
```
【備忘録】
passenger-install-apache2-moduleコマンド実行時エラー発生
エラー内容：C++ コンパイラ（g++）がコンパイル中にメモリ不足で強制終了された
```
c++: internal compiler error: Killed (program cc1plus)
```
※ EC2 t2.micro や t3.micro のような 低メモリインスタンス（1GB RAM） ではよくある問題らしいです。
解決方法：スワップ領域を追加する。
➀スワップファイルを作成（1GB〜2GB 推奨）
```
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```
➁再実行
```
passenger-install-apache2-module
```
【httpd.conf に追加】
LoadModule passenger_module /home/ec2-user/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.17/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
   PassengerRoot /home/ec2-user/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.17
   PassengerDefaultRuby /home/ec2-user/.rbenv/versions/3.2.2/bin/ruby
</IfModule>

<VirtualHost *:80>
   ServerName redmine.local
   DocumentRoot /var/www/redmine/public
   <Directory /var/www/redmine/public>
      Require all granted
      Options -MultiViews
   </Directory>
</VirtualHost>
```
【Apache再起動】
```sudo systemctl start httpd
sudo systemctl enable httpd
```
５．ブラウザで確認
・http://<EC2のパブリックIP> にアクセス

・ログイン：admin / admin

・初回ログイン時にパスワード変更画面が表示されます


## おわりに
予期せぬエラーが発生して、何度もやり直しして、心が折れそうになりましたが、ChatGPTを活用して構築を進めていくと、エラーが発生した時の解決までの理解が深まりました。
この備忘録をもとにきれいな構築手順を次回は画像付きで作成させていただきます。