概要
OpsWorksではカスタムのChef cookbooksを指定して自前のレシピを流せます。更に、opsworks-cookbooksというaws側で作成されているレシピもあり、こちらをカスタムレシピでも使用したいという場面があると思います。
今回は、opsworks-cookbooks内のnginxのレシピを使用したく自前のレシピからインクルードして使用したいと考えていました。
git、chefともに初心者レベルに毛が生えた程度のレベルです。
OpsWorks上でのディレクトリ構成
実際にレシピが動作する環境を調査したところ以下のようにOpsworksはchefを実行するみたいです。
図1.のsite-cookbooks配下に自前のレシピが展開されるのですが当然gitのリポジトリの構成そのままが展開されます。
つまり、
site-cookbooks
:
+- site-cookbooks
+- cookbooks
:
みたいな構成になります。ただし、これでもレシピ自体を実行することは可能です。
自前のレシピでcookbooks内のレシピを参照している場合に、図1.のcookbooksを参照することになります。ここでBerskfileはnginxを落とそうとするのですが、community cookbookのnginxを落としてきます。
そしてそれが、merged-cookbookへ展開されることになり、意図したレシピを実行することが出来ませんでした。
課題
- このような状況でopsworks-cookbooks/nginxを指定する方法
gitのリポジトリ構成
そこでの対応は、gitリポジトリの構成を以下のようにすることで対応しました。
図2. ローカルのレシピリポジトリ
ポイント
- ここをgitのリポジトリとして管理する
- レシピをフラットに構成する
ただ、こうするとせっかく用意したtest-kitchenを動かすことが出来ません。
試行錯誤の末、テストを動かすためのリポジトリを用意することにしました。
テスト用のgitリポジトリ構成
以下のようにすることで、テスト用の環境も維持しながらOpsworksのリポジトリ構成も管理できる状態になりました。
ただ若干手間がかかるのが難点です。
ポイント
- テスト用のgitリポジトリとして管理
- テストしたいレシピはBerkshelfで管理
まとめ
以上が、今回とった解決方法でした。
これより、いい方法があるように思いますが現状ではわからず、皆さんの突っ込みをお願いしたいところです。
テストについては端折りましたが、test-kitchen、kitchen-ec2を利用して、インスタンス上でテストをするようにしております。実際に流されるnode情報をenvironmentsに設定して、Opsworksで実行される状況に近いようにやってます。
その辺についてはAWs OpsWorks User Guideを参照してください。