ElasticBeanstalkで独立したRDSに接続する手順(Railsの場合)

解説

ElasticBeanstalkでは、環境にRDSインスタンスを作成することができる

しかし、環境内にRDSインスタンスを作成した場合、環境を終了させると、RDSインスタンスも終了してしまう

そのため、本番環境ではRDSインスタンスを環境外に作成して、環境に接続して運用することが推奨されている

環境の一部であるデータベースインスタンスは、環境のライフサイクルに固定されており、追加されると環境から削除することはできません。環境を終了すると、データベースインスタンスも終了します。 環境に DB インスタンスの追加時、環境を終了しスナップショットからデータベースを復元するとき、Elastic Beanstalk を設定して、データベースのスナップショットを保存することができます。データベースのスナップショットを保存するときに料金が発生する場合があります。詳細については、Amazon RDS 料金表の「バックアップストレージ」セクションを参照してください。 本稼働環境では、環境外にデータベースインスタンスを起動する、および Elastic Beanstalk. によって提供される機能の外部に接続するようアプリケーションを設定することもできます。 環境の外部にデータベースインスタンスを使用する場合、追加のセキュリティグループと接続文字列設定が必要ですが、複数の環境からデータベースに接続でき、統合されたデータベースでサポートされていないデータベースタイプを使用し、青/緑のデプロイを実行して、データベースインスタンスに影響を与えずに環境を解放することもできます。

Elastic Beanstalk でデータベースを設定する - AWS Elastic Beanstalk

方法

  1. ElasticBeanstalk環境を作成する
  2. RDS接続用セキュリティグループを作成する
  3. RDS環境を作成する
  4. ElasticBeanstalkの環境変数に、RDS接続用の値を設定する

config/database.yml の設定例

production:
  <<: *default
  database: <%= ENV['DB_NAME'] %>
  username: <%= ENV['USERNAME'] %>
  password: <%= ENV['PASSWORD'] %>
  host: <%= ENV['HOSTNAME'] %>
  port: <%= ENV['PORT'] %>%

それぞれの詳細については、後日追記

クイズで学ぶ初心者がハマりがちなRubyの代入いろいろ

クイズ1

以下のコードを実行した場合、変数 a の値はどうなるでしょう?

a=100
b=a
b=200

答え

100

解説

  • a=100では、変数aに数値オブジェクト100を参照させている
  • b=aでは、変数bに変数aと同じオブジェクトを参照させている
  • そして、b=200では、変数bに数値オブジェクト200を参照させている
  • この時点で、変数abが参照するオブジェクトは異なるものとなる
  • そして、変数bが参照するオブジェクトが変わっても、変数aが参照するオブジェクトは変わらない

クイズ2

以下のコードを実行した場合、変数 a の値はどうなるでしょう?

a="aaa"
b=a
b.gsub!(/a/, "b")

答え

"bbb"

解説

  • gsub!はレシーバーの内容を直接書き換えるメソッド(破壊的メソッド)
  • gsub!は、文字列オブジェクト"aaa"に対して破壊的に実行される
  • b=aでは、変数bに変数aと同じ文字列オブジェクト"aaa"を参照させている
  • そのため、変数aからも、変数bからも書き換えられた文字列"bbb"を見ることができる

クイズ3

以下のコードを実行した場合、変数 a の値はどうなるでしょう?

a= ["aaa",100]
b=a[1]
b= 200

答え

["aaa", 100]

解説

  • クイズ1の応用問題
  • a[1]は配列の1個目要素を取り出すメソッド
  • b=a[1]では、変数ba[1]で取り出した、数値オブジェクト100を参照させている
  • そして、b=200では、変数bに数値オブジェクト200を参照させている
  • この時点で、a[1]と変数bが参照するオブジェクトは異なるものとなる
  • そして、変数bが参照するオブジェクトが変わっても、a[1]から取得できるオブジェクトは変わらない

クイズ4

以下のコードを実行した場合、変数 a の値はどうなるでしょう?

