🕛

ec2上で動いているphpを、amazonlinux2023に載せ替えてバージョンアップする(途中)

2024/02/09に公開

この記事を書こうと思ったきっかけ

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 でない場合も、同じドメイン名のレコードは登録できません。

https://blog.serverworks.co.jp/route53-zone-apex-cname-alias-record#DNS-のレコードタイプについて

どちらもAレコードに設定変更して切り替えられました。

新たな仕様判明

切り替えました!と元気よく報告した後

aws公式ドキュメントによると、ALBの最大文字数は変えられない模様

The following size limits for Application Load Balancers are hard limits that cannot be changed

https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html

他にも見えていない仕様が存在する可能性があったため、現行を踏襲してCLBを使用することに。
現行サーバーの設定を移行し、テスト中。

まとめ

バックエンドまわりというかAWSのコンソールにも初めて本格的に触るようになり、大変勉強になっています。

ネットワークについての知識が足りておらず、ロードバランサーの種類についてもよくわからない部分が多かったので、おすすめの参考書あれば教えてください!

Discussion