こんにちは、ピクトリンク開発で運用保守を担当している藤本です。
今回は、Rundeck を EC2 から ECS に移行する際にハマったポイントをまとめます。
その①では、環境変数・CDK・entrypoint 周りのトラブルと解決策を紹介します。
1. はじめに
Rundeck はこれまで Amazon Linux 2 の EC2 上で運用していました。しかし、Amazon Linux 2 は EOL(サポート終了)を迎える予定で、OS アップデートやサポート継続の観点から見直しが必要になりました。
単純に EC2 を作り直して OS を入れ替える方法もありましたが、
- OS バージョンアップ時の作業負荷が高い
- 構築手順が手作業中心で、属人性が高くヒューマンエラーのリスクがある
- 設定変更の影響範囲が分かりづらい
といった課題も以前から感じていました。
そこで今回、EOL 対策をきっかけに Rundeck を ECS 上で動かす構成を試すことにしました。
2. ECS 化の前提条件
今回の ECS 化は 既存 EC2 版 Rundeck と同じ RDS を利用する前提で進めています。
そのため、ECS 側は「新規構築」ではなく、既存環境と設定・データを共有しながらの移行になります。
Dockerfile では、公式 Rundeck 5.17.0 イメージをベースに使用しています。
# ベースイメージ FROM rundeck/rundeck:5.17.0
3. ハマったポイント①:CDK だけでは環境変数が反映されない
Rundeck は起動時に DB 接続情報などの環境変数を読み込みます。
CDK で以下のように ecs.Secret.fromSecretsManager を設定しました。
secrets: {
RUNDECK_DATABASE_URL: ecs.Secret.fromSecretsManager(rdsSecret, 'host'),
RUNDECK_DATABASE_USER: ecs.Secret.fromSecretsManager(rdsSecret, 'username'),
RUNDECK_DATABASE_PASSWORD: ecs.Secret.fromSecretsManager(rdsSecret, 'password'),
},
しかし、このままでは コンテナ内で環境変数が読み込まれないという問題に直面しました。
解決策:entrypoint.sh で export
CDK の secrets は ECS タスク起動時に SecretManager から値を渡しますが、Rundeck の起動スクリプトが直接読み込めない場合があります。
そこで entrypoint.shを作成し、明示的に環境変数を export しました。
#!/bin/bash
export RUNDECK_DATABASE_URL="jdbc:mysql://${RUNDECK_DATABASE_URL}:3306/rundeck"
export RUNDECK_DATABASE_USERNAME="${RUNDECK_DATABASE_USER}"
export RUNDECK_DATABASE_PASSWORD="${RUNDECK_DATABASE_PASSWORD}"
Dockerfile 側では、ENTRYPOINT と CMD を指定します。
# entrypoint を先に呼び出す ENTRYPOINT [ "docker-lib/entrypoint.sh" ] CMD [ "docker-lib/entry.sh" ]
まとめポイント
- CDK の ecs.Secret.fromSecretsManager だけでは不十分なケースがある
- entrypoint で環境変数を明示的に export することで Rundeck 起動時に反映される
- ECS では「OS 上で export」や「systemd に書く」よりも entrypoint で一元管理 が安定
4. ハマったポイント②:LDAP 設定ファイルの配置場所
Rundeck では LDAP 認証を導入していたため、ECS で Rundeck を動かす際には LDAP 設定もコンテナ内で扱う必要がありました。 しかし、Dockerfile で Rundeck の LDAP 設定をコピーしても、
/home/rundeck/server/config配下だと起動時に上書きされてしまう
という問題がありました。
解決策:設定ファイルは /etc/remco/templates/ 配下に配置
これはコンテナ起動時に docker-lib/entry.shが実行されるためです。
設定ファイルは /etc/remco/templates/ 配下に置くことで、上書きされなくなります。
# LDAP設定
COPY jaas-loginmodule.conf /etc/remco/templates/jaas-loginmodule.conf
RUN chown rundeck:rundeck /etc/remco/templates/jaas-loginmodule.conf \
&& chmod 640 /etc/remco/templates/jaas-loginmodule.conf
- コンテナ再起動しても上書きされない
- Rundeck 起動時に自動的に反映される
5. 記事①のまとめ
- Amazon Linux 2 の EOL 対策が ECS 化の主な理由
- CDK だけでは環境変数が反映されないケースがある
- entrypoint.sh で明示的に環境変数を export する
- LDAP 設定ファイルは /etc/remco/templates/ に置くと上書きされない
次回の記事②では、SSH / resources.xml / Network Error など、ノード周りでハマった話をまとめます。