a= [ ["aaa","bbb"], 100]
b=a[0]
b[1] = "ccc"

答え

[["aaa", "ccc"], 100]

解説

  • こんどは、a[0]bは、配列オブジェクト ["aaa", "bbb"] を参照している
  • b[1] はメソッド Array#[]= の呼び出し
  • Array#[]=は、指定された配列の要素の中身を置き換えるメソッドのため、b[1] = "ccc" ならば ["aaa", "ccc"] となる

Rubyの代入では参照値が代入先に格納される

先に結論

  • rubyの代入はオブジェクトの参照値(ポインタのようなもの)が代入先に格納される
  • もし、格納元が参照値の場合、同一の参照値が代入先に格納される(参照の参照にはならない)
  • イメージとしては、C++のポインタの値の代入に近い

文字列"aaa"を変数aに代入する場合

a = "aaa"

上記の場合、以下の処理が実行される

  1. Stringオブジェクト"aaa" が生成される
  2. 変数aStringオブジェクト"aaa" の参照値が格納される

その変数aを別の変数bに代入するばあい

a = "aaa"
b = a

上記の場合、

  1. 変数 a に格納されている Stringオブジェクト"aaa" の参照値が、変数 b に 格納される

同じオブジェクトが参照されていることが object_id を比較すると分かる

a = "aaa"
b = a
a.object_id == b.object_id # true

変数b に破壊的メソッドsub!を実行した場合

a = "aaa"
b = a
b.sub!(/a/, 'b')

この場合、変数 ab も同じオブジェクトを参照しているため、変数 a の表示も変わる

a = "aaa"
b = a
b.sub!(/a/, 'b')

p b # "bbb"
p a # "bbb"

変数b に別の文字列 "bbb" を代入する場合

a = "aaa"
b = a
b = "bbb"

このばあい、変数b には新たに生成されたStringオブジェクト"bbb" の参照値が格納され、変数aとは参照先が別になる

変数bと変数aの参照先が異なることが object_id を比較すると分かる

a = "aaa"
b = a
b = "bbb"

a.object_id != b.object_id # true

ぎゃくに変数a に別の文字列 "bbb" を代入する場合

a = "aaa"
b = a
a = "bbb"

このばあい、変数a にはStringオブジェクト"bbb" の参照値が格納される

しかし、変数bはStringオブジェクト"aaa"の参照値が格納されたままのため、文字列 "aaa" が表示される

a = "aaa"
b = a
a = "bbb"

p b # "aaa"
a.object_id != b.object_id # true

上記のことから rubyの変数には参照ではなく、参照値が格納されていることが分かる

なんで?

もし、a="aaa"C++などで言う「参照」であるならば

b=a; b="bbb" としたときに Stringオブジェクト"aaa" の内容が "bbb" に変わるはず

C++での参照

#include <iostream>

int main(void){
  int x = 100;
  int& xr = x;
  xr = 200;
  // xの参照である xr の値を変更するとxの値も変更される
  std::cout << "x=" << x << "\n";  // 200
  return 0;
}

どちらかというと、C++でいうポインタの値の代入のイメージに近い

しかし、rubyではポインタは無いためJavaに倣って「参照値の代入」という言葉を選んだ

C++でのポインタの値の代入

#include <iostream>

int main(void){
  int a = 100;
  int* ap = &a;                     //apにaのポインタの値を格納
  std::cout << "ap=" << ap << "\n"; //aのポインタの値(0x7fff4fe752b8)

  int* bp = ap;                     //aのポインタの値をbpに格納(rubyで言う a=b)
  std::cout << "bp=" << bp << "\n"; //ap == bp

  int b = 999;
  bp = &b;                          //bpにbのポインタの値を格納(rubyでいう b=999)
  std::cout << "bp=" << bp << "\n"; // ap != bp(999)

  std::cout << "a=" << a << "\n"; // 当然 a の値は変更されない(100)
  return 0;
}

