ニクニクドットミー

カッコいいおっさんを目指すエンジニアの厳かなブログ

調子にのってDocker化しまくったらしんどかった話

Docker

前回Sentryというエラートラッキングツールのplaybookを書きました。 もってけエンジニア!エラートラッキングツール【Sentry】のplaybookを書いたよ

このSentryをDocker化してしまえ!と思い、Dockerで構築してみたのですが、しんどいことに気づいたので、メモっておきます。

※Kubernetes,composeとか使えば楽になるんじゃないかと思います。あくまでもDockerのみでやろうとした時の感想です。

結論 --linkだらけにすると地獄をみる

githubに上げました。MySQLはsentryのmigration済みのデータが入っています。 MySQLの容量が300MBあったので、上げれませんでした^^;なんか方法考えます。。。 https://github.com/maaaato/docker-lab/tree/master/sentry ※一応リンク。

どういう構成でDocker化したか図を載せます。 docker sentry

インターネットからのアクセスはnginxで受け、バックエンドのsentryサーバへproxyする形です。 あとはsentryで必要なMySQL(PostgreSQL)、Redisを用意しています。

これらをコンテナ化しましたが、図を見て頂くとわかると通りにコンテナ同士を通信させる必要があります。

Dockerのコンテナ同士の通信には

docker run -d --link CONTAINER_NAME:ALIASE IMAGE_NAME

といった様に

--link

オプションが必要になります。

図の例で言いますと、nginxはsentryサーバへproxyさせています。この時どのようなconfになっているかと言うと、


upstream sentry {
    server sentry-docker:9000;
}


server {
    listen 80;
    location / {
        proxy_redirect     off;
        proxy_set_header   Host              $host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;

        proxy_pass http://sentry;
    }
}

proxyさせる先をsentry-dockerといった様に書いています。

--linkでCONTAINER_NAME:ALIASEで、ALIASEをsentry-dockerと指定してdocker runさせています。 こうすることでnginxのコンテナ内の/etc/hostsには、


172.17.0.9      2b312db7e6b4
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.8      sentry-docker 1f4c972658c2 sentry

このようにsentryサーバのIPアドレスが書き込まれます。 sentryサーバの--linkも同様で、MySQL、Redisも同じように各コンテナのIPが/etc/hostsに登録されます。

docker ps

の結果

CONTAINER ID        IMAGE                  COMMAND                CREATED             STATUS              PORTS                NAMES
2b312db7e6b4        maaaato/nginx          "/bin/sh -c '/usr/sb   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp   nginx
1f4c972658c2        maaaato/sentry         "sentry --config=/et   5 minutes ago       Up 5 minutes        9000/tcp             sentry
5473ad46ec96        maaaato/redis          "/entrypoint.sh redi   17 minutes ago      Up 17 minutes       6379/tcp             redis-docker
cdb6a0adf437        maaaato/mysql-sentry   "/usr/bin/mysqld_saf   18 minutes ago      Up 18 minutes       3306/tcp             mysql-docker

つまり!!

ここでMySQLのコンテナをstopし、新規にrunしたらどうなるでしょうか? MySQLのコンテナが新規に立ち上がるので、新たにIPが割り振られます。

つまり!MySQLへlinkしているコンテナはIPが変わった事なんてしらないので、あれ?接続できないぞ。。。となってしまいます。南無。 まぁ当たり前か。。。

先ほどの図では、sentryコンテナからMySQLコンテナに接続していました。これを再び接続し直すには、sentryコンテナをrestartして、nginxコンテナもrestartが必要です。 restartでうまくいかない場合は、コンテナの作り直しが発生してしまいます。

まとめ

Dockerでlinkさせまくると一カ所が死んだときに影響範囲が大きくなってしまう可能性があります。 Docker化を進めるにあたり、Docker化にするところしないところをしっかり設計する必要があると感じました。 Kubernetes,composeはまだ試していないのですが、Dockerの管理が楽になるもの?だと思いますので、次は試してみます。

参考サイト

Dockerのネットワークについてはこちらの記事がとても分かりやすいです。 Dockerのネットワークの基礎 Dockerコンテナ間のlink,database.ymlの書き方

もってけエンジニア!エラートラッキングツール【Sentry】のplaybookを書いたよ

