Opsworksのcookbookをtest-kitchenでテストする


AWS OpsworksでChefのcookbookを使うことができる訳ですが
Opsworks単体ではテストツールが無くcookbookを練り込むのがそこそこ手がかかります。

※Opsworksを使うまでは以下を参考にしてみてください。
http://blog.enokawa.co/2016/05/14/opsworks-codecommit/

Opsworksでは標準のchefとは異なる独自の手法でcookbookを実行していますがtest-kitchenでテストしたcookbookも使いまわせます。
ですので、chefのテストツール、test-kitchenを使えば数行のコマンドでEC2を起動してcookbookのテストを走らせる事ができます。
効率よくrecipeを書いていくためにもtest-kitchenを利用するのが良いかと思います。

環境

クライアントPC
- OS: Mac OS X
- chefdk : 0.13.21(latest)
EC2:
- OS: Amazon Linux 201603
- Chef: 12.10(latest)

準備

install chefdk

cookbookの開発ツールchefdkをインストールしましょう。

$ brew cask install chefdk

cookbook作成

$ chef generate cookbook hello-chef

必要なディレクトリやファイルが作成されます。

$ cd hello-chef
$ kitchen init --driver=kitchen-ec2

ドライバーを指定するとgemが勝手にkitchen-ec2をインストールしてくれます。

test kitchenの設定

.kitchen.yml

テストに関して、共有する情報を記載する。

---
driver:
  name: ec2
  shared_credentials_profile: 
  aws_ssh_key_id: 
  region: 
  subnet_id: 
  associate_public_ip: true
  iam_profile_name: 
  security_group_ids: 
  availability_zone: 
  require_chef_omnibus: true

transport:
  ssh_key:
  username: ec2-user

provisioner:
  name: chef_zero

platforms:
  - name: AmazonLinux-201603
    driver: 
      image_id: ami-29160d47

suites:
  - name: default
    run_list:
      - recipe[hello-chef::default]
    attributes:

.kitchen.local.yml

他人と共有しない自身のテスト環境について記載する

---
driver:
  name: ec2
  shared_credentials_profile: default
  aws_ssh_key_id: aws-miso4ru_ap-northeast-1
  region: ap-northeast-1
  subnet_id: subnet-e571de92
  associate_public_ip: true
  iam_profile_name: test-kitchen
  security_group_ids: ["sg-4c4d2029"]
  availability_zone: ap-northeast-1a
  require_chef_omnibus: true

transport:
  ssh_key: ~/.ssh/aws-miso4ru_ap-northeast-1.pem
  username: ec2-user

shared_credentials_profileは ~/.aws/credentials に記載されてるprofileを指定すればOKです。

kitchen-ec2を使った時の.kitchen.ymlの具体的な書き方は以下を参考にすると良いと思います。
https://github.com/test-kitchen/kitchen-ec2

テスト開始

テストのやり方とか出来ることとかは以下を参考にすると良いと思います。
http://qiita.com/eielh/items/64e197f4f1eaf5ff6097

テストの状態表示

$ kitchen list
Instance                    Driver  Provisioner  Verifier  Transport  Last Action
default-AmazonLinux-201603  Ec2     ChefZero     Busser    Ssh        <Not Created>

インスタンス作成

$ kitchen cretae

cookbook 実行

$ kitchen converge

ざっくりこんな感じでテストできます。

EC2にログインして確認するには

$ kitchen login

で入れます。

serverspec等でテストを記載していたら

$ kitchen verify

テスト終わったらgit pushで上げて、Opsworkに食わせれば良いと思います。

後片付けとしてEC2も消しておきましょう。

$ kitchen destroy

その他 tips

foodcriticを使ってスタイルチェック

chefdkに同梱されてるコードスタイルのチェックツール
使い方は単純、cookbookのパスを引数にして実行するだけ

foodcritic [cookbook-path]

空白が返ってくればOK,何か言われたら以下を参考に修正するとよし。
http://www.foodcritic.io/

なお、foodcriticのデフォルトだと、supermakrtにアップロードする際のチェックが入る。
公開しないcookbookなら除外したほうが良い。
cookbookの直下に .foodcritic を作成して以下を記載すればOK。

~FC064
~FC065

参考

http://qiita.com/eielh/items/64e197f4f1eaf5ff6097
https://github.com/test-kitchen/kitchen-ec2
https://jjasghar.github.io/blog/2014/02/17/dot-kitchen-dot-local-dot-yml-and-when-you-want-to-use-it/