Nekakoshi’s blog

柏の葉でWEB会社やってます。RailsとかGoとかやってます。

opsworkでrailsデプロイ時に文字コードを変更する。

rails4を使用しており、文字コードをutf8mb4にしたいという要望がありました。

settingのCustom JSONを以下のように設定するといけそうです。

{
  "deploy": {
    "APP-NAME": {
      "database": {
        "username": "USER-NAME",
        "password": "PASSWORD",
        "host": "RDS-NAME",
        "adapter": "mysql2",
        "database": "DATABASE-NAME",
        "reconnect": true,
        "encoding" : "utf8mb4",
        "charset" : "utf8mb4",
        "collation" : "utf8mb4_unicode_ci"
      }
    }
  }
}

encoding, charset, collation を変更したい文字コードに変更すればいけるようです。

というメモです。

SSL証明書作成のメモ

とりあえず以下のコマンドで作成すれば2016年以降も使える。

### 秘密鍵作成
$ openssl genrsa 2048 -sha256 > server1.key
### 確認する
$ openssl rsa -text -noout -in server.key
### 公開鍵作成
$ openssl req -new -sha256 -subj "/C=JP/ST=Tokyo/L=Shinjuku/O=CompanyName/OU=Department/CN=example.com/emailAddress=info@example.com" -out example-com.csr -newkey rsa:2048 -nodes -keyout server.key
### 公開鍵の確認
$ openssl req -text < example-com.csr
## 秘密鍵と公開鍵の比較し差分が無いことを確認する
$ diff <(openssl rsa -in server.key -noout -modulus) <(openssl req -in  example-com.csr -noout -modulus)

RDSのtimezoneを調整する。

事の発端

RDSで作成したmysqlで以下のコマンドを実行した所「UTC」である事が判明

mysql > SELECT date();

これはあかん。 ということで対策を取る。

とりあえず変更してみる。

SESSIONでTimeZoneをTokyoに変更する。

mysql > SET SESSION time_zone = ‘Asia/Tokyo’;

するとTimeZoneが日本時間になることが判明する。

しかし問題があることがわかった。

・再起動した場合に時間が「UTC」に変更される。

「SESSIONだからダメだよなー」と思って GLOBALでコマンドを実行した所、RDSはrdsadminユーザ以外出来なさそう。とのこと。 (詳しくは調べてないけど。)

そのためSESSIONにての変更は再起動しない限定となる。。

次へ進む

init_connectにストアドを突っ込む

SESSIONは使用できるので、ストアドに突っ込むのが主流のようだ。 rdsadminの時間が変更されるとおかしな挙動が発生するようなので、除外するストアドを入れます。

mysql> CREATE DATABASE shared;
mysql> DELIMITER |
CREATE PROCEDURE shared.`store_time_zone`()
IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN
  SET SESSION time_zone = 'Asia/Tokyo';
END IF |
mysql> DELIMITER ;
mysql> CALL shared.store_time_zone;
mysql> select now();

このストアドをRDSのParameterGroupのinit_connectに設定すると再起動時に呼ばれるため TimeZoneが任意のものに変更できる。

\(ヽo^)/ヨカター

以下を参考にしました。 dev.classmethod.jp

ただ、この話には続きがあります。。。

作成ユーザがクエリを実行できない問題

同じRDSでもDB別にユーザ、権限別にユーザを作成するのはよくあることだと思います。

しかし先ほどのinit_connectを設定することにより、 作成したユーザが実行しようとした時に動かないという事象が発生。 (ここの引っ掛かり小一時間かかるという)

以下のように普通にユーザを作ると

CREATE USER my_user IDENTIFIED BY [PASSWORD] 'password';
GRANT ALL ON database_name.* TO my_user;
SHOW GRANTS FOR my_user

以下のようにエラーが発生する

ERROR 2006 (HY000): MySQL server has gone away

実行権限を以下のように付与しないとうまくいかないとのことで、 つけてみる

GRANT execute ON *.* TO my_user;

そうするとうまくいく。

感想

CUImysqlを操作するのが普通だったのに、 GUImysqlコメンドのみで操作していくことになれるのに時間がかかりそうだな。 と思います。

