14Room

みんな泣きながらオトナになったんだ。

DKIM導入

概要

送信したメールがSPAM扱いされるので、証明書による送信元証明を付加しました。

インストール

インストール sudo apt-get install opendkim opendkim-tools

ディレクトリ用意 mkdir -p /etc/opendkim/keys/naked.com

鍵生成

cd /etc/opendkim/keys/naked.com
opendkim-genkey -d sample.com -s dkimselector
chown -R opendkim:opendkim /etc/opendkim/keys

サーバ設定

Syslog           yes
SyslogSuccess   yes
LogWhy  yes
UMask           002
Mode            sv
Domain                  naked.com
Selector                default
SOCKET                  inet:8891@localhost
UserID  opendkim:opendkim
KeyTable refile:/etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
InternalHosts refile:/etc/opendkim/TrustedHosts
SOCKET="inet:8891@localhost"

KeyTable設定

dkimselector._domainkey.naked.com naked.com:dkimselector:/etc/opendkim/keys/naked.com/dkimselector.private

SigningTableの設定

*@naked.com dkimselector._domainkey.naked.com

TrustedHostsの設定 内部でメール転送してくるホストのIPを一つずつ記述する。

10.10.10.1
10.10.10.2
10.10.10.3
10.10.10.4
10.10.10.5
10.10.10.6
10.10.10.7
10.10.10.8
10.10.10.9
10.10.10.10
10.10.10.11
10.10.10.12
10.10.10.13
10.10.10.14
10.10.10.15
10.10.10.16
10.10.10.17
10.10.10.18
10.10.10.19
10.10.10.20
10.10.10.21
10.10.10.22
10.10.10.23
10.10.10.24
10.10.10.25
.....

Postfix側の設定

下記を追記

# DKIM
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept

OpenDKIMを起動、postfix reload

service opendkim start
postfix reload

DNS設定

DNSにOpenDKIMの公開鍵を設定

cat /etc/opendkim/keys/naked.com/dkimselector.txt 結果

dkimselector._domainkey  IN  TXT ( "v=DKIM1; k=rsa; "
      "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC08E9Dos+LX2dZZFwBX2vSTfqAvvsME9rWELT+lxQI+GtuS7ZUIugYEzURX1H1DwDPo+Rm6YRnku9iWX7vdV/CfxFSTbYwwn9XA7DZbGpSCLOS4ySzJJYiOq+cw8Hat17u7pvl6fq4me3NWWCA88XkIVW5HykS5WYBcm3eb9/o1QIDAQAB" )  ; ----- DKIM key dkimselector for naked.com

上記の設定をDNSに設定。あと下記の設定も追加。

Name adsp.domainkey.naked.com
Type    TXT
Value   "dkim=unknown"

ゾンビDBの作り方 at GCP

概要

毎朝、前の日に本番DBから取ったバックアップを元に復活するDBをGCPでも作りました。

やってることは、

  1. mysql止める
  2. 古いvolumeをアンマウント
  3. 古いvolumeをdetach
  4. スナップショットから新しいボリュームを作成
  5. 新しいvolumeをattach
  6. 新しいvolumeをマウント
  7. mysql起動

前提条件

  • 実行サーバ(zombi-db)のAPI accessのcomputeにread/write権限がついてること
  • db-backup-20141205xxxみたいなスナップショットが存在すること

実行シェル

#!/bin/bash
date=`date +%Y%m%d%H`
DESCRIPTION="db-backup-$date"
newdisk="zombi-disk"
olddisk="zombi-disk"

# Stop mysql
sudo /sbin/initctl stop mysql

# Unmount
sleep 60
sudo /bin/umount -l /var/lib/mysql

# Detach old volume
sleep 60
gcloud compute -q --project "naked.co.jp:api-project-1234567890" instances detach-disk "zombi-db" --disk "$olddisk" --zone "asia-east1-a"

# Delete old volume
gcloud compute -q --project "naked.co.jp:api-project-1234567890" disks delete "$olddisk" --zone "asia-east1-a"

# Create new DB volume
sleep 60
gcloud compute -q --project "naked.co.jp:api-project-1234567890" disks create "$newdisk" --size "150" --zone "asia-east1-a" --source-snapshot "$DESCRIPTION" --type "pd-ssd"

