orenoblog

エンジニアになりたいExcel方眼紙erの物語

オートスケール

オートスケール実装してるですが、結構時間かかりますね。人力よりはやいけど。

  • スケールアウト条件
  • bootstrapにかかる時間
  • ELBのヘルスチェック間隔

アプリデプロイ含めたbootstrapにかかる時間が結構厳しいので、実質10分ぐらいかかる。

bootstrapを短縮するにはuser_data内の処理を短くしないとね。

CloudformationでEC2にPublicIP+固定PrivateIPを割り当てる

いつからCloudformationだと思った?

やったーー!!kumogata(winebarrel/kumogata · GitHub)でした!

JSON書くのはExcel方眼紙のプリントレイアウト設定するのと同じぐらいに辛いので、kumogataを使いました。

cloudformationドキュメントを読んでいるとEC2にPublicIPを割り当てるためのResourceは存在しないらしい。

EIPはAWS::EC2::EIPがあるのにな・・・

PublicIPと固定PrivateIPを割り当てる方法はAWS::EC2::NetworkInterfaces内で定義すること。

どうもENIに対して割り当てないといけない模様です

理由はEC2のドキュメントに書いてあるようなきがするので読まないと...

AWS::EC2のPropertyでもPrivateIP, SubnetID, SecurityGroupを設定できるがPublicIPを当てる場合は書いてはいけない。このようなエラーでRollbackされる。

Network interfaces and an instance-level subnet ID may not be specified on the same request

以下例

  • orenoinstance.rb
orenoInstance do
  Type "AWS::EC2::Instance"
  Properties do
    InstanceType     "t2.small"
    KeyName          {Ref "KeyName"}
    Monitoring       true
    ImageId          BASE_EBS_AMI_ID

    Tags [
      "Key"   => "Name",
      "Value" => "orenoinstance",
    ]

    BlockDeviceMappings [
      _{
        DeviceName "/dev/xvda"
        Ebs   {VolumeSize 100}
      }
    ]

    NetworkInterfaces [
      _{
        AssociatePublicIpAddress true
        PrivateIpAddress "10.10.20.30"
        DeviceIndex "0"
        GroupSet [
          _{Ref "orenoSecurityGroup"},
          _{Ref "publicSecurityGroup"}, 
        ]
        SubnetId         {Ref "orenoSubnet"}
      }
    ]
  end
end 
  • kumogataで作る

kumogataを実行する。DSLがParseされcloudformationが走る。

kumogata実行時の-pオプションでパラメータの上書きも可能

orenomac$ kumogata create orenoinstance.rb development

GUI脳筋でも魔法が使えたと思った瞬間。

さいこうです!!

3ヶ月で一気にやったこと

とにかく若さに嫉妬した3ヶ月だった。

自分が20台後半の時はエクセル方眼紙=Immutable 大正義 structure だった気がする。嗚呼黒歴史

嘆いても過去は戻ってこないのよ。

さて何やってたか忘れてしまいそうなのでメモ残す。

  • Customer Obsession

決して言いなりではない。その時刺さるだろうなって最適解を見つけるの最高

  • チームの仕事

最高

タグ運用最高!!サーバに状態を持たせず管理するためのエッセンスだと思うありがとうAWS