sentry

Ansibleのplaybookをちょくちょく書いてます。

業務で【Sentry】というエラートラッキングツールを使っているのですが、それを構築するplaybookを書いてみました。

といってもすごく簡単な事しかしてません。

https://github.com/maaaato/Ansible-Sentry

ポイントとして、postfixをAnsibleで入れるときにdebconfを使いました。

参考サイト

sentry Sentry + Django コトハジメ

まとめ

OSSと商用版があるのですが、OSS版ですと7.5.4でユーザ作成時にプロジェクトを作るにチェックを入れて、登録ボタンを押すと、エラーとなってしまいます^^;

さらに、チェック入れずに登録しても、作成したユーザでログインするとリダイレクトループが発生してしまいます... スーパーユーザでプロジェクトを作り、そのプロジェクトに招待するという形であればリダイレクトループやエラーにはなりませんでした。

だれがこの現象知ってますか?

【オススメ】最高にうまい梅干しが食べれるおうすの里には京都に行ったら必ず行くべし!

白寿の梅

さてGWが終わって1ヶ月ほど経ちましたが、いかがお過ごしでしょうか。

僕はGW開けにリフレッシュ休暇という5日間休みが貰える制度を利用して、さらに休んでダラ〜と過ごしていました。

ただ、ダラ〜と過ごしていた訳ではなく、友人に会うため、奈良県に行って参りました。

高知の友人なのですが、現在は奈良に住んでおり、来年あたりに結婚するとのことでこれは会わなければと思い、高知に住んでいる共通の友人と共に行きました。

そこで、せっかくだから大阪・京都を周ろうということになり、京都に立ち寄った訳です。

実は京都に行くのは二回目で、去年の11月頃に奥さんと一緒に2泊3日の旅行に行きました。そのときに出会ったのが「おうすの里」です。

おうすの里って?

天保の時代より梅作り一筋に励んでまいりました。祇園店は平成11年に開店。 梅本来の持ち味を生かしながら、可能な限り塩分を控えた、うす味でさわやか な後味が特徴です。これからも、梅を知り尽くした職人達の繊細な技によって、 その味を大切に守り続けてまいります。 一粒一粒丹念に仕上げられた梅干しをぜひご賞味ください。

京都の梅干し屋さんです。梅作りのプロ中のプロ。 たくさんの種類の梅干しや梅を使った商品があります。祇園が本店のようです。 京に咲く梅 おうすの里 祇園本店 | 祇園商店街振興組合

今回の旅行で友人におうすの里に連れて行ってあげたいと思い、嵐山店へ向かいました。前回に行ったのも嵐山店です。

お店に入るとズラーっと商品が並んでおり、店の奥にはカウンターがあります。そこでほぼ全ての商品の味見ができます。ほぼ全てってやばい。

オススメ商品の味見をしつつ、商品一覧を見せてもらい、そこで気になったものを味見します。全部おいしいので、本当に迷います。

おうすの里で買ったもの

これが買った商品たち!前回は梅ひじきを買い忘れたので、忘れずに購入!

買った商品の紹介

梅すぐき

梅すぐき 梅すぐき

すぐきとは京都の伝統的な漬け物の一種みたいです。そこに梅が入っていて、すっぱうまい仕上がりになってます。

ご飯に乗せて食べてもいいですが、昆布茶をかけたご飯の上にたっぷり乗せて食べるとめちゃうまいです。

梅ひじき

梅ひじき 梅ひじき 梅ひじき

前回買い忘れてしまった梅ひじき。今回は忘れずに買いました!

しょっぱ過ぎない味付けで、梅はすこし甘い仕上がり。ひじきとの相性が抜群で、お弁当によく乗せてます。うまい。

梅のり

梅のり 梅のり 梅のり

梅のり。磯の香りと梅のさわやかな香りとご飯に乗せるだけで食欲が爆発。

梅の身がはいっていて、いい感じにすっぱくて最強にうまい。

白寿の梅

白寿の梅 白寿の梅 白寿の梅

おうすの里で最強にうまい、マジでオススメの一品。梅にんにく。

青森産の臭くないにんにくを使用しているので、にんにく臭くなることはない。

