読者です 読者をやめる 読者になる 読者になる

okochangのインフラ日誌

ふらふら適当に世間を生きる日々でございます

AWS Config Rules RepositoryにPRを送ってみた

AWS

こんにちは、今回は久しぶりに技術ネタを書きます。
少し前の話になりますが、OpsJAWSというイベントAWS Config Rulesのハンズオン講師をしてきました。
AWSの基礎知識はあるものの、AWS Config Rulesはまだ触ったことがない人を対象に、AWS Managed Rulesの使い方からCustom Ruleを試してみるところまでを一通り体験してもらいました。内容は以下の資料を見て頂くとある程度把握出来ると思います。

Custom RuleではVPC Flow Logsが有効になっているかをチェックするPythonのコードをサンプルとして使ったのですが、少し前にCustom RuleのコミュニティリポジトリであるAWS Config Rules Repositoryというものが公開されました
というわけで、ハンズオンで使用したコードを少し手直ししてPull Requestを送ってみました。
スクリプトの追加はもちろんですが、Rules.mdの更新とライセンスに同意する旨をPRのメッセージに書き込んであげると良さそうです。
以下のようにPRがマージされContributerに追加されてますね、わっしょい!

Contributors to awslabs/aws-config-rules · GitHub

f:id:okochang:20160312111439p:plain

まとめ

JAWS-UGのハンズオンとか使用したコードもこういうかたちで公開出来ると良いですね。

参考

ロードバイク購入から3ヶ月経過したまとめ

Life

こんにちは、@oko_changです。 インターネットでブログなどを見ていると、入社後◯ヶ月たったので感想をといったエントリーがあるのですが、私は転職したことがありませんので記事を書けません。
しかし、ロードバイクを買ってから3ヶ月が経過したのでここまでの感想をまとめておきたいと思います。

いつ走っているのか

ロードバイクを購入したのが夏だったということもあり、もっぱら早起きをして自転車に乗っています。
購入した当日、午後2頃から江戸川サイクリングロードに走りにいって、猛暑のために30分程度でフラフラになったのが懐かしい(しかも、なぜだかドリンクもお金も持ってなかったのんですよねー・・・)。朝5時半に起床して、6時前には走り出しているのですが、最近は日の出前は寒くなってきました。
会社に出社する日は1時間強くらい(距離にすると30キロくらい)乗り、自宅で仕事をする場合や土日は2時間強くらい(距離にすると60キロくらい)走っています。昼間に眠くならないように、必要に応じて帰ってきた後に仮眠を取ります。
最近、夜に乗っても大丈夫なくらい明るいフロントライトと、テールライトを購入したので、30キロ強の道のりを自転車通勤してみましたが、「汗をかいてしまうと気持ち悪くて仕事どころじゃなくなる」、「会社を通過してどこか遠くに行きたくなる」といった理由で当分は封印しようかなと思いました。カバン中にPC入ってて重いですし、通勤する場合は何かしらの対策が必要かなと。

計算が怪しいなと感じつつも、3ヶ月現在で約1500キロ位走ったようです。なんとか1回のライドで100キロも達成。

f:id:okochang:20151110230508p:plain:w300

前回から追加購入したもの

3ヶ月の間に自転車グッズが増えてきました。最初に購入したものが合わなくて、買い直したものもありますね。この辺も振り返ってみます。

新しく買ったモノ

テールライト

夜間に走ることがないので必要なかったのですが、最近は日の出の時間が遅くなりましたからね。テールライトをサドルにつけたくて、オプションパーツも合わせて購入しました。

タイヤ

前回のブログでも書いていたようにタイヤを付け替えてみたかったので、2本セットのものを購入。苦戦しながらも動画を参考に自分でタイヤ交換出来ました。

バーテープ

3ヶ月たってそろそろ汚くなってきてるかなーと思ったのもあり、最近になって交換。こちらも苦戦しつつも自分で交換することが出来ました。

これは自転車購入時に買った気もしますが、前回のリストにのっていなったので。基本的に外に停めておくことはないのですが、念のため買っておきました。

crops(クロップス) バイパー GVP02/φ10×1500mm/ブラケット付 スモーク

crops(クロップス) バイパー GVP02/φ10×1500mm/ブラケット付 スモーク

コルクマット

普段自転車は室内に置いているのですが、下の階の人に迷惑がかからないように、床を傷つけないように買いました。メンテナンスマットも考えたのですがコルクマットの方が音を吸収してくれそうなので、30cmサイズを2つ購入。

www.nitori-net.jp

ビンディングペダル

3ヶ月経過してフラットペダルでロードバイクに乗ることには慣れてきたので、ビンディングペダルにも挑戦しました。SPDにするかSPD SLにするか迷いましたが、最終的にはSPD SLを使うことになるだろうと思いってSPD SLのエントリーモデルを購入。
エントリーモデルだけあって外しやすいので、思ったほど苦戦はしませんでした。

ビンディングシューズ