「アジャイルコーチング 2章 みんなと一緒に働く」の読書メモ

アジャイルコーチング

アジャイルコーチング

チームで一緒に働くためのスキルの章

2.1 傾聴と、2.3 フィードバックを伝える が良かったのでメモ。

2.1 傾聴

傾聴で最も難しいのは、すぐにアドバイスを伝えようとしたり、似たような話を思い出して、その話に切り替えたりすることです。 アドバイスを伝える前に、相手の話を聞きましょう。そして、言葉だけで判断せずに、その裏側にある感情やニーズを理解するようにしましょう。
人が話すスピードは、あなたの頭の回転よりもずっとゆっくりです。話し手にすべての注意を向けるのが難しいのはそのためです。心のなかで次に何を言うべきかを考えてはいけません。それでは相手に向けた注意がそれてしまいます。次に何を言うべきかを考えるのではなく、全体の状況を把握しましょう
  • 途中で遮らない
  • 相手のニーズを探すことに集中する
  • ホワイトボードに書く場合は、フィルタリングせず相手の言葉で
    • 自分に都合のよい情報だけかくとかしない
  • 話が終わったら、相手のニーズを再確認する
    • 相手のニーズ外の行動をすると信頼を失う

2.3 フィードバックを伝える

事実と判断/印象を区別する

  1. 相手にフィードバックを伝える許可を得る
  2. 自分なりの解釈よりも、実際に見たこと/聴いたことを具体的に伝える
  3. 続いて、状況の判断や印象を伝える
  4. 次に相手の話を聞く。おそらくはあなたの知らない理由があるはず
  5. 改善の余地がある場合は、同じ状況の時に対処できるように提案をする/もしくはしてもらう

感想 : これ、相手が非協力的な場合どうしたら良いのかね

追記

書評を書いてみた

コミュニケーションに課題を抱えたお前はアジャイルコーチングの2章をよんでメキシコをいきのびろ|かせいさん|note

2016年を(いまさら)振り返る

1年の約20%が経過しましたが、皆様いかがお過ごしでしょうか?

今年の目標も20%ほど達成しましたか?

私といいますと、これから今年の目標を定めるために2016年を振り返ろうと思います…!

去年の振り返り

kasei-san.hatenablog.com

Keep

副業はじめました

sugi511.hatenablog.com

  • afri-inc にて、パートタイム&リモートで参加
    • ウガンダ/ケニアの流通市場向けB2Bアプリを作っているスタートアップ
    • 今まで縁が無かったアフリカの生の情報が聞けるのが面白い!
    • やっていること : Rails、ElasticBeanstalk
  • 始めたきっかけ
    • 去年の振り返りで書いた「自分の市場価値」の不安解消のため
    • 当時、自社プロジェクトの内容がレガシーで最新のRailsをさわりたかった
    • そんな時に上記blog記事をtwitterで偶然発見して応募して無事採用していただく
  • やってみてどうだった?
    • それぞれの仕事で得られた知見や文化を、別の仕事に持っていけるのが非常によい!
    • 複数のキャリアを持っているという安心感
      • ノーリスクでスタートアップのお仕事に関われる
    • リモートで好きな時間働くという自由さを知れた
      • 100%リモートのお仕事は無理そう、ということも分かった(仕事をする場だいじ)
    • Rails4やElasticBeanstalkの知見を得られた
    • お小遣いげっと
      • 金銭的余裕 = 心理的余裕 であることを理解

