ec2上で動いているphpを、amazonlinux2023に載せ替えてバージョンアップする(途中)
この記事を書こうと思ったきっかけ
phpのバージョンアップ初経験で、awsのコンソールを触るのも初めてだったため、手順書的な意味で整理したく書きました。まだ途中ですが、同じような作業が待ち受けている方がいれば。。
全体図
現状の構成
ec2にインスタンス2個、手前にclbを置いてコントロールしている
基本はphpに流入させて、rsyncで定期的にphp2と同期させている
phpは7.4
サーバーはapache
移行後の構成(予定)
インスタンスは1つ。
手前にalbを置いてコントロールする
amazonlinux2023はphp8.2
手順
まずはphpをrectorでバージョンアップする
新サーバーにアップして、route53の加重ルーティングでドメインを切り替える
bugsnagでエラーを監視して、エラーに随時対応!!!
この方針になった背景
機能数、ファイル数が膨大なので、全てをテストするには時間がかかりすぎる。
apiなどもありテスト用mockを作るのもコストがかなり掛かる。。
経過は?
2点引っかかりました。
・ドメインの設定をcnameにしていたため、環境が切り替わっていなかった。
・見えていなかった仕様があり、414エラーが出た!
解決した?
・ドメインの設定をcnameにしていたため、環境がきりかわっていなかった。
→Aレコードに設定することで解決
・見えていなかった仕様があり、414エラーが出た!
→クエリ文字列の最大数を10万字にしていたらしいが、ALBでは最大文字数を変更できない。
→よってCLBに変更!!!現行サーバーの設定を反映してテスト中です。
手順詳細
rectorとは
phpの静的解析ツール。バージョンごとのルールを設定できるほか、任意のルールを設定することも出来る。
return static function (RectorConfig $rectorConfig): void {
$rectorConfig->paths([
__DIR__ . '/api',
__DIR__ . '/include',
]);
// register a single rule
$rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class);
// define sets of rules
$rectorConfig->sets([
LevelSetList::UP_TO_PHP_82
]);
};
composer require rector
で導入、
vendor/bin/rector process --dry-run
で変更箇所の確認、
良さそうならvendor/bin/rector process
で実行!
これで変更完了!
bugsnagを導入
new projectを作成・取得したapi key をindex.phpに埋め込む。
(構成的に、このプロジェクトのほぼ全てはindex.phpを通るので)
bugsnagのエラーを制御する
普通にやると変数のエラーがでまくるので、undefinedのものは表示しないようにする
$bugsnag = Bugsnag\Client::make('apiキー');
$bugsnag->registerCallback(function ($report) {
return !preg_match('/^Undefined/', $report->getMessage());
});
Bugsnag\Handler::register($bugsnag);
ドメインの切り替え
route53を使って、加重ルーティングを使って切り替える。
まずはコードをamazonlinux2023にアップする
albを作成してセキュリティグループを設定
リスナーグループにルールを追加する
virtualhosts.confを設定する
1つのサーバーに6つのドメイン+cron群を乗せるので、振り分けられるよう設定
route53の加重ルーティングを設定
元々あるドメインのルーティングポリシーを加重にして、重量1で設定
同じドメインのレコードを作成し、トラフィックのルーティング先を新albへ向け、重量0で設定
ここまで設定したら、自分のhostsにalbのipアドレス設定したりして、アクセスできるか確認。
よし!!!切り替えだ!!!!と思いきや
ここまで来たら新サーバーに向いているレコードの重量を1にして、現行サーバーにむいているレコードを0にするだけ!!!
と思いきや。。。
先方に「できていないみたいですが」と言われる
重量は切り替えているのに何故…?
調べると、cnameは同名のレコード複数存在できない仕様になっている。
同じドメイン名の CNAME レコードは登録できません。
レコードタイプが CNAME でない場合も、同じドメイン名のレコードは登録できません。
どちらもAレコードに設定変更して切り替えられました。
新たな仕様判明
切り替えました!と元気よく報告した後
aws公式ドキュメントによると、ALBの最大文字数は変えられない模様
The following size limits for Application Load Balancers are hard limits that cannot be changed
他にも見えていない仕様が存在する可能性があったため、現行を踏襲してCLBを使用することに。
現行サーバーの設定を移行し、テスト中。
まとめ
バックエンドまわりというかAWSのコンソールにも初めて本格的に触るようになり、大変勉強になっています。
ネットワークについての知識が足りておらず、ロードバランサーの種類についてもよくわからない部分が多かったので、おすすめの参考書あれば教えてください!
Discussion