# Attach new volume
sleep 60
gcloud compute -q --project "naked.co.jp:api-project-1234567890" instances attach-disk "zombi-db" --disk "$newdisk" --zone "asia-east1-a"

# Remount volume
sudo /bin/mount -a

# Start mysql
sudo /sbin/initctl start mysql

その他

例によって前処理が終わってない場合があったので適当にsleepを入れています。

ゾンビDBの作り方 at AWS

概要

開発メンバーからの要望で毎日、本番DBから取ったバックアップを元にデータをリフレッシュするDBを作りました。 何度データを壊しても次の朝には復活してるので社内ではコレをゾンビDBと呼んでいます。

やってることは、

1.定期的に取ってるsnapshotからvolumeを作成 2.mysql止める 3.古いvolumeをアンマウント 4.古いvolumeをdetach 5.新しいvolumeをattach 6.新しいvolumeをマウント 7.mysql起動

やりたいことはシンプルですが、awsから必要な情報を取ってくるのが少々面倒です。

前提条件

  • aws cliがインストールされている
  • IAM roleで実行サーバにEC2フルアクセス権限がついてる
  • DB_backup_20141205xxxみたいなスナップショットが存在する

シェルスクリプト

#!/bin/bash

date=`date +%Y%m%d%H`
DESCRIPTION="DB_backup_$date"
instance=`curl http://169.254.169.254/latest/meta-data/instance-id`


# Create new DB volume
snap=`/usr/local/bin/aws ec2 describe-snapshots --filters Name=description,Values=$DESCRIPTION"*" --query Snapshots[*].SnapshotId --output text`
VAR="$snap"
ary=($VAR)

attach_volume=`/usr/local/bin/aws ec2 create-volume --availability-zone us-east-1d --volume-type gp2 --snapshot-id ${ary[0]} --query VolumeId --output text`

# Stop mysql
sleep 10
sudo /usr/sbin/service mysql stop
#/sbin/swapoff /var/lib/mysql/swap

# Unmount
sleep 10
sudo /bin/umount -f /var/lib/mysql

# Detach old volume
sleep 10
detach_volume=`/usr/local/bin/aws ec2 describe-volumes --filters Name=attachment.instance-id,Values=$instance Name=attachment.device,Values=/dev/sdf --query Volumes[].Attachments[].[VolumeId] --output text`

/usr/local/bin/aws ec2 detach-volume --volume-id $detach_volume --instance-id $instance

# Attach new volume
sleep 60
/usr/local/bin/aws ec2 attach-volume --volume-id $attach_volume --instance-id $instance --device /dev/sdf

# Remount volume
sleep 60
sudo /bin/mount -a

# Start mysql
sleep 10
sudo /usr/sbin/service mysql start

# Delete old volume
/usr/local/bin/aws ec2 delete-volume --volume-id $detach_volume

その他

前の処理が完全に終わってなかったりするので適当にsleepを入れてます。

capistranoでデバッグのため、ダミータスクを動かしてみる

概要

デプロイの処理を1個づつ試しながら確認したい場合が多々有ります。 そんな時はCapfileにダミータスクを追加して、そのタスクを直接動かして動作を確認してみましょう。

Capfile

例)GCPインスタンスリストをコマンドから取得する処理を確かめてみる。

namespace "hoge" do
   task :moge do
     run_locally do
       value = %x[ gcloud compute instances list ]
       print value,"\n"
     end
   end
end

実行

怖いので実行するstageはstagingとかが良いと思います。

bundle exec cap staging hoge:moge

結果

コマンドの結果が変数に入って出力できました。

$ bundle exec cap staging hoge:moge
DEBUG [9cfe186a] Running /usr/bin/env [ -d /usr/local/rbenv/versions/2.2.3 ] on staging
DEBUG [9cfe186a] Command: [ -d /usr/local/rbenv/versions/2.2.3 ]
DEBUG [9cfe186a] Finished in 0.296 seconds with exit status 0 (successful).
nativeapi-fix
nativeapi-newrelic
nativeapi-us-201510271040-bpvl
nativeapi-us-201510271040-li6e
nativeapi-us-201510271040-ptgw
nativeapi-us-201510271040-vqhe
nativeapi-us-201510271040-vy9v
nativeapi-us-201510271040-w804
nativeapi-us-201510271040-wo6y
nativeapi-us-201510271040-xqg8
nativeapi-us-201510271040-y0f4
nativeapi-us-201510271040-y5cf
nativeapi-us-201510271040-y79p
nativeapi-us-201510271040-ye7b
nativeapi-us-201510271040-yvoe
nativeapi-us-201510271040-zgbc