梅のすっぱさとにんにくの歯ごたえがバツグン!おかずにもいいですが、お酒のおつまみにも合います。

5tくらいほしい商品。マジでいっぺん食べてほしい商品。

通販できるの?

電話注文もしくはFAXでの注文になります。こんなページを見つけました。 おうすの里祇園本店 お問合ご注文専用 - 京都市/食品:マピオン電話帳

実は電話注文、FAXでの注文の存在を知らなくて、実際に店舗に行かないと買えないものだと勘違いしてました(笑)

嵐山店にしか行った事がないですが、梅酒もたくさんおいてあります!試飲はできないですが^^;

これは前回に買った梅種セット。赤い梅酒からメープルの梅酒など5種類のセットです。 梅酒

まとめ

また行きたい!!!

【AWS】CodeDeployでS3をRevision Locationにしてデプロイしてみた

Codedeploy つい先日CodeDeployを試してみました。【AWS】5分で分かるAWS CodeDeploy その時はGithubと連携してデプロイを試したのですが、今回はS3で試してみたいと思います。

前回の記事で用意したApplicationを使いまわします。

S3バケットの作成

肝心のS3バケットを作成します。バケットのリージョンに注意しましょう。 CodeDeployはヴァージニア、オレゴンにしか対応してないので、それ以外のリージョンに作ってしまうとデプロイがDownloadBundleでコケます。 s3

aws deploy pushでリビジョンのアップロード

リビジョンとはデプロイするソースコードを指します。 リビジョンのアップロードにawscliを使ってみます。 ちなみにawscliのversion。2015/04/22時点の最新。

aws-cli/1.7.23 Python/2.7.5 Darwin/13.4.0

awscliにdeployとかあったんですね。知らなかった^^; ドキュメントはこちら。 http://docs.aws.amazon.com/cli/latest/reference/deploy/push.html

aws deploy push --application-name WordPress_App --description "This is my deployment" --ignore-hidden-files --s3-location s3://CodeDeployDemoBucket/WordPressApp.zip --source /tmp/MyLocalDeploymentFolder/

sourceで指定したディレクトリをzip圧縮して、それをs3-locationで指定したS3バケットにアップロードします。 今回は前回作ったApplicationを使い回してますが、aws deployコマンドでApplication作ることもできます。

サンプルを例にdeploy push してみます。前回のApplicationを使うので、test_v1という前回作ったものを指定してみます。


aws deploy push --region us-west-2 --application-name test_v1 --s3-location s3://s3-deploy/test_v1.zip --source ./CodeDeployLab/

push成功すると、こんな感じ


To deploy with this revision, run:
aws deploy create-deployment --application-name test_v1 --s3-location bucket=s3-deploy,key=test_v1.zip,bundleType=zip,eTag="66f02fcb38c7e4987e7bb0ee246c6b50" --deployment-group-name  --deployment-config-name <deployment-config-name> --description <description>

eTagというのがつきました。

Etagはオブジェクトのハッシュです。Etagはオブジェクトのコンテンツの同一性を識別するものなので、メタデータの変更はEtagには反映されません。 Etagはオブジェクトが作成されたときに決まります。 PUTまたはPOSTオペレーションにより作成されたオブジェクトの場合、Etagはクォート付の32桁の16進数となり、これはオブジェクトデータのmd5ダイジェストを表しています。

オブジェクトのコンテンツの同一性を識別するものみたいです。 s3_1

CodeDeployでデプロイする

Create New DeploymentでRevision TypeをS3を選択します。 s3_2

これでデプロイ! s3_3 無事成功ですね。

失敗もしたのですが、その時はS3のバケットをTokyoリージョンで作ってしまったが原因でした。

まとめ

自動化必須! 次はLambdaと組み合わせて自動化してみよう!

参考

LambdaでCodeDeployの自動デプロイ機能を実装する

【AWS】5分で分かるAWS CodeDeploy

Codedeploy

久々にAWSのサービスを触ってみました。というのもデプロイの仕組みをカイゼンしたいなーと考えていて、社内でもどうしよか?と話をしていました。 現状はfabricというPython製のツールを使っているのですが、fabricを動かす為に環境を整えてあげる必要があったり、依存しているライブラリのバグが影響して、デプロイができない時があったりと、深刻な状況です。 AWS CodeDeployであればマネジメントコンソールから実行もできるので、環境構築の手間が省けるので、良いのではと思い軽く触ってみました。 触ってみた感想と、CodeDeployを簡単に説明したいと思います。 ※5分は釣りです^^;