ビンディングシューズはSPD SLのペダルがどうしてもダメだった場合のことを考えて、アダプタをつければSPDにも使えるシューズを選びました。とはいえ、先ほど書いたように苦戦しなかったのでSPDペダルを買うことはなさそう。

ペダル取り外し用に工具

自宅にペダルのサイズにあった工具がなかったので購入。サイズが合うもので作業をすれば取り外しはそんなに難しくないですね。

同じ機能のもので買い直したもの

ボトルケージ

当初、ペットボトルも専用のボトルにも対応しているボトルケージを使っていましたが、ペットボトルをはめる事がありませんでした。というわけで専用のボトルが出し入れしやすいものに変更しました。

www.amazon.co.jp

フロントライト

前回のブログでフロントライトは交換予定と書いていましたが、夜間に安全な走行が出来るようなものに変えました。ケチらずに最初からVOLT300買えばよかったなと思いつつも、タイミングよくVOLT400が発売されたのは幸いでした。

iPhoneスタンド

自転車購入時に用意していたスタンドはiPhoneを水分から守るカバーが取り外しが出来たのですが、カバーを付けていない時に汗が内部に入ってしまったのかiPhoneを壊してしまいました。泣く泣くiPhoneを中古で買い直してスタンドもしっかり全て覆うタイプのものに買い直しです。

合計金額

その他にも掃除道具とか雑費もあるのですが、現時点までに合計20万6千円の出費となったようです。当初の想定の何倍になったんや・・・

3ヶ月の感想

ロードバイクを初めて3ヶ月、自分としてはスピード出して快調に走行しているつもりが後ろからすごいスピードで追い抜かされたり、前にゆっくり走ってる人がいたから追い抜いたら、急にスピード出して追いついてきたりもしていますが、とても楽しいので購入は大正解でした。
ただライトなど下調べが甘かったものは購入し直しになったので、購入前の下調べや実際にモノを見てみる事の大切さが身にしみました。

Amazon Web Services実践入門を共著しました。

こんにちは、@oko_changです。
すでにご存知の方もいらっしゃると思いますが、Amazon Web Services実践入門という本を共著で執筆しました。 「いつ発売されるのか?」「本当に発売されるのか?」「もしかしてネタか?」という噂がまことしやかに囁かれつつも、いよいよ11月10日に技術評論社さんから発売されます(既に購入出来る店舗もあるようですよ)。

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

※ 私は8章(ELB)と9章(CloudWatch、AutoScaling)を担当しました
電子書籍がお好みの方はこちらから

今までSoftware DesignWEB+DB PRESSといった技術雑誌のコーナーの一部を担当することはありましたが、1冊の本に関わらせて頂く事はありませんでしたので、とても良い経験をさせて頂きました。

どのような本か?

本の目次からも分かるように、これからAWSを学ぶ人に、AWSの特徴(リージョンやアベイラビリティゾーン)の説明から、その特徴を活かしてインフラを構築するために必要なことを解説しています。この本にそって学習して頂くことで、いわゆるLAMPシステムをAWSのメリットを活かして構築することが出来るようになると思います。
AWSと一言で言っても、既に50近いサービスが存在します。今回はその中から初学者が扱い易いサービスを選んで解説しておりますので、この本でAWSの基礎を固める事も出来ますし、他のAWSサービスを知るきっかけにして頂くことも出来ると思います。
GUIの操作だけでなく、AWSコマンドラインインターフェースを使った方法も紹介しておりますが、インストール方法から解説をしておりますので、普段あまりコマンドラインを使い慣れない方もチャレンジして頂けると嬉しいです。

参加のきっかけ

お仕事、勉強会、コミュニティ活動でもお世話になっている@iaraさんから声をかけて頂いて今回の執筆に参加することになりました。
その他の執筆陣の方もコミュニティ活動などでお世話になってる方々なのですが、普段とは違った形で関わらさせて頂くことは、とても刺激的でした (普段お仕事で直接関わる事が少ない社外の人と1冊の本を作ることが出来るというのは、執筆に参加したいと思った理由の1つです)。

執筆方法

すでにデファクトスタンダートなやり方かもしれませんが、以下の資料にに記載されているようにGitHubを使って執筆していました。

スタートした時は連絡用にFacebookのグループ機能を使っておりましたが、最終的には連絡もGitHubのIssueになり、情報がGitHubに一元化されるようになりました。使い慣れたエディタで執筆することが出来ますし、普段の業務でGitHubを使ってる事もあって慣れないツールを使うオーバヘッドがなく、執筆しやすかったです。
執筆担当者は自分の作業ブランチに原稿を書き書き終わった段階でPRを作成といったように執筆しておりましたが、それぞれ普段の開発サイクルが若干違ったりするので、もう少し最初にきちんとルールを決めておけば良かったなと反省しております。

おわりに