詳しくなくてもすぐに出来るツールである一方、何かあった時の対応は大変なんだろうな。 と思う今日このごろです。

追伸

init_connectの設定値で最後にセミコロン「;」がなくて、設定をしました。 これをRDSへ反映させたところ、全てのクエリが受け付けられなくなりました。 取り扱いには気をつけてくださいね。

今週のお題「ゴールデンウィーク2015」

今年は特に出かけずにヌルヌル過ごしてました。

突然GWの真ん中で引っ越しを検討をはじめました。 今は都内に住んでいますが千葉に引っ越そうか。という話に急になり。

都内に住んでいるメリットを棚卸ししてみると ・都心の職場に近い(40分圏内) ・職場関連の友人によく会える。 ・遅くまで飲める。 などなど コミュニケーションまたはコミュニティーに関してが強いように感じます。

今年の3月に転職し、2ヶ月ほど働いて仕事内容も裁量の範囲で自由があります。 そこでよくよく考えてみたところ ・俺は飲みに行くことは稀 ・仕事は家からやっても問題はない(推奨ではないので通常出勤する前提) ・朝が6時おきになった。 ・帰りも8時頃には会社を出れる。 ・都心は家賃が高い。(<-ココ大事)

という話があり「じゃあ引っ越せばいいじゃん」という話になるわけですね。 上記のような条件と千葉に実家があるので、 千葉方面をターゲットにすぐさま賃貸営業者に連絡、 翌日には賃貸を見学しに行き、だいたい固まるというスピード感。

賃貸の選定は勝手にスコア表を作りポイント制で自分たちのニーズに合う賃貸を探すという 業務さながらのことをしつつ、次週には決める予定です。

引越し後の メリットは ・家賃が安くなる(1/3当社比) ・広くなる(1LDK -> 2LDK以上) ・自然がたくさんある。(これは大事) ・電車を座って移動できる。(可能性が高い)

デメリットは ・通勤時間が倍になる。 ・終電が早い。

通勤時間が長いのは学習時間にすればいいので、問題なし。 ほぼ飲みにいかないので終電が早いのも問題なし。 ということでメリットが大きい引っ越しとなりそうです。

新天地にワクテカな今日このごろです。

AWS-cliを利用してec2インスタンス構築する。

最近AWSを触り始めました。(遅いって!?)

業務はオンプレミスを管理しているため、たまには楽をしたい!

ということでAWSを触っていこうと思い、記述します。

実行環境

使用Tool

Access Keys を取得する。

手順は以下の公式を参照にしました。

http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/Using_SettingUpUser.html

 

Access Keys を設定する。

aws configureを実行して設定します。

$ aws configure
AWS Access Key ID [None]: AK*****************LE
AWS Secret Access Key [None]: wJa****************************EY
Default region name [None]: us-west-2
Default output format [None]: json

 

設定値は以下の場所に格納されます。

$ cat ~/.aws/config
[default]
output = json
region = us-west-2

 

$ cat ~/.aws/credentials
[default]
aws_access_key_id = AK********************LE
aws_secret_access_key = wJa**************************EY

プロファイルごとに設定を作る

上記の設定はdefaultと記述されています。

別のプロファイルを作成する場合は以下のとおりです。

$ aws configure --profile user2

 

$ cat ~/.aws/config
[default]
aws_access_key_id=AK********************LE
aws_secret_access_key=wJa**************************EY

[user2]
aws_access_key_id=AK********************LE
aws_secret_access_key=wJa**************************EY
$ cat ~/.aws/credentials
[default] region=us-west-1 output=json [profile user2] region=us-east-1 output=text

profile user2が追加された事がわかります。

 

EC2インスタンスを作成する

以下のような値でec2が作成できます。

細かい設定は別途気が向いたら。。。

$ aws ec2 run-instances --image-id ami-d98410e9 --security-groups default --instance-type t1.micro --region "us-west-2" --count 1

 

jqコマンドでインスタンス名だけ取得出来ます。

$ aws ec2 describe-instances | jq '.Reservations[].Instances[].InstanceId'
"i-ffdb0f09"

 

停止はinstance-idsを指定して以下を実行します。

$ aws ec2 stop-instances --instance-ids i-ffdb0f09

 

はてぶは使い方なれないのでこんなところで。。。