AWS CodeDeployとは

AWS CodeDeployはEC2,AutoScaling,オンプレミスに特化したデプロイサービスです。 たしか2014年11月ぐらいに登場しました。ただ、サービスを提供しているリージョンがオレゴン、ヴァージニアのみ(2015/04/19時点)ですので、 東京リージョンはまだ使えないです。残念。はやく対応してほしいです。

リポジトリとして、S3、Githubが対応しています。今後はAWS CodeCommitと連携もするようです。 うちの会社ではリポジトリをStashで管理している為、対応していません。今後に期待!?

CodeDeploy用語

codedeploy-agent デプロイ対象となるサーバには必須になる。 S3からコピーしてインストールする必要がある。


$ sudo yum update
$ sudo yum install aws-cli
$ cd /home/ec2-user
$ aws s3 cp s3://aws-codedeploy-us-east-1/latest/install . --region us-east-1
$ chmod +x ./install
$ sudo ./install auto

appspec.yml アプリケーションのソースコードをどのディレクトリに配置するか、どのような権限で付与するかを決めるファイル。 またCodeDeployのライフサイクルに応じた処理をどうするかとかも記載する。必須

Application Name アプリケーション名。そのまんまだけど、実際につけるとするとプロジェクト名_環境名って感じになるのかな? hoge_productionとか。

Deployment Group Name デプロイ対象のグループ。グループの選び方はEC2のタグのKey,Value、AutoScalingGroup名、オンプレミス。 codedeploy codedeploy

Deployment Configuration デプロイ方法。デフォルトでは、

  1. CodeDeployDefault.AllAtOnce
    一度にすべてのインスタンスにデプロイする。最低1つのインスタンスにデプロイが成功した場合、全体のデプロイが成功したものとする。すべてのインスタンスへのデプロイが失敗した場合、全体のデプロイが失敗したものとする。
  2. CodeDeployDefault.OneAtTime
    インスタンス1つずつにデプロイする。全てのインスタンスにデプロイが成功した場合、全体のデプロイが成功したものとする。デプロイが失敗した時点で失敗と扱われるが、既にデプロイが成功したインスタンスはそのまま。
  3. CodeDeployDefault.HalfAtTime
    一度に総インスタンス数の半分までデプロイする。総インスタンス数の半分までデプロイが成功した場合、全体のデプロイが成功したものとする。全体のデプロイが失敗した場合でも、既にデプロイが成功したインスタンスはそのまま。

codedeploy_3

Service Role CodeDeployがEC2インスタンスにアクセスするロール。 codedeploy_4

デプロイの流れ

他のブログを参考にデプロイするリポジトリ作りました。 1.Applicationの作成 実は上の画像がほぼApplicationの設定の流れになります。ここではアプリの名前とデプロイ対象のグループを作る感じ。その枠を決めたイメージです。

2.デプロイするリビジョンの選択 1でCreate Applicationしたら遷移する画面。 deploy_settings 右のオレンジ枠がデプロイされたリビジョンの履歴が記載される所。ここから前のリビジョンをデプロイしたりする。つまりロールバックに使う感じ。 左の赤枠が、Deploy Group。ここからデプロイするソースを選択する。

deploy_settings_1.png

S3,Githubを選択する画面。 Create New Deployment

実はデプロイを実行する度にこの画面の入力はしないといけない。 リポジトリ名、コミットIDをいちいち入力するのがすごく面倒くさい。 自動化必須

Deploy結果とNGパターン

デプロイに成功するとこうなります。 deploy_success_1 デプロイ対象のインスタンスは2台あったので成功してますね。

次にNGパターン deploy_success_2 Deployment ConfigurationをCodeDeployDefault.OneAtTimeに設定していたので、一台ずつデプロイしています。 まず一台にデプロイしてFailedとなったので、残りのもう一台にはSkippedとなってデプロイ実行されてないです。 View All Instancesをクリック。