Google cloud shell使ってみました

Google cloud shellって?

日本語だと下記のページで概要を掴めるかと思います。

Google Cloud Platform Japan 公式ブログ: Google Cloud Shell の無料期間が 2016 年末まで延長

使ってみました

f:id:naked123:20151223182328j:plain

特に設定の必要も無くGCPのコマンドが使えますし、普通にlinuxとしても使えてSSHで他のサーバにログインなんてことも出来ました。

cronも使えました

crontabで一分ごとにloglogというファイルに日付を出力してみました。 コンソールからログアウトしている時間帯もちゃんと動いていたようです。

$ cat loglog
Wed Dec 23 09:23:01 UTC 2015
Wed Dec 23 09:24:01 UTC 2015
Wed Dec 23 09:25:01 UTC 2015
Wed Dec 23 09:26:01 UTC 2015
Wed Dec 23 09:27:01 UTC 2015
Wed Dec 23 09:28:01 UTC 2015
Wed Dec 23 09:29:01 UTC 2015
$ date
Wed Dec 23 18:29:42 TLT 2015

あとがき

定期的にGCPのコマンドが実行できるので、バッチサーバでやっていた定期バックアップとかの処理をgoogle cloud shellにまかせるとサーバレス環境に一歩近づけそうですね。

local-ssdを積んだインスタンスのサイズ変更はできない

概要

local-ssdを積んだインスタンスのサイズ変更はできないので、気をつけましょう。

(local-ssdについては下記を見てもらうと雰囲気はつかめるかと思います。)

Google for Work Japan 公式ブログ: [GCP] Local SSD がどなたでも利用できるようになりました。

そもそもstop出来ない

local-ssdを積んだインスタンスはstopしてサイズ変更しようとしても、そもそも「stop」がグレーアウトして実行できません。 f:id:naked123:20151222110949p:plain

強引に起動しようとすると

マネージコンソールからはstop出来ないようになっていますが、実際にインスタンスにログインしてshutdownすることは可能です。しかし、起動しようとすると下記のようなエラーが発生します。

f:id:naked123:20151222111053p:plain

どうやら一度落とすと再度立ち上げることはできないようです。

まとめ

爆速で有名なGCPのlocal-ssdですが、local-ssdを積んだインスタンスはサイズ変更ができなくなるので使いどころを考えて利用しましょう。

あとがき

ちなみにどうしてもインスタンスサイズを変更したければ、

  1. local-ssdのデータを別ディスクに退避
  2. クローン
  3. 元のインスタンス削除
  4. 元のインスタンス名でクローン
  5. 別ディスクからデータを戻す

という手も考えられますが、面倒ですね。

GCPでサブネットが使えるようになった。

概要

AWSでは「VPC内でサブネットを切ってAPPのネットワークとDBのネットワークを分ける」みたいなことができますが、GCPでは出来ませんでした。が、いつの間にかGCPでもサブネットを切ることが出来るようになったようです。

GCPのnetworks

  • 以前のGCPではnetworkを複数のサブネットに分けることはできなかったのですが、出来るようになりました。下記のように新規作成時に複数のサブネットを作成することが出来ます。

f:id:naked123:20151221140917p:plain

  • 新規作成時だけでなく、後からメンテナンスも出来るようです。

f:id:naked123:20151221141239p:plain

ただし、昔作ったネットワークは置いてけぼり。

  • しかし、以前に作ったネットワークを見てみると・・「add subnetworks」が無い・・・。既存ネットワークをサブネットで切れないのは既にネットワークに散らばったインスタンスのIPをどうするか?が難しいからでしょうかね。 f:id:naked123:20151221141447p:plain

あとがき

引き続き、昔作ったネットワークでもサブネットが使えるようになるのを期待したいところです。