ご自身で10冊程度ご購入頂くも良いと思いますし、誕生日や記念日が近い方はAmazonウィッシュリストに10冊ほど入れていただき、プレゼントして頂くというのも素敵な事だと思います。
また、執筆中の裏話などはお酒なくしては語れませんので、懇親会などで話しましょう。
最後に色々とご迷惑をおかけしました技術評論社の春原さん、誘って頂いた@iaraさん、一緒に執筆した@NowTomさん、@Nagafuchikさん、@matetsuさん、@memorycraftさん、ありがとうございました。この場を借りてお礼させて頂きます。

執筆メンバーのブログ

qphoney.hatenadiary.com

gyori.hatenablog.com

matetsu.hatenablog.com

初めてのロードバイク購入までの振り返り

Life

Twitterの投稿を振り返る限り、2015年6月5日にロードバイクを買う気になってから約2ヶ月待ちに待った納車がされました。 というわけで、いつか振り返るときのために購入までの記録を残しておきます。
文中に出てくる意見は個人的なものですので、参考までにご覧下さい。

購入する自転車を決めるまで

ロードバイクを初めてみようと思ったものの、どんな自転車を買って良いのかは分からないですし、すぐに飽きてしまうかもしれないので、とにかく最初の一台は費用がかからないものを買おうとしていました。もちろん、ロードバイクを始めるときにかかる費用なんてものは知りませんでしたし、ググってみてビックリした記憶があります(このころはとりあえずロードバイクだけ買えばOKなんだとも思っていました)。
そんなこんなで候補にあがったのが以下のようなもの。

item.rakuten.co.jp item.rakuten.co.jp item.rakuten.co.jp item.rakuten.co.jp

モノはとにかく2万円〜5万円くらいで考えていたのですが、日頃からお世話になってる@iaraさんに相談したところ、最初は通販はやめておいた方がいいコトと、候補にあげていたもののほとんどがシフトレバーがついているタイプのもので、使いづらいのでは?というアドバイスを頂きました(言ってることの意味は理解出来ませんでしたが)。 そこで「こんなのどう?」ってことで以下のまとめを教えてもらいました。

matome.naver.jp

リンクを見て、「この人は仕事でも予算とか無視して、倍の金額で提案とかしてるのかな?」という気持ちを抑えつつ、もう一度購入するロードバイクをじっくり考えなおすことにしました。 この時@iaraさんからは「完成車を買うべし」と教えてもらいましたが、自転車は全部出来上がってから売られているでしょと思いつつ、既読無視したと思います。
また、じっくり考えなおすと言いながら、買うと決めてしまってからには早く自転車に乗りたいので、その翌日には自転車屋へ言ってこんなロードバイクを注文。メーカーに在庫があれば一週間程度で届きますよということでした。

www.job-cycles.com

f:id:okochang:20150714153507j:plain

この頃になると、ロードバイクは完成されているはずの完成車でもペダルを買わないといけなかったり、フロントライト、ベル、仏式の空気入れなどなど色々と購入する必要があることが分かってきました。そんなわけでAmazonで検索しながら自転車の到着を待っていました。
一週間後、自転車屋さんからは待望の連絡が来たのですが、「メーカーに在庫ありませんでした、来月の入荷までかかってしまいますねー」という宣告を受け、ここから私の悶々とした日々が続きました。

納車までに購入したもの

ロードバイクを楽しむためには自転車本体以外にも色々と購入するものが必要でしたので、購入したものをまとめておきます。
こういうのを調べながら、なんとか納車までの時間を消化出来たような気がします。

空気入れ

ロードバイクの空気入れはママチャリとかとバルブの形式が違うということで、仏式バルブの空気入れを買いました。参考にしたまとめサイトと、実際に購入したのは以下のものです。

matome.naver.jp

これから色々と買う必要があるので、あまり高くないというのと、メーターが上の方にあった方が見やすそうだなってので選んだ感じです。それと「おお、ルイガノ、自転車探してたときに見たやーつだ。」みたいな発想で決定してしまいました (反省)。

ボトルゲージ

梅雨があけたら、すぐに夏ということで水分補給が出来るようにボトルゲージを選びました。ロードバイク乗りな人達は水分補給のために専用ボトルを使ってるのですが、最初はペットボトルをそのままつければ良いかなと思っていて、ペットボトルも専用ボトルでも両方対応している以下のものを購入。

TOPEAK(トピーク) モジュラー ケージ 2

TOPEAK(トピーク) モジュラー ケージ 2

とはいえ、ペットボトルだと自転車漕ぎながらの水分補給は無理っぽいので、最終的に専用ボトルを購入。ペットボトル対応はそんなに意識しなくても良かったかなと思い始めてきました。

ボトル

自転車漕ぎながらペットボトルの蓋を外して水分補給は無理ということで、専用ボトルを購入。夏だとすぐにぬるくなってしまうので、保冷機能があるもを選定。

POLAR(ポーラー) ポーラーボトル 0.71L プラチナム PBB-24-GPLT

POLAR(ポーラー) ポーラーボトル 0.71L プラチナム PBB-24-GPLT

ライト

ライトは以下のサイトを見てVOLT300が欲しいなと思っていましたけど、それなりに費用が必要です。

blog.livedoor.jp