deploy_success_3 実際にどこで失敗したのかは赤枠を見ると分かります。 BeforeInstallで失敗したようです。 次に青枠のView Eventsを見てみましょう。

deploy_success_4 View Logsをクリック。

deploy_success_5 エラーメッセージが出てますね。よくわかりませんが。。。 この時どこに問題があったかというとappspec.ymlです。 appspec修正。 appspecのosの書き方が違ったので、修正

ほんとしょうもないミスなのですが、先ほどのメッセージからでは分かりにくいですよね。

まとめ

かなり雑になってしまいましたが、触ってみた感想を。

  • 自動化しないとツライ。コミットIDとかいちいち入力するのツライ
  • ロールバックするときにどのリビジョンがどういう修正だったかわからない。UIにタグが付けれて、デプロイする時に追加できると良いと思う。
  • codedeploy-agentの死活監視必須

参考

GitHubリポジトリと連携してAWS CodeDeployを使う(準備編) GitHubリポジトリと連携してAWS CodeDeployを使う(デプロイ編) AWS CodeDeploy を使って Rails アプリケーションをデプロイしてみた [新サービス] AWS CodeDeployを触ってみた #reinvent

kamakura.go#2に参加してきた!

28日に鎌倉で行われたGoの勉強会 kamakura.go #2に参加してきました。

第一回目の開催には所用があった為、参加できず、二回目開催してほしいなーとtwitterでつぶやいていたら、二回目開催されるとのことだったので、即申し込みしました。

ちなみにiichiさんで開催されているのですが、iichiさんのslackのGoのチャンネルに参加させて頂いてます。

勉強会としてはもくもく会で、最後に成果発表がありました。

成果発表時にやったこととkamakura.goの感想をslideにしたので、張っておきます。

会場はiichiさんで、場所は鎌倉にあります。小町通にあるので、休日は人がすごいです。

僕はよく鎌倉には行くので、人ごみは想定内でしたが、一緒に行った同僚の方は初鎌倉で面食らってました(笑)

とても天気がよくて鎌倉を散策するにはもってこいな日でした。

勉強会終了後の懇親会で鎌倉の焼き鳥屋に行ったのですが、そこの大将がすごく人に絡む人で、同僚が気に入られてしまい、ずっとその話で盛り上がりました。(おつかれさまでした^^;)

夜の鎌倉は初めてで、だいぶ人も減り、小町通もシャッターがすぐおりてました。昼間とはガラっと雰囲気変わるので驚きでした。

kamakura.go #3あれば参加します!

鎌倉で気になるお店も出来ました。尾崎、ブルールーム。これは行ってみたい!

やっぱ鎌倉いいとこだ。

【資料公開】社内LTで「プログラミング学習の3つのポイント」を話しました。

社内でLTを月に一回ぐらいのペースで開催していて、久々に登壇しました。

久々に発表用資料を作りましたが、頭の中を整理するのにちょうどいいですね。あとLTで意識しているのは「緊張感を楽しむ」ということ。 これは中学時代の部活(実はバレー部のキャプテン)で先生に教えてもらった言葉ですが、いまも意識しています。

大した話ではないですが、資料公開しておきます。 (今年は発表に力入れているので)

1.SIMPLE シンプルに継続する。

継続は力なりという言葉の通り、続けるとすこしずつ成長はする。 運動もそうで、ジムに週6日くらい通っている奥さんの方が、だんぜん動ける。。。頑張ろう。

2.EASY&SMALL 小さく簡単に作る。

少しでも動くとやっぱ楽しい。いきなりでかいものは作れないので、少しずつ進めていく。 そして、簡単なものでいいから作る。

3.READ コードを読む。

コード読むのはメリットだらけ。次第に読めてくると楽しいし、アイディアも湧く。 尊敬・憧れのエンジニアのコードだと尚更。

憧れのエンジニアはメルカリの久保さん。これはdotsSummit2015の発表を見て、カッコイイと思いました。 発表も冷静沈着な印象で、僕とは違う感じ(笑) slackboardの話で、イラっとしてGoでささっと書いたという話が印象的で、インフラでしっかりコードが書ける久保さんのようになりたいと思いました。 なので、slackboardのコードはgithubで読んでます。

ということで、pocket-for-Golangを頑張るぞ。