AMIMOTO で PHP 7.2 を利用する

AMIMOTO で PHP 7.2 を利用するには、以下のコマンドを実行してください。

Chef レシピを最新のものに更新する

$ sudo git -C /opt/local/chef-repo/cookbooks/amimoto/ pull origin 2016.01
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 31 (delta 24), reused 26 (delta 24), pack-reused 4
Unpacking objects: 100% (31/31), done.
From git://github.com/Launch-with-1-Click/lw1-amimoto
 * branch            2016.01    -> FETCH_HEAD
   3ce41b9..af15013  2016.01    -> origin/2016.01
Updating 3ce41b9..af15013
Fast-forward
 attributes/03_php.rb                | 17 +++++++++++++++++
 attributes/yum_repo.rb              |  3 +++
 recipes/php.rb                      |  7 +++++++
 recipes/redis.rb                    | 11 ++++++++---
 recipes/repos.rb                    |  2 +-
 templates/amazon/yum/remi.repo.erb  | 29 +++++++++++++++++++++++++++++
 templates/default/yum/remi.repo.erb | 29 +++++++++++++++++++++++++++++
 7 files changed, 94 insertions(+), 4 deletions(-)

Chef レシピに与えるパラメータを保存している /opt/local/amimoto.json を編集する

$ TMP_JSON=$(mktemp)
$ jq -s '.[1] * .[0]' <(echo '{"phpfpm":{"version":"72"}}') <(sudo cat /opt/local/amimoto.json) > ${TMP_JSON}
$ sudo mv -f ${TMP_JSON} /opt/local/amimoto.json

※ 7.2 以外(5.6, 7.0, 7.1)が使用したい場合は、2行目の “version”:”72″ を変更してください。

最後に以下のコマンドを実行します。

$ sudo /opt/local/provision
$ sudo service php-fpm restart

確認

$ php -v
PHP 7.2.1 (cli) (built: Jan  3 2018 09:08:32) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.2.1, Copyright (c) 1999-2017, by Zend Technologies

AMIMOTO で redis object cache を使用する

AMIMOTO で redis object cache を使用するには、以下の3ステップの作業が必要となります。

  1. redis をインストールする
  2. WordPress プラグイン Redis Object Cache をインストールして有効化する
  3. Redis Object Cache に関する不具合を修復するプラグインをインストールする

では、順番にやり方を説明しましょう。

redis をインストールする

これは、それほど難しくありません。

まず、SSH接続してから /opt/local/amimoto.json を編集してください。

以下のコマンドで対応可能です。

$ TMP_JSON=$(mktemp)
$ jq -s '.[1] * .[0]' <(echo '{"redis":true}') <(sudo cat /opt/local/amimoto.json) > ${TMP_JSON}
$ sudo mv -f ${TMP_JSON} /opt/local/amimoto.json

次に以下のコマンドを実行します。

$ sudo /opt/local/provision

 
Redis が起動しているかどうかは、以下のコマンドで確認できます。

$ sudo service redis status

Redis Object Cache をインストールして有効化する

まず、wp-config.php に以下のコードを追加しておきます。

/** Redis Cache Settings **/
define('WP_REDIS_HOST', '127.0.0.1');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_MAXTTL', 3600);
define('WP_CACHE_KEY_SALT', DB_NAME);

設定する各定数の意味は、プラグインの説明読んでください。

プラグインのインストールを wp-cli 使ってやるなら、以下の通り

$ wp plugin install --activate redis-cache
$ wp redis enable
$ wp redis sttus
Status: Connected
Client: PECL Extension (v3.1.6)

Redis Object Cache に関する不具合を修復するプラグインをインストールする

ファイル redis-cache-fix.php を取ってきて、wp-content/mu-plugins/ ディレクトリに保存してください。
ターミナルでやるなら以下の通り

$ wget https://gist.githubusercontent.com/wokamoto/5c0c8a19a6dbd08e4121aa05d238543c/raw/464d418bcc7f9686852cdc3c0db6d6316278d6ed/redis-cache-fix.php
$ mkdir /path/to/wordpress/wp-content/mu-plugins
$ mv redis-cache-fix.php /path/to/wordpress/wp-content/mu-plugins/

こんな感じで良いかなと

[AWS] AWS Certificate Manager が Tokyo リージョンにやってきた!

AWS Certificate Manager が Tokyo リージョンでも使えるようになりました。
AWS Certificate Manager now available in more regions

以前、SES を使って ACM の承認メール受信する方法を書いてますので、それ参考にしてくださいねー。

S3 で SES 受信するためのバケットポリシーサンプル

