Tech Sketch Bucket of Technical Chips by TIS Inc.

[AWS] OpsWorksでBerkshelfがサポートされたので早速試してみる

Pocket

この記事はeXcale Developer's Blogから移転されたものです。

eXcale開発チームの西谷(@Keisuke69)です。

本日、AWSのOpsWorksでサポートするChefのバージョンに11.10が追加されたのにあわせ、Berkshelfのサポートが追加されたことがアナウンスされました。

【AWS発表】AWS OpsWorks が Chef 11.10 をサポート

しかも11.10を選択した場合は一緒にインストールされるrubyもこれまでの1.8.7から2.0.0に変更されます。
正直今までいまさら1.8.7はないと思っていたのでここも地味に嬉しいアップデートです。

というわけで早速試してみたいと思います。

Berkshelfとは

BerkshelfとはChefのcookbookとその依存関係を管理するツールです。
RubyにおけるBundlerと似たような感じのものです。
OpsWorksでは自前のcookbookのインストール元を1つしか選択できませんでしたが、今後はBerkshelfによりコミュニティcookbookと自前のcookbookと両方を利用するといったようなことができるようになります。
今まではコミュニティcookbookを利用したい場合には自分のリポジトリにコピーするなどの必要がありましたがそれも不要になります。

Berkshelfの使い方

Berkshelfのインストールはgemで行えます。

次に、BundlerにおけるGemfileに相当するBerksfileを用意して利用したいcookbookを記述します。

依存するcookbookのダウンロードはBerksfileのあるディレクトリで次のように行います。

オプションを何も指定しないとホームディレクトリの.berkshelf/cookbooksに保存されます。
指定したディレクトリにダウンロードするには--pathオプションを付与してダウンロード先のディレクトリを指定します。
Berksfileに記載したcookbookだけでなく各cookbookのmetadata.rbに記載されている依存cookbookもダウンロードされます。

OpsWorksでやってみる

OpsWorksでBerkshelfを使う場合は前述のようにBerkshelfのインストール等は不要です。それもOpsWorksがやってくれます。

まず、OpsWorksで新たにStackを作ります。
作成済のStackからマイグレーションすることも可能ですが今回は新規作成することにします、

画面下部のAdvancedをクリックして詳細設定に進みます。

このときにChefのバージョンで11.10を選べるようになっていることがわかります。デフォルトではまだ11.4のようですね。当然今回は11.10を選びます。

次に"Use custom Chef cookbooks"をYesにし、ダウンロード元としてgitリポジトリを指定します。
今回はgithubにBerksfileだけを用意したリポジトリを用意したのでそれを指定します。サンプルのリポジトリはここに置いておきますが中身はBerksfileがあるだけです。
用意したBerksfileは以下のような簡単なものです。

そして"Manage Berkshelf"をYesにします。デフォルトではNoになっています。YesにするとBerkshelfのバージョンを指定できるようです。デフォルトで2.0.14が入力されていて今回はそのままにしておきます。

以上が済んだらAdd Stackして保存します。

このあとは従来のOpsWorksと同様にLayerを作ってインスタンスを追加します。
今回はLayerTypeをCustomにし、SampleLayerという名前をつけました。ここで作ったSampleLayerにm3.mediumのインスタンスを1台だけ追加しています。
細かい手順は省きますが、AMIはAmazon Linuxを利用しています。SSH keyとセキュリティグループの指定も忘れないようにしてください。これらの設定はインスタンスの追加画面にあるAdvancedをクリックすると表示されます。

では起動します。

startするとインスタンスが起動され、先ほど登録したCustom Chef CookbookのダウンロードやBuilt-in Chef Recipesの実行などが行われるのでしばし待ちます。
しばらく待つとセットアップ処理が終了し、インスタンスのステータスがonlineになります。

早速起動したインスタンスにログインしていろいろ確認してみます。

まずはログを確認してみます。OpsWorksによるセットアップのログは/var/lib/aws/opsworks/chef/に保存されます。セットアップ処理の実行ごとに日時を元にしたファイル名でログが出力されていますので早速見てみます。

上記はそのログの抜粋です。
上記の4行目でBerkshelfのダウンロードとインストールを開始し、14行目、15行目でberks installが実行され成功したことがわかります。

次に実際にBerkshelfでダウンロードされたcookbookを見てみます。
BerkshelfがサポートされたことによりOpsWorksでセットアップされるインスタンスには従来のリポジトリ(ビルトイン用の/opt/aws/opsworks/current/cookbooksとカスタム用の/opt/aws/opsworks/current/site-cookbooks)に加えてBerkshelf用のcookbookリポジトリが/opt/aws/opsworks/current/berkshelf-cookbooksに用意されることになりました。

berkshelf-cookboksというディレクトリが作成されていることがわかります。
続いてその中身を確認します。

cookbookがダウンロードされていることがわかります。
Berksfileに指定したjettyとmysqlだけでなく、それらが依存するcookbook(javaとか)もダウンロードされていることがわかります。
※ただし、今回はAmazon Linuxを選択したためかjettyもmysqlもChefによるセットアップは行われていませんでした…。恐らくコミュニティcookbookではそのままだとAmazon Linuxというプラットフォームに対応していないのだと思われます。

最後に

というわけで新たにOpsWorksでサポートされたBerkshelfを試してみました。
今回は試しませんでしたがBerkshelfはcookbookのダウンロード元にgitのリポジトリを指定することも可能です。従って、Berkshelfを使うと全てのcookbookを一つのリポジトリで管理する必要がなくなります。
OpsWorksで指定するリポジトリにはBerksfileだけを置いておけばよく、個々のcookbookは個別のリポジトリとして管理することが可能です。
こうしたほうがプロジェクト間などでの再利用性が高まるのでおすすめです。

おまけ

eXcaleでは3月末までの期間限定でサインアップキャンペーンを実施中です。
キャンペーン中は新規登録でクーポンがもらえるのでまだサインアップしていない方は、この機会に是非サインアップしてみてください。
キャンペーン内容についてはこちらを参照してください。

エンジニア採用中!私たちと一緒に働いてみませんか?