とはいえ、これからの出費を考えると少し金額抑えたいなーと思って、安めのものを購入。購入後、夜に街灯が少ないところだと危ないかなと思い出してきたのでもっと明るいものにアップグレード予定。

こちらはベルと一体型で、ハンドルまわりがスッキリしそうで気になっています。

ツールケース

ロードバイクはママチャリとかと比べるとタイパがパンクしやすかったりするみたいで、パンク修理セットや予備のタイヤチューブをいつでも使えるようにするようです。そういったものをサドルバックツールボトル、ツールケースなどに入れるようですが、ツールケースで持ち運ぶことを選びました。
ドルバックは個人的に見た目が好みではなく、ツールボトルは自転車で走っているときの音が気になることもあるようなので、ツールケースが良いかなと思いました。

ビットリア プレミアムジップツールケース

ビットリア プレミアムジップツールケース

この辺から、金額を意識してグッズを集めていてもそれなりの金額になるので、気に入ったものをガンガン買う方が良いかなと思いだしてきてマズイってなりました。

サングラス

必要ないかなと思っていたのですが、ロードバイクで走っていると虫が目に入ったりすることあるということなのでとにかく安いものを購入しました。

ヘルメット

ネットで検索していて、「キノコ」には気をつけるべしということを学びました。

sado-roadbike.hateblo.jp

自転車ショップに足を運んで実際に試着してみて以下のものを購入。キノコまじ恐怖なので、購入する人は店頭で試着したほうが絶対いいですね。

OGK KABUTO(オージーケーカブト) FIGO[フィーゴ] M/L ブラック

OGK KABUTO(オージーケーカブト) FIGO[フィーゴ] M/L ブラック

サイクルコンピュータ

ケイデンスあと30回転あげます」って僕も言ってみたいので自転車の走行距離や時速も図りたいですが、自転車のペダルの回転数を保つように心がけることも大事なようなので、ケイデンスが計測可能なサイクルコンピュータを探しました。
とはいえ、安いサイクルコンピュータケイデンスが計測出来ないものが多く、最終的にはiPhoneアプリと連携して使用可能な以下のものを購入。

iPhoneに無料のサイクルコンピュータアプリをインストールし、購入したセンサーとBluetoothで連動してケイデンスが計測出来ます。

iPhoneスタンド

iPhoneサイクルコンピューターとして使うことにしたので、スタンドが必須になりました。急な雨に降られた時のことを考えて防水カバーがあるものを選択。

スタンド

自転車のメンテナンスをするときにスタンドが必要みたいなので、スタンドも購入。自転車来てないのにメンテナンスのことを考えるとか、やるせない気持ちになりました。

jitensha-hoken.jp

MINOURA(ミノウラ) ディスプレイスタンド [DS-30BLT] 折りたたみ式 ブラック

MINOURA(ミノウラ) ディスプレイスタンド [DS-30BLT] 折りたたみ式 ブラック

レーサーパンツ

ロードバイクで長時間走ると、どうしてもお尻が痛くなってしまうようです。普段からデスクワークということもあり、痔には気をつけたいということで安いものを購入。

当初、インナーパンツを購入しようとしたら色間違いを発注してしまったのは良い思い出。ショッキングピンクはちょっときついですなー。

グローブ

きちんとハンドルが握れるように、そして長時間自転車に乗っていると手がしびれてきたりするみたいなのでグローブも購入しました。レース向けなものは最初は必要ないかなと思ったので、以下のものを選びました。

パンク修理セット

ロードバイクで走行中にパンクになってしまった時のために購入。ツールケースに入れて持ち運ぶ予定。

携帯ポンプ

パンクにの修理が出来たとしても、空気を入れられないと意味ないですねということで購入。

TOPEAK(トピーク) レースロケット HP カラー:ブラック

TOPEAK(トピーク) レースロケット HP カラー:ブラック

携帯工具セット

こちらも走行中に工具が必要なときのために購入。ツールケースに入れています。

TOPEAK(トピーク) X ツール カラー:ブラック

TOPEAK(トピーク) X ツール カラー:ブラック

その他

その他ペダルと交換用のチューブを、店頭で購入しました。

納車されるまでの時間の使い方

自転車が納車されるまでは、とにかくHuluだったり本を読んでいました。とにかく、とにかく自転車に乗りたい気持ちになります。自転車がないので乗れないわけですが。

yowapeda.com

弱虫ペダル 1 (少年チャンピオン・コミックス)

弱虫ペダル 1 (少年チャンピオン・コミックス)

OverDrive(1) (講談社コミックス)

OverDrive(1) (講談社コミックス)

突然のキャンセル

その後7月も終わろうかという頃、どうにもこうにも自転車が到着する目処も立たなそうな感じでしたので最終的にキャンセル...。納車には時間がかりやすいブランドのようで、このへんも知識不足だったかなと思いました。
とはいえ、そもそも最初購入を予定していた自転車はあまり自分の体とサイズが合っていなかったようで結果的には良かったかなと思いました。

納車