まあ、現実は状態持たざるをえないんですけど(´・ω・`)

  • S3

ディレクトリ/ファイル設計ミスったらパフォーマンスでないらしい。こわい

  • SQS

S3と同様にSQS独自のパーミッション設定があって歴史を感じる。

fluent-plugin-sqs最高。

  • DynamoDB

自分でサンプル作って説明できるぐらいの実装力がほしいなっておもいましたまる。

  • RDS

UTC.....

  • Nginx

リバースプロキシ最高。アパッチが辛い時に。

Postfix+SESリレーは鉄板にしたい。でももうメールはいいです・・業が深い

  • Tripwire

twadminでポリシー更新したらtripwire --initでデータベースを初期化しないとこうなる

### Error: Policy file does not match policy used to create database.
### Exiting...
  • Elasticserach + Kibana

ストレージ食いスギィ!

  • logstash

Windowsでfluentライクな事やろうとするとこれがベストっぽいと思った

  • Chef

Ohai最高, SoloよりServerが欲しくなる。chef-zero先生の出番かな

  • Serverspec

最高、もっと気軽にかけるようになりたい。。どうしても作りっぱなしになってしまう。

  • Redis

RDBMSではないのよKVSなんだよって特性を活かすと最高。

bgsaveこわいのでbackup slave作ってなんとかする。

TCPのオーバヘッドってすごく・・・おおきいです・・・と改めて学んだ最高のKVS

  • Sensu

ノード50台程度。 sensu-clientがrabbitmqという最高の流しそうめん機に打ち込まれたメッセージをsensu-serverとsensu-apiが受け取って指定された通知方法(ハンドラ)に従って、メッセージをいい感じにしてくれる最高のツール

不満があるとしたらadditional parameterをClient単位でしか持てないこと。

Check単位で設定したいケースがでてきたので、ソースイジらなきゃ駄目そう。

これからガンガンclient増やす。

rabbitmqはSmallインスタンスで十分。

sensu-serverは受け取るcheck, metricsの数によるとおもうけどc3.largeはほしいかなー。

NTPサーバ立てて同期しないと辛いどころかKeepAlive出しまくる。

  • Graphite

JSTAWSのCloudwatch メトリクスを参照できるって最高。

UTCで生きろはすまないがNo thank you

困ったらcarbon-cache/配下漁れば良い。

集めるmetrics数によるけどc3.largeはほしいな。

  • Jenkins

ビルドパイプライン, パラメータ付きビルドが最高に最高。

ずーっと遊んでた気がする。

  • Backlog

最高いつもお世話になっております。

Jenkins, Sensuと組み合わせたい

最高ちょっとExcel捨ててmarkdownやってくる

  • DeepSecurity Manager系

お、おう。

  • Next------->>>>>>>>>>

吸収しっぱなしだったので一度放出しないと辛い。テストきちんとしなきゃ。

TCP勉強しなおさなきゃ。

自身の能力が甘いのがつらい。

できる人にお願いしたらいいんだろうけど、ただの中継機器だとやばいよねって思っている。

主張するところないなとか色々考えることがある。

あとEC2はオブジェクトとして扱いたい。なんだかんだでオンプレノリなのでなんとかしたい。

そのためにまず状態を外に持たせるようにしたい。起動した瞬間メールだドン!とかcronだドン!とか笑えないので。

ってこれしかやってないんだっけ?

あっという間に三ヶ月過ぎたんだけど・・・

metricをgraphiteに飛ばすとき忘れない事

眠いですこんばんは

2回も同じこと忘れてたのでメモ

  • メトリクスを飛ばす時は"type":"metric"を指定する
  • メトリクスを処理するハンドラを記述

これらを指定しないとmetrics収集プラグインは動作するが、rabbitmqという流しそうめん機に流れていってもsensu-serverがすくい上げてくれない。

  • recipe
node.graphite_directory = "oreno.webservers"
sensu_check "metrics_vmstat" do
  command "vmstat-metrics.rb --scheme #{node.graphite_directory}.:::name:::"
  type "metric"
  handlers ["graphite"]
  standalone true
  interval 30
  end
end
  • knife solo cook実行後
{
  "checks": {
    "metrics_vmstat": {
      "command": "vmstat-metrics.rb --scheme oreno.webservers.:::name:::",
      "type": "metric",
      "handlers": [
        "graphite"
      ],
      "standalone": true,
      "interval": 30,
      "occurrences": 3
    }
  }
}

/graphite/oreno/webservers/<node_name>/<vmstat_metrics>として保存されますよ。

メトリクスがGraphiteに登録されないなと思ったらこれらを確認してみると良いです

  • sensu-clientのログ
  • sensu-serverのログ
  • graphiteのcarbon listenerログ

ohai最高って思うとき

ohaiございます私です

例えばsensuコミュニティプラグインのcheck-redis-memory.rbを利用するとき、 maxmemoryパラメータを設定していない場合、 サーバに搭載されているメモリ量と比較して使用率を判定してみます。

ohaiのmemory attributeを使うと幸せになれます。

Redisのmemory使用率がusage/memory_total70%を超えたらwarning Redisのmemory使用率がusage/memory_total80%を超えたらcritical

warning_memory = node.memory.total.gsub('kB','').to_i * 0.3
critical_memory = node.memory.total.gsub('kB','').to_i * 0.2
sensu_check "check_redis_memory" do
    command %{check-redis-memory.rb --host #{node.redis_host} --port #{node.redis_port}  --warnmem #{warning_memory.round} --critmem #{critical_memory.round} }
    standalone true
    handlers node.sensu.default_handlers
    interval node.check_redis_interval
end

おわり。 ohaiさいこう