ニンジャ学会続いています

  • ニンジャスレイヤーの論文形式の同人誌「ニンジャ学会誌」を2016年の冬コミから頒布しています
  • 今年の活動
  • やってみてどうだった?
    • 同人活動たのしい!!
      • 自分が欲しい本ができていくというアンソロ主催の楽しさよ…!
      • 自分の本を楽しみにサークルに来ていただいたり、twitterで感想をいただけるとやはりテンションが上がる
      • サークル経由で知り合いが増えた! すごい能力を持った人ばかりで楽しい!
    • 自分自身の理解が深まった
      • 自分の取り柄の一つに「実現能力」があることに気づく
        • 誰かが言った面白そうなアイデアを気軽に実現する
        • みんなが思うほどハードルは高くない
        • 「やってから考える」と思ってやると結構色々実現できるなと気づく
      • 「欲しいものを100%自分自身で作ること」には執着が無いことに気づく
        • 自分は、創作の喜びも知っているが、自分が欲しいものが手に入るという結果の方がだいじ
        • 仕事についても 「とにかく自分で作りたいエンジニア」ではなく、結果が得られればそれで良いタイプなのだと自覚
        • しばらくはそういうタイプのエンジニアとして生きていきます

丘マイル活動はじめました

f:id:kasei_san:20170317175744p:plain

  • 一応閑散期エコノミーで2人でハワイに行ける額溜まった…
  • クレジットカードを10枚くらい作った
  • やってみてどうだった?
    • クレジットカード、色々特典があって楽しい!
      • 特にアメリカンエクスプレスのゴールドカード
        • 初年度無料
        • 複数人で行くと1人が無料になるレストラン予約サービスが良い
    • 気楽に月1程度でカードを作るだけで、結構貯まる
      • 資料請求は電話応対があるので面倒だった…(もうやらない

見た目が改善されました

  • ファッションの組み合わせの悪さや、髪型にについて妻とよく喧嘩になっていた
  • 服装を1種類に絞ることで解決
    • 春秋冬はこれ www.uniqlo.com
    • 夏物はこれのUネックの白 iyec.omni7.jp
      • もう在庫ないのか…
    • ボトムスはジーンズ
    • 春秋用にbeamsできれいめのジャケットを購入
    • 靴下も1種類にして、不揃いで悩むことをやめた
  • 美容院もうまいことやってくれるところが見つかった
    • 2ヶ月に1回訪れて、何も考えず「いつもの感じで」と注文
    • 4ヶ月に1回白髪を染める
  • 考えることが減った

筋トレはじめました

  • もともと痩せ型で、Tシャツとかを着るとガリガリ感が強かった
    • 178cmの63kg
  • 会社にワンダーコアが来たのをきっかけに体型改善のため始める
  • 筋トレポモドーロ
    • 45分仕事をしたら、筋トレ
    • 仕事の途中に体を動かすと頭がスッキリ!
    • 体型も改善されてきた
  • 筋トレを開始したところ、最初痩せた

全体を通して

  • 仕事と趣味の境界がどんどんなくなってきた
    • 余暇で仕事をしたり、趣味での発見を仕事に活かしたり
    • この調子でどんどんなくしていきたい
  • 知り合いが増えた
  • 不必要なことに脳のリソースを割かないように意識するようになってきた
    • 今年はよりそうしていきたい

Problem

英語できない

  • 実家にホームステイしていたオーストラリア人の結婚式に参加したが、コミュニケーションに苦労した…
  • アフリカのビジネスとか、東南アジアではこうとか言ってる割に英語できないの超かっこ悪い

エンジニアとしての能力

  • RailsAWSはできるけど他に知見がない
  • とはいえ最新情報に精通しているわけでもない
  • キャリアが1つという危機感
  • 経験で解決しようとしてしまい、そこに理論が乗っていない

内面の弱さ

  • 自信はついてきたがまだまだ…
  • 高ストレスや高プレッシャー時によろしくない反応をしてしまう

Try

  • オンラインで英語の人相手のプログラムのお仕事にトライしてみたい
    • できたらRails以外で
  • 認知行動療法の本を読む(去年もそう言っていた…
  • 空手やりたい
    • 自信をupさせつ、体型の改善ができそう
  • 考えることを減らしていきたい
    • 定期購入サービス
    • 副業の時間を固定する
    • 得られた時間をよりくだらないこと/頭のおかしいことに使う

数値記録

  • blog: 18記事 : 154ブクマ
  • Qiita : 12記事 : 27いいね

おもったより記事書いていた…

Railsを動かしているElasticBeanstalkにpuma_worker_killerを入れる方法

経緯

  • Railsを動かしているElasticBeanstalkでメモリの消費量が増大している
  • 定期的/一定量のメモリを消費したらアプリをリスタートしたい

注意事項

まずはRailsやpumaなどを最新にして、自アプリ以外が原因のメモリリークをなくしましょう

  • っていうか自アプリのメモリリークも無くせるならなくしましょう!

puma_worker_killerって?

schneems/puma_worker_killer: Automatically restart Puma cluster workers based on max RAM available

  • pumaのworkerを定期的/一定量のメモリを消費したらkillしてくれるgem
  • メモリリーク対策によく使われる

方法

1.Gemfilesに追加

group :production do
  gem 'puma_worker_killer'
end

2.設定ファイル(.ebextensions)にて、puma_worker_killerの設定をElasticBeanstalkに入れる

ElasticBeanstalkでは、設定ファイル(.ebextensions)により環境のカスタマイズができる

.ebextensions ディレクトリに、configファイルを置くと、それを読み込んでファイルの追加やコマンドの実行などをしてくれる

なので、ElasticBeanstalkのpumaの設定ファイルに、puma_worker_killer 用の設定を追加するコマンドを書く

  • ./ebextensions/00_add_puma_extend_conf.config
files:
  '/opt/elasticbeanstalk/support/conf/puma_extend_conf.rb':
     mode: "000644"
     owner: root
     group: root
     content: |
       before_fork do
         require 'puma_worker_killer'
         PumaWorkerKiller.config do |config|
           config.ram = 2048 # メモリ量(MB)
           config.frequency = 5    # forkされたpumaのリスタートの時間差(多分
           config.percent_usage = 0.98 # メモリを何%使ったら再起動する
           config.rolling_restart_frequency = 24 * 60 * 60 # 何秒に1回再起動するか(← 24Hに1回)
           config.reaper_status_logs = true #ログ出力(デバッグ用
         end
         PumaWorkerKiller.enable_rolling_restart
         PumaWorkerKiller.start
       end

container_commands:
  00_add_puma_extend_conf:
    command: |
      cat /opt/elasticbeanstalk/support/conf/puma_extend_conf.rb >> /opt/elasticbeanstalk/support/conf/pumaconf.rb
    test: "test ! -e /home/ec2-user/add_puma_extend_conf_done"
  01_add_puma_extend_conf_done:
    command: "touch /home/ec2-user/add_puma_extend_conf_done"
    test: "test ! -e /home/ec2-user/add_puma_extend_conf_done"

解説

files:

container_commands:

  • デプロイ後に実行されるコマンド群を設定
  • ソート順に実行される
  • /opt/elasticbeanstalk/support/conf/puma_extend_conf.rb は、ElasticBeanstalk で参照されるpumaの設定ファイル
    • そこに、files: で追加した、puma_worker_killerの設定を書いたファイルの内容を追加する
    • その後に、空ファイル /home/ec2-user/add_puma_extend_conf_done を作成
  • test: オプションは、戻り値が0以外の場合実行しなくするオプション
    • 空ファイル /home/ec2-user/add_puma_extend_conf_done があったら実行しない
    • 1回puma_worker_killerの設定が追加されたら、もう実行しないようにするため

デプロイ後、ログを見てみる

[30959] PumaWorkerKiller: Rolling Restart. 1 workers consuming total: 99.34765625 mb out of max:  mb. Sending TERM to pid 13411.
[30959] PumaWorkerKiller: Consuming 99.34765625 mb with master and 1 workers.

適当なタイミングで再起動したり、メモリの残量をチェックしてくれている!

「入門 考える技術・書く技術」読んだ

入門 考える技術・書く技術

入門 考える技術・書く技術

この本で何を解決したくて読んだの?

「伝わりやすい」文章を書きたい

どんな本なの?

「論理的に伝わりやすい文章」を書く方法を教えてくれた本

どうすれば、判りやすい文章が書けるの?

以下の方法に従って文章を作れば良い

  1. 読み手が欲しい、主メッセージを探す
  2. 主メッセージから、文章構造を組み立てる
  3. 文章構造をロジックでつなぐ
  4. ロジックでつないだ文章構造から、文章を作り上げる

読み手が欲しい、主メッセージを探す

  • OPQ分析 を使って、読み手の課題を明確にする
    • Objective : 望ましい状況 ( 例 : 相手に伝わる文章が書ける! )
    • Problem : 問題点、現状 ( 例 : 文章が相手に伝わらない )
    • Question : 読み手の疑問 ( 例 : 何か良い方法はないか? )
  • OPQを元に、Questionに忠実で具体的な回答( Anser )を書く (例 : 以下の方法に従って文章を作れば良い )
  • O→P→A を結びつける同一の尺度( レール )を決める
    • 同じ問題でもレールが異なれば、異なるAnserになる。 読み手が求めているレール、OPQをヒアリングすること
    • 「不良資産が見つかった」というPの場合、レールは「不良資産」なのか、「監視体制」なのか?
  • Anserはこの時点では、仮のものでよい

主メッセージから、文章構造を組み立てる

  1. Anserの直接支持するメッセージ( キーライン ) を探す
  2. リストアップした キーライン を元に、Anser を調整する
  3. 逆に、調整したAnser を支持する キーライン を追加/調整する
  4. さらにキーラインを支持する 段落メッセージ を作っていく
    • もし、キーラインが決まらない場合、段落メッセージ を先に列挙し、それをグループ化する方法もある

ポイント : 「so what(それで何が言いたいの?)」を繰り返す

文章構造をロジックでつなぐ

帰納法を使う

  • 帰納法 : 複数の前提から結論を導くロジック展開
    • 例 : 馬Aの心臓は1つ、馬Bの心臓は1つ、馬Cの心臓は1つ → 馬は心臓が1つであろう
    • ビジネス文書のロジック展開の8割は帰納法
    • 前提は 同じ種類の考え であること
    • 主部が同じ、述部が同じ、意味が同じ
    • ピラミッドの上下に「なぜならば」「具体的には」を入れて、しっくり来る文章になるか

演繹法を使う

  • 帰納法 : 前提が正しければ、結論は必ず正しいロジック展開
    • 例 : 馬は哺乳類→哺乳類は心臓が1つ→馬は心臓が1つ
    • 前提が正しいかチェックする

ロジックでつないだ文章構造から、文章を作り上げる

  • ここまでに作ったピラミッドのメッセージをそのまま形にする
  • 文章に置き換えられない場合は、ロジックがおかしいか、メッセージが絞りきれていないか
  • 文章の最後に 次にとるべき行動 を書く

要約メッセージを文章にする時のコツ

「体言止め」「名刺表現」の禁止

  • 見出しではなく、何を言いたいのか?をハッキリさせる
  • ✕「アジアの経済成長率の推移」◯「東南アジア各国はここ5年20%近く経済成長している」

曖昧な表現の禁止

  • ✕「商品の価格が問題である」◯「商品の小売価格にばらつきがありすぎる」

「 しりてが」言葉の禁止

  • メッセージは基本的に1主語、1述語の短文
  • 2つの文をつなげたい場合は、文の論理的な関係が曖昧になってしまうので、英語では「and」は使わない
  • 日本語の場合、「〜し」「〜であり」「〜だが」
  • ロジカル接続詞 を使う
    • 「〜する時に」「〜である一方」「〜であるがゆえに」など

この本を読んだ気づき

  • 自分の文章は
    • 「誰に何をして欲しくて書くか? 」が明確ではなかった
    • 主メッセージと、段落メッセージの列挙で終わっており、キーラインや論理展開が無く、ぼんやりした文章だった

この本を読んだ後どうするの?

  • 上記を意識しながら、ピラミッドを使って文章を書いてみる