紆余曲折がありながら自転車に乗ることが出来ました! お祝いしてくれた皆様ありがとう、ありがとう!
とりあえず普通に走るってだけで難しい感じなので、調子に乗っていきなりビンディングペダルとか買わなくてよかった!

f:id:okochang:20150811161636j:plain

最初の壁

  • 何度動画を見てもスタンドの付け方がわからない
  • ペダルの外し方が分からなくて、ケイデンスを計測するためのセンサーが付けれない

最初の目標

カラータイヤ使ってみたいのと、どうやら実家までの距離が60キロ位みたいなので、自転車で実家まで行けるようになりたいですね。

CodePipeline、Jenkins、Elastic Beanstalkの連携を試してみた(失敗からの大成功!)

CodePipeline Elastic Beanstalk Jenkins

こんにちは、前回のエントリーでJenkinsにCodePipelineのプラグインをインストールしました。 今回はCodePipelineと連携するJenkinsプロジェクトを作成し、Management ConsoleでPipelineを作成してみたいと思います。

最終的な構成イメージ

最終的な構成図は以下のようになります。Jenkinsと連携させ、この記事で作成したElastic Beanstalkにデプロイしたいと思います。

f:id:okochang:20150720205541p:plain

JenkinsがPipelineと連携するためのIAMユーザーを作成

最初にJenkinsがCodePipelineと連携するためのIAMユーザーを作成し、権限を割り当てます。この部分はIAMユーザーではなくIAMロールを使うという方法もあります。

IAMユーザーの作成と、認証情報の取得

IAMのコンソールホーム画面左メニューからUsers、Create New Usersをクリックします。

f:id:okochang:20150720233923p:plain

作成するIAMユーザーの名前を指定してCreateし、認証情報をメモしておきます。

f:id:okochang:20150720234033p:plain

作成したIAMユーザーにCodePipelineと連携する権限を追加

IAMコンソール画面の左メニューからUsersを選択し、先ほど作成したユーザーを選択します。

f:id:okochang:20150720234047p:plain

PermissionsのManaged PolicyからAttach Policyをクリックします。

f:id:okochang:20150720234058p:plain

リストされているポリシーからAWSCodePipelineCustomActionAccessを選択してAttach Policyをクリックします。

f:id:okochang:20150720234108p:plain

Jenkinsプロジェクトを作成

次はJenkinsプロジェクトの作成です。前回作成したJenkinsトップページにアクセスし、新規ジョブ作成をクリックします。

f:id:okochang:20150718232228p:plain

ジョブ名に任意のジョブ名(MimawarigumiProject)を入力し、フリースタイル・プロジェクトのビルドを選択してOKをクリックします。

f:id:okochang:20150718232423p:plain

ソースコードの管理でAWS CodePipelineを選択、AWS Access KeyとAWS Secret Keyにメモした認証情報を入力してProviderに任意の名前(MimawarigumiProvider)を入力します。

f:id:okochang:20150718233531p:plain

ビルド・トリガでSCMをポーリングを選択し、スケジュールに* * * * *を入力します。Jenkins側からCodeDeployにビルドするかどうかを定期的にチェックするようです。

f:id:okochang:20150718233720p:plain

ビルド環境の設定で、The Ruby versionを2.2.2にし、テスト実行に必要なスクリプトを入力します。

f:id:okochang:20150718234005p:plain

今回入力したスクリプトは以下のようなものです。

#!/bin/bash
bundle config build.nokogiri --use-system-libraries
bundle install --path vendor/bundle
bundle exec rake db:setup
bundle exec rake db:migrate RAILS_ENV=test
bundle exec rspec spec

ビルド後の処理で、AWS CodePipeline Publisherを選択し、追加します。Locationは空欄のままで構いません。最後に保存をクリックしてプロジェクトを作成します。

f:id:okochang:20150718234422p:plain

CodePipelineを作成

CodePipelineのホーム画面からGet Startedをクリックします。

f:id:okochang:20150720152708p:plain

作成するPipelineに割り当てる名前を指定してNext Stepをクリックします。

f:id:okochang:20150720152722p:plain

Source ProviderでGitHubを選択して、Connectをクリックします。

f:id:okochang:20150720152850p:plain

RepositoryとBranchにソースとしたいリポジトリ名とブランチを入力し、Next Stepをクリックします。

f:id:okochang:20150720154451p:plain

Build ProviderでAdd Jenkinsをクリックします。
Provider name、Server URL、Project nameにJenkinsの情報を入力して、Next Stepをクリックします。Provider name(MimawarigumiProvider)とProject name(MimawarigumiProject)は先ほどJenkinsのプロジェクトを作成したときと同じ名前にして下さい。

f:id:okochang:20150720154334p:plain

Deployment ProviderではAWS Elastic Beanstalkを選択します。今回は以前構築したElastic Beannstalkの環境を選択してNext Stepをクリックします。

f:id:okochang:20150720155610p:plain

次にCodePipelineが使用するIAMロールの設定をします。今回は新規作成するのでCreate roleをクリックします。