{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "GiveSESPermissionToWriteEmail",
"Effect": "Allow",
"Principal": {
"Service": [
"ses.amazonaws.com"
]
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::BUCKET-NAME/*",
"Condition": {
"StringEquals": {
"aws:Referer": "ACCOUNT-ID-WITHOUT-HYPHENS"
}
}
}
]
}

[AWS] mailq を監視して CloudWatch のカスタムメトリクスに送信

Web サーバにバックドア仕掛けられて spam 送信の踏み台にされていないかを確認するために mailq の値をカスタムメトリクスに定期的に送信してCloudWatch で検出しておくと、ある日突然 AWS から「Your Amazon EC2 Abuse Report」ってメールが来ることが無くなると思うよ。

#!/bin/sh
# EC2 のインスタンス ID を取得
instanceid=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)

# region を取得
az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
_length=$(echo $((${#az} - 1)))
region=$(echo ${az} | cut -c 1-${_length})

namespace="System/Linux"

# mailq
mailq=$(mailq | grep 'Total requests' | awk '{print $3}')
aws cloudwatch put-metric-data \
 --region ${region} \
 --namespace ${namespace} \
 --dimensions InstanceId=${instanceid} \
 --unit Count \
 --metric-name "MailQueu" \
 --value "$mailq"

[aws-cli] EC2スケールアップした時にELB配下だったら、一度外して再度参加させるやつ

スケールアップするためにインスタンス停止したら、ELBに再度参加させないと、いつまでも Out of Service のことってあるよね…

#!/bin/sh
INSTANCE_ID="${1}"
INSTANCE_TYPE="${2}"
# 指定されたインスタンスタイプが現在のものと同じだったら何もしない
CURRENT_INSTANCE_TYPE=`aws ec2 describe-instances –instance-ids ${INSTANCE_ID} | jq -r '.Reservations[].Instances[].InstanceType'`
if [ "${CURRENT_INSTANCE_TYPE}" = "${INSTANCE_TYPE}" ]; then
echo "current instance type : ${CURRENT_INSTANCE_TYPE}"
exit 0
fi
# ELB 配下かどうか確認
ELB_NAME=''
ELBS=`aws elb describe-load-balancers | jq -r ".LoadBalancerDescriptions[].LoadBalancerName"`
for ELB in ${ELBS}; do
ELB_INSTANCE_IDS=`aws elb describe-instance-health –load-balancer-name ${ELB} | jq -r ".InstanceStates[].InstanceId"`
for ELB_INSTANCE_ID in ${ELB_INSTANCE_IDS}; do
if [ "${ELB_INSTANCE_ID}" = "${INSTANCE_ID}" ]; then
ELB_NAME="${ELB}"
break
fi
done
ELB_INSTANCE_IDS=''
if [ "${ELB_NAME}" != "" ]; then
break;
fi
done
# ELB 配下だったら取り外す
if [ "${ELB_NAME}" != "" ]; then
echo " Remove ELB: ${INSTANCE_ID} from ${ELB_NAME}"
aws elb deregister-instances-from-load-balancer –load-balancer-name=${ELB_NAME} –instances=${INSTANCE_ID}
fi
# インスタンス停止して、stopped になるまで待つ
while :
do
EC2_STATE=`aws ec2 describe-instances –instance-ids ${INSTANCE_ID} | jq -r '.Reservations[].Instances[].State | .Name'`
echo "${INSTANCE_ID} : ${EC2_STATE}"
if [ "${EC2_STATE}" = "running" ]; then
aws ec2 stop-instances –instance-ids ${INSTANCE_ID}
fi
if [ "${EC2_STATE}" = "stopped" ]; then
break
fi
sleep 10
done
# インスタンスタイプを変更する
aws ec2 modify-instance-attribute –instance-id ${INSTANCE_ID} –instance-type ${INSTANCE_TYPE}
# インスタンス開始して、running になるまで待つ
aws ec2 start-instances –instance-ids ${INSTANCE_ID}
while :
do
EC2_STATE=`aws ec2 describe-instances –instance-ids ${INSTANCE_ID} | jq -r '.Reservations[].Instances[].State | .Name'`
echo "${INSTANCE_ID} : ${EC2_STATE}"
if [ "${EC2_STATE}" = "running" ]; then
break
fi
sleep 10
done
# ELB に参加させる
if [ "${ELB_NAME}" != "" ]; then
echo " Add ELB: ${INSTANCE_ID} to ${ELB_NAME}"
aws elb register-instances-with-load-balancer –load-balancer-name=${ELB_NAME} –instances=${INSTANCE_ID}
fi

view raw
gistfile1.sh
hosted with ❤ by GitHub

参考URL: http://dev.classmethod.jp/cloud/aws/elb-re-register/

[AWS] AWSのCloudWatchで取得できるBillingの情報を毎日Slackに通知させて費用を常に把握する

#!/bin/sh
# 昨日の日付
yesterday=`date -d '1 days ago' +%Y-%m-%d`
# 一日分の Maximum 値を使って
period='86400'
statistics='Maximum'
# CloudWatchからBillingのデータを持ってくる
billing=`aws –region us-east-1 cloudwatch get-metric-statistics \
–namespace 'AWS/Billing' \
–dimensions "Name=Currency,Value=USD" \
–metric-name EstimatedCharges \
–start-time "${yesterday} 00:00:00" \
–end-time "${yesterday} 23:59:59" \
–period ${period} –statistics "${statistics}" \
| jq ".Datapoints[].${statistics}"`
strings="${yesterday}までのAWSの利用費(月毎)です。 EstimatedCharges : \$${billing}"
# DevOpsManに伝える
curl -s https://slack.com/api/chat.postMessage -X POST \
-d "channel=#CHANNEL" \
-d "text=${strings}" \
-d "username=USER" \
-d "icon_emoji=:ICON:" \
-d "token=xoxp-0000000000-0000000000-0000000000-000000"

view raw
gistfile1.sh
hosted with ❤ by GitHub

参考: AWSのCloudWatchで取得できるBillingの情報を毎日Slackに通知させて費用を常に把握する – さよならインターネット

参考URLだと ruby で処理してるけど、aws-cli, jq と curl 使ってるだけだから、ruby 使わなくても sh だけでいいんでないかなーと思った

[wp-cli] サブディレクトリにインストールされている WordPress の一覧を取得する

#!/bin/sh
find /var/www/vhosts/ -maxdepth 2 -type f -name wp-config.php | while read thisfile; do
wp_path=${thisfile%/*}
echo "***** ${wp_path}"
wp_version=`wp –path=${wp_path} core version`
wp_home=`wp –path=${wp_path} eval "echo home_url();"`
echo "${wp_home} : ${wp_version}"
done;

view raw
gistfile1.sh
hosted with ❤ by GitHub

while ループ内で wp core update とかをすれば、一撃ですべての WordPress をアップデートできるよ