以前、WordPress.comで予約投稿が失敗したときの対策は「現時点では予約している時間になったらアクセスしてみて、投稿されていないようだったら手動で再投稿するという方法しかない」と言ったな。あれは嘘だ。
実は「wp-cron.php」を定期的に実行する方法がある。幸い、「wp-cron.php」は外部からアクセスが可能なので、ブラウザーなどからアクセスしてしまえばいい。ただ、定期的にアクセスすることを手動でやるのは面倒だし現実的ではない。そこでAWSのLambdaを使って、「wp-cron.php」にアクセスする関数を作って定期的に実行するように設定すればいい。
いや、自分が何を言っているのかはわかっているつもりだ。馬鹿なことを考えていることは承知している。せっかく、AWSにセルフホスティングしていたWordPressを、サービスとして運営しているWordPress.comに移行してきたのに、またAWSに頼ろうとしている。わかっているのだ。でも、思いつくのはこの方法しかない。
Lambdaはサーバーレスでプログラムを実行してくれるサービスだ。普通、プログラムを実行するにはサーバーが必要だ。そこに必要なソフトウェアをインストールして、はじめてプログラムを実行することができる。でも、Lambdaを使えばサーバーは用意する必要がない。EC2にインスタンスを作る必要がないのだ。サーバーを用意するよりコスト削減になるし、サーバーのメンテの手間もなくなる。
サポートされている言語はC#、Python、Node.js、PowerShell、Ruby、Javaなど。
普段使っているのはC#だけど、今回はPythonを使ってみることにした。
作ったコードは以下の通り。
import json
def lambda_handler(event, context):
# TODO implement
import urllib.request
response = urllib.request.urlopen('https://kosu.blog/wp-cron.php')
code = response.getcode()
ctype = response.info()['Content-Type']
server = response.info()['Server']
date = response.info()['Date']
exp = response.info()['Expires']
return {
'statusCode': code,
'contentType': ctype,
'server': server,
'date': date,
'expires': exp
}
実行すると以下のような結果になる。
Response:
{
"statusCode": 200,
"contentType": "text/html; charset=utf-8",
"server": "nginx",
"date": "Sat, 23 Nov 2019 09:15:36 GMT",
"expires": "Wed, 11 Jan 1984 05:00:00 GMT"
}
せっかくなので、レスポンスの結果をいろいろ出してみた。まあ、ただ実行すればいいだけなので、戻り値は固定でもいいわけだけど。
さらにこの関数が定期的に実行されるように設定する必要がある。AWS Lambdaの関数の画面から「トリガーを追加」ボタンでトリガーを追加できる。

トリガーの名前は適当に設定して、ルールタイプを「スケジュール式」にして以下の設定を書く。
cron(0/5 * * * ? *)
「cron(分 時 日 月 曜日 年)」というルールで書く。上の書き方は「0分に開始して5分おき」に実行という意味だ。これは以下のようにも書ける。
cron(0,5,10,15,20,25,30,35,40,45,50,55 * * * ? *)
また、毎日決まった時間にしたい場合、例えば10時30分に事項したい場合は次のようになる。
cron(30 10 * * ? *)
毎月1日の0時0分の場合はこんな感じ。
cron(0 0 1 * ? *)
cronの説明はこのぐらいでいいかな。詳細は以下を参照のこと。
Schedule Expressions for Rules – Amazon CloudWatch Events
トリガーを作成するとき、デフォルトでトリガーを有効にするチェックが入っているので、そのまま追加すれば関数は実行されるようになる。不安なら関数を作った画面でテストを作って実行すればいい。
モニタリングの画面で「Error count and success rate (%)」のグラフでSuccess rateが5分ごとに100%で推移していれば成功だ。
これで予約投稿が失敗することなく、確実に投稿されるようになる。ただし、予約投稿の予約時間を5分単位にする必要がある。せっかくLambdaで5分おきに設定したのに、予約の時間を10時37分などにすると、失敗する可能性があるからだ。
こちらからは以上だ。