f:id:okochang:20150720161038p:plain

Role Nameが自動的に入力されますので、そのままAllowをクリックします。

f:id:okochang:20150720234741p:plain

先ほど作成したロールが選択されていることを確認してNext Stepをクリックします。

f:id:okochang:20150720161113p:plain

最後に作成した内容を確認して、Create Pipelineをクリックします。

f:id:okochang:20150720161440p:plain

そうすると、さっそくPipelineで定義されたプロセスが実行されます。

f:id:okochang:20150720210455p:plain f:id:okochang:20150720212124p:plain

CodePipelineのBuildが成功するとJenkis側でもビルドが成功しています。

f:id:okochang:20150720212224p:plain

と、ここまでは良かったのですが、最終的にElastic Beanstalkのデプロイで失敗してしまいました。

f:id:okochang:20150720212512p:plain

CodePipelineとElastic BeanstalkのEventには以下のようなエラーメッセージが出ていました。
CodePipelineに割り当てているIAMロールの権限不足かなと思って確認してみたところ必要な権限は割り当ってるようでした。
ここに関してはまだ解決できていないので引き続き調査しないと。→解決方法を追記しました!

Service:AmazonElasticLoadBalancing, Message:User: arn:aws:sts::123456789012:assumed-role/AWS-CodePipeline-Service/1437394759838 is not authorized to perform: elasticloadbalancing:RegisterInstancesWithLoadBalancer on resource: arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/awseb-e-u-AWSEBLoa-Z20VI2NDPANA

ちなみに、CodeDeployを使ったパターンでは最後までしっかりと処理されました。

f:id:okochang:20150720222454p:plain

作成後は、GitHubに新しいバージョンをPushしたり、Release changeを実行するとPipelineが再実行されます。Pipelineを削除する場合は、編集画面のDeleteから消すことが出来ます。

7月25日追記

ブログを公開していて数日後、Twitterで以下のような情報を頂きました。

ツイートに記載されているリンクのForumで同じ問題が報告されておりまして、Pipeline作成ウィザードで作ったIAMロール(AWS-CodePipeline-Service)の権限を修正することで解決出来ます。@understeerさんからも解決方法を教えて頂きました、ありがとうございます! 具体的な修正手順は以下のようになります。

  1. IAMコンソール画面の左メニューからRolesを選択し、AWS-CodePipeline-Serviceをクリックします f:id:okochang:20150725011437p:plain
  2. InlinePoliciesにあるポリシーの編集画面に移ります f:id:okochang:20150725011548p:plain
  3. elasticloadbalancing:DescribeLoadBalancersの部分をelasticloadbalancing:*に変更してApply Policyをクリックします f:id:okochang:20150725011526p:plain

最終的には以下のようなポリシーになるはずです。

{
    "Statement": [
        {
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketVersioning"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::codepipeline*",
                "arn:aws:s3:::elasticbeanstalk*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "codedeploy:CreateDeployment",
                "codedeploy:GetApplicationRevision",
                "codedeploy:GetDeployment",
                "codedeploy:GetDeploymentConfig",
                "codedeploy:RegisterApplicationRevision"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "elasticbeanstalk:CreateApplicationVersion",
                "elasticbeanstalk:DescribeApplicationVersions",
                "elasticbeanstalk:DescribeEnvironments",
                "elasticbeanstalk:DescribeEvents",
                "elasticbeanstalk:UpdateEnvironment",
                "autoscaling:DescribeAutoScalingGroups",
                "autoscaling:DescribeLaunchConfigurations",
                "autoscaling:DescribeScalingActivities",
                "autoscaling:ResumeProcesses",
                "autoscaling:SuspendProcesses",
                "cloudformation:GetTemplate",
                "cloudformation:DescribeStackResource",
                "cloudformation:DescribeStackResources",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:UpdateStack",
                "ec2:DescribeInstances",
                "ec2:DescribeImages",
                "ec2:DescribeAddresses",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcs",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeKeyPairs",
                "elasticloadbalancing:*",
                "rds:DescribeDBInstances",
                "rds:DescribeOrderableDBInstanceOptions",
                "sns:ListSubscriptionsByTopic"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "lambda:invokefunction",
                "lambda:listfunctions"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketPolicy",
                "s3:GetObjectAcl",
                "s3:PutObjectAcl",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::elasticbeanstalk*",
            "Effect": "Allow"
        }
    ],
    "Version": "2012-10-17"
}

編集後、改めてPipelineが実行されると以下のようにバッチリデプロイまで成功します!

f:id:okochang:20150725011934p:plain

感想

とてもシンプルではありますが、CodePipelineの作成までを追ってみました。とはいえ、このようなシンプルなものだとCodePipelineの強みが出づらいなというのが正直な感想です。 CIツールという意味では、JenkinsにもGitHubと連携するためのプラグインがあり、Jenkinsプロジェクトの設定でステージング環境やプロダクション環境へのデプロイまで自動化することが出来ます。また、JenkisではなくTravis CICircleCIといったSaaSを使うという手段もあります。
以下は作成したPipelineの編集画面なのですが、赤く囲まれたところに注目して下さい。

