kasei_sanのブログ

かせいさんのIT系のおぼえがきです。胡乱の方はnoteとtwitterへ

ElasticBeanstalkでメモリ使用率が一定値を超えたらslackでアラートを出したい

ElasticBeanstalkでメモリ使用率やHDD残量をモニタリングする方法の続き

ざっくり解説

  • ElasticBeanstalkの「アラーム」では、CloudWatchでメトリクスしている項目が設定した閾値を超えた時、AmazonSNSのSNSトピックに通知を渡すことができる
  • AmazonSNSとは、何かをトリガーにしてどこかに情報をpushするサービス
    • 送信先は、Emailとか、特定のURLを叩くとか、Lambdaとかいろいろ
  • SNSトピック : トリガーと送信先(Subscriptions:複数可)のセット

方法

例として、メモリ使用率が98%を超えたら通知する場合

まず、ElasticBeanstalkでメモリ使用率やHDD残量をモニタリングする方法で追加したカスタムメトリクスMaxMemoryUtilizationを「モニタリング」に追加する

f:id:kasei_san:20170505175154p:plain

モニタリングに追加されたら、グラフの右上のベルのマークを押す

f:id:kasei_san:20170505175040p:plain

アラームの追加に遷移するので

  • しきい値」を設定する
  • 「次の時間経過後に状態を変更」を設定する
    • 1分なら、1分後にしきい値以下になったらOKになる
  • Slackの有料アカウントを使っているならば、Eメールアドレスにslack通知用のアドレスを設定すれば良い

f:id:kasei_san:20170505175609p:plain

Slackの有料アカウントを持っていない場合

こちらでAWS LambdaでSlackを叩く方法が解説されている

CloudWatchのAlertをAWS Lambda経由でSlackに飛ばす - Qiita

  • AWS Lambda上で、Slack の WebHooksを叩くLambda functionを作成する
  • 上記で作成されたSNSトピックに、このLambda functionを叩くSubscriptionを追加する

参考

ElasticBeanstalkでメモリ使用率やHDD残量をモニタリングする方法

最初に

ここに書いてある

ざっくり解説

  • ElasticBeanstalkでは、CloudWatchを使って各項目のモニタリングが可能
  • CloudWatchがEC2でモニタリングしている項目に、メモリ使用量やHDD残量はない
  • そのため、CloudWatchに独自のデータを送信する カスタムメトリクス という手段を使う

「例: カスタム Amazon CloudWatch メトリクスの使用」でやっていることの解説

例: カスタム Amazon CloudWatch メトリクスの使用 - AWS Elastic Beanstalk

. ebextensions を使ってEC2構築時に以下のことをやっている

  • CloudWatchにデータ送信するためのツール(perlスクリプト)をインストール
  • 上記を動作させる為に必要なyumライブラリもインストール
  • crontabに5分に1回データを送信する処理を追記
    • /etc/cron.d/cwpump にもデータを格納
    • 動作確認用。動作確認が済んだら標準出力先を /dev/null にするように書かれている

またIAMにて、ElasticBeanstalkで生成されたEC2用のロールaws-elasticbeanstalk-ec2-roleに、CloudWatchにデータを送信する許可を追加している

ここまでやるとこんな風に、ElasticBeanstalkの「モニタリング」で、メモリの使用率やHDDの残量をメトリクスできるようになる

f:id:kasei_san:20170505164319p:plain

ちなみに統計は最大を使用すること。平均だと、一台だけ異常値になった時に気づけないので

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いいね

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