Copilot CLIでWordPress on Docker その2
Copilot CLIでWordPress on Dockerの続き。
プラグインとテーマのインストール(と更新)
プラグインとテーマファイルの準備
インストールしたいプラグインをローカルのenv/production/plugins以下に、同じくテーマをenv/production/themes以下にダウンロードして置く。
Dockerfileの修正
FROM wordpress:5.9.3
COPY env/production/config/wp-config.php /var/www/html/wp-config.php
RUN rm -rf /var/www/html/wp-content/plugins
COPY env/production/plugins /var/www/html/wp-content/plugins
RUN rm -rf /var/www/html/wp-content/themes
COPY env/production/themes /var/www/html/wp-content/themes
公式イメージに最初から入ってるpluginsとthemesを削除して、自分で自分で準備したものに差し替えるかんじ。
デプロイ
copilot svc deploy --name wordpress --env staging
ファイルは設置されたのでWordPressの管理画面からインストールすればOK。
プラグインやテーマの更新
プラグインやテーマの更新は、ローカルのファイルを更新してデプロイ。
このローカルに置いてあるファイルが正となるのでgitなどでバージョン管理しておくといいでしょう。
WordPressの管理画面から更新ポチポチはしないし、プラグインやテーマの自動更新も有効にはしない。
理由としては以下のWordPressの更新と同様。
WordPressの更新
ついでにWordPress本体の更新をどうするかと言う話。
これはWordPressのバージョンアップが出たらDockerfileを修正して再デプロイが基本。
コンテナ運用の場合は現時点で動いているコンテナではなく、Dockerfileが正ということになるので、コンテナの方を更新してもいつ元に戻るか分からない。
再デプロイしたり、コンテナが何かの原因で死んで再生成されたり、スケールで増えたりするとDockerfileで記述されたバージョンに戻る。
これによって自動アップデートの恩恵を受けられなくなるのは弱み。
下手するとセキュリティホール放置なんてことになりかねない。
メジャーバージョンも上がっていいなら公式イメージでwordpress:latestを使いつつ自動更新有効でいいが、メジャーバージョンの自動更新はさすがに怖すぎる。プラグインとかテーマとかなぎ倒すことがあるので。
バージョンアップを検知してCI/CDパイプラインを組むとこまでいければいいのかもしれない。
既存のWordPressのDBをインポート
今までは新規構築の話だったが、移行するケースの場合はDBのインポートをアドホックにコンテナ上から行う。
移行元からmysqldumpしてzipで固めたmysql_dump.sql.zipを使ってインポートする想定。
Dockerfileの修正
FROM wordpress:5.9.3
COPY env/production/config/wp-config.php /var/www/html/wp-config.php
RUN rm -rf /var/www/html/wp-content/plugins
COPY env/production/plugins /var/www/html/wp-content/plugins
RUN rm -rf /var/www/html/wp-content/themes
COPY env/production/themes /var/www/html/wp-content/themes
RUN apt-get update && apt-get install -y default-mysql-client unzip
COPY env/production/mysql_dump.sql.zip /var/www/html
RUN unzip /var/www/html/mysql_dump.sql.zip
インポートするためにmysqlコマンドが必要になるので、それを使えるようにするついでにMySQLのダンプファイルもコンテナにコピーする。
デプロイ
copilot svc deploy --name wordpress --env staging
コンテナ内に入ってmysqlコマンド
copilot svc exec
素晴らしいことにこれでWordPresssの動いているコンテナ内に入れるので、mysqlコマンドでインポート。
mysql -u admin -h my-wordpress-staging-wordpre-wordpressdbdbcluster-xxxxxxxxxxxx.cluster-xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -p wordpress_db < mysql_dump.sql
DBの接続情報は環境変数に入っているのでenvで確認できる。
Dockerfileを元に戻す
インポートは一度やったら二度とやらないのでDockerfileは元に戻しておく。デプロイもしなおしておくと完璧。
残りのタスク
- S3でメディアファイルを配信
- ログをCloudWatch Logsに流す
- メールをSESで配信する
- 本番環境の構築
メール配信どうするのって話が生えてきた。