f:id:okochang:20150720223149p:plain

例えばBuildプロセスひとつでも、いくつかのものを順番に実行したり、同時に実行するといったことが出来るようになっています。Sourceについても複数のものを指定することが出来るようになっています。大きなプロジェクトを運用していたりすると、複数リポジトリを運用しつつビルドやデプロイの順番が決まっていたりしてリリースプロセスが複雑化する場合もあると思います。そういった複雑化した環境で継続的インテグレーションをする場合にCodeDeployは力を発揮してくれそうな気がしました(今回は紹介していませんが、負荷テストなどを組み込む事も可能です)。
Travis CI、CircleCI、 OpsWorksなどもっと色々なサービスにも対応して欲しいですね。

参考

Amazon LinuxにCodePipelineのJenkinsプラグインをセットアップする

Amazon Linux AWS CodePipeline Jenkins

こんにちは、前回のブログでCentOS7にJenkinsとCodePipelineのプラグインをインストールしましたが、実際にテストをしてみると、エラーが発生してしまって連携が出来ませんでした。このエラーはaws-codepipeline-plugin-for-jenkinsのIssueでも報告されておりますが、Amazon Linuxを使って環境を構築してみたところ最新のJenkinsでも正しい動作をしました。aws-codepipeline-plugin-for-jenkinsの新しいバージョンがリリースされ、現在は問題なく動作するようになっています。
というわけで、今回はAmazon Linuxを使ったJenkinsの構築手順をまとめておきたいと思います。

f:id:okochang:20150714153507j:plain

使用したAMI

amzn-ami-hvm-2015.03.0.x86_64-gp2 (ami-cbf90ecb)

必要なパッケージのインストール

Raila環境の構築に必要なパッケージをインストールします。

$ sudo yum -y update
$ sudo yum -y install git emacs gcc zlib-devel libxml2-devel libxslt-devel readline-devel openssl-devel gcc-c++ $ curl-devel ruby-devel git postgresql postgresql-server postgresql-libs postgresql-contrib postgresql-devel
$ sudo yum -y install nodejs --enablerepo=epel

PostgreSQLのセットアップ

サンプルプロジェクトではPostgreSQLを使っていますので初期設定をします。

$ sudo service postgresql initdb --encoding=UTF-8 --locale=ja_JP.UTF-8
$ sudo service postgresql start
$ sudo chkconfig postgresql on
$ sudo su - postgres
$ createuser -a -d -P mimawarigumi
$ exit

Jenkinsのセットアップ

Jenkinsのインストールや自動起動の設定をします。

$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ sudo yum install jenkins
$ sudo service jenkins start
$ sudo chkconfig jenkins on

rbenv、ruby-build、Rubyのセットアップ

サンプル用アプリのテストが出来るようにrbenv、Rubyをインストールします。 /usr/loca以下にrbenvをインストールし、jenkinsユーザーが実行出来るようにセットアップします。

$ sudo groupadd ruby
$ sudo  gpasswd -a jenkins ruby

rbenvをインストールし、rubyグループが実行可能なように権限設定をします。

$ cd /usr/local
$ sudo  git clone git://github.com/sstephenson/rbenv.git rbenv
$ sudo  chgrp -R ruby rbenv
$ sudo chmod -R g+rwxXs rbenv

ruby-buildをインストールし、先ほどと同じくrubyグループに権限を割り当てます。

$ sudo mkdir /usr/local/rbenv/plugins
$ cd /usr/local/rbenv/plugins
$ sudo git clone git://github.com/sstephenson/ruby-build.git
$ sudo chgrp -R ruby ruby-build
$ sudo chmod -R g+rwxs ruby-build

rootユーザーの環境変数を設定し、Rubyのインストールが出来るかテストします。

$ sudo -i
# echo 'export RBENV_ROOT=/usr/local/rbenv' >> .bash_profile
# echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> .bash_profile
# echo 'eval "$(rbenv init -)"' >> .bash_profile
# exec $SHELL -l
# rbenv install 2.2.2
# rbenv rehash
# rbenv global 2.2.2
# ruby -v

Jenkinsプラグインのインストール

ここからの手順は前回の手順と同じです、そちらをご覧ください。現場からは以上です。

CentOSにJenkinsとAWS CodePipelineプラグインをセットアップする

AWS awscli CentOS Jenkins Rails CodePipeline

前回までの記事でサンプル用RailsプロジェクトをElastic Beanstalkにデプロイ出来ました。
今回は、新しくCentOS7にサンプル用Railsプロジェクトのテスト環境とJenkinsをセットアップし、AWS CodePipelineと連携するために必要なJenkinsプラグインをインストールするまでまとめたいと思います。
最初のうちはサンプル用Railsプロジェクトを作った時の構築手順とほとんど同じようになります。
※その後、この環境でAWS CodePipelineと連携しても失敗してしまうことが分かりました、別記事を用意しているのでそちらの手順に沿って環境構築することをおすすめします。aws-codepipeline-plugin-for-jenkinsの新しいバージョンがリリースされ、正しく動作することを確認しました。

f:id:okochang:20150714153507j:plain

使用したAMI

CentOS 7 x86_64 (2014_09_29) EBS HVM-b7ee8a69-ee97-4a49-9e68-afaee216db2e-ami-d2a117ba.2 (ami-89634988)

aws.amazon.com

基本設定

タイムゾーンなどの基本的な設定をしておきます。それぞれお好みで調整して下さい。

$ sudo timedatectl set-timezone Asia/Tokyo
$ sudo sed -i -e "s/^ - update_hostname/# - update_hostname/g" /etc/cloud/cloud.cfg
$ sudo sh -c "echo 'jenkins.okochang.com' > /etc/hostname"
$ sudo reboot

SELinuxごめんなさい

$ sudo sed -i -e "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
$ sudo reboot

必要なパッケージのインストール

Railの環境がテストするために必要なパッケージと、AWS CLIをインストールします。

$ sudo yum update -y
$ sudo yum install -y git emacs gcc make zlib-devel libxml2-devel libxslt-devel readline-devel openssl-devel gcc-c++ curl-devel ruby-devel  vim wget epel-release bzip2 bind-utils nodejs git postgresql postgresql-server postgresql-libs postgresql-contrib postgresql-devel
$ sudo reboot
$ sudo easy_install pip
$ sudo pip install awscli

PostgreSQLのセットアップ

サンプル用のRailsプロジェクトではPostgreSQLを使っていますので、初期設定をしておきます。

$ sudo su - postgres
$ initdb --encoding=UTF-8 --locale=ja_JP.UTF-8
$ exit
$ sudo systemctl start postgresql
$ sudo systemctl enable postgresql
$ sudo su - postgres
$ createuser -a -d -P mimawarigumi
$ exit

Jenkinsのセットアップ

ここは今回の手順の主役の部分です。Jenkinsをインストールし、自動起動の設定をします。

$ sudo yum install java-1.8.0-openjdk
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ sudo yum install jenkins
$ sudo systemctl start jenkins
$ sudo systemctl enable jenkins

rbenv、ruby-build、Rubyのセットアップ

サンプル用Railsプロジェクトのテストが出来るようにrbevnやRubyなどをインストールします。
すでにJenkinsのセットアップは終わりましたが、jenkinsユーザーはログイン出来ないようになっております。そのため、/usr/local以下にrbenvをインストールしてjenkinsユーザーが実行できるように権限設定をします。

$ sudo groupadd ruby
$ sudo  gpasswd -a jenkins ruby

rbenvをインストールし、rubyグループが実行可能なように権限設定をします。

$ cd /usr/local
$ sudo  git clone git://github.com/sstephenson/rbenv.git rbenv
$ sudo  chgrp -R ruby rbenv
$ sudo chmod -R g+rwxXs rbenv

ruby-buildをインストールし、先ほどと同じくrubyグループに権限を割り当てます。

$ sudo mkdir /usr/local/rbenv/plugins
$ cd /usr/local/rbenv/plugins
$ sudo git clone git://github.com/sstephenson/ruby-build.git
$ sudo chgrp -R ruby ruby-build
$ sudo chmod -R g+rwxs ruby-build

rootユーザーの環境変数を設定し、Rubyのインストールが出来るかテストします。

$ sudo -i
# echo 'export RBENV_ROOT=/usr/local/rbenv' >> .bash_profile
# echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> .bash_profile
# echo 'eval "$(rbenv init -)"' >> .bash_profile
# exec $SHELL -l
# rbenv install 2.2.2
# rbenv rehash
# rbenv global 2.2.2
# ruby -v

Jenkinsのプラグインのインストール

ここまでのセットアップが終わったら、http://サーバーのIPアドレス:8080/にアクセスします。
Jenkinsのダッシュボードの左メニューにある「Jenkinsの管理」から「プラグインの管理」を選択します。「利用可能」タブでテストに必要な以下のプラグインをインストールします。

f:id:okochang:20150717014010p:plain

  • Hudson Ruby Plugin

f:id:okochang:20150717014700p:plain

  • Rake plugin

f:id:okochang:20150717014202p:plain

  • rbenv plugin

f:id:okochang:20150717014221p:plain

AWS CodePipelineプラグインのインストール

いよいよCodePipelineのプラグインをインストールしていきます。
まず最初にこちらGitHubリポジトリからZIPファイルをダウンロードし、解凍します。
次に「プラグインの管理」で「高度な設定」タブを開きます。「プラグインのアップロード」から先ほど解凍したaws-codepipeline-plugin-for-jenkins/dist以下にあるhpiファイルをアップロードしてインストールして下さい。

f:id:okochang:20150717014858p:plain

これでプラグインのインストールは完了です。次回は実際にJenkinsのジョブを作って、CodePipelineと連携するところまでいきたいと思います。