Twitter Facebook github

kitchen-ec2でChefレシピをEC2で実行する

お久しぶりです。
最近またAWSのサービスを一通り触ってみていて、プロビジョニングまでAWSマネージドでやってくれるOpsWorksを本番環境で使ってみたいと思い、Chefに取り組んでいます。

Chefにはレシピをローカルのvagrantで簡単に実行・テストできる test-kitchen というgemのツールがあるのですが、
これを初めて使ってみたところ非常に使い勝手がよく、当然ながらEC2でも試したいという気になりました。

今回は test-kitchen からEC2を扱える、kitchen-ec2を使ってみます。

環境

  • 実行元は手元の MBP macOS High Sierra 10.13.5
  • ruby 2.3.3 (rbenv) gem 2.7.2
  • Chef DK 3.0.36 をインストール
  • Test Kitchen version 1.21.2
  • aws-cli/1.11.63 Python/3.5.2

test-kitchen は単体でgemからインストールできますが、Chef DKに付いてくるので真っ新な環境ではこっちを入れた方がよいと思います。

Chef DK
https://downloads.chef.io/chefdk

AWS CLI で認証情報を設定

kitchen-ec2では、AWSの認証情報(APIキーとトークン)は環境変数か、aws-cliの認証情報から読み込むことになります。
今回は既にインストール済みのaws-cliを使っていますが、必要に応じて先に aws configure を行ってAPIキーを登録してください。

参考
AWS CLI の設定
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html

インストールと準備

ChefDKで入れたtest-kitchenにはkitchen-ec2は付いてこないので、個別にgemで入れます。

適当なディレクトリでmetadata.rbを作り、それを元にinitし、
サンプルとして、適当なディレクトリを作成するレシピを用意します。

これではローカルvagrantでしか動作しないため、
initで作られた kitchen.yml を編集します。

kitchen-ec2のREADMEにあるExampleを元に編集します。
https://github.com/test-kitchen/kitchen-ec2#example

上記READMEにVPC内に起動するためのパラメータも用意されていますが、今回は手っ取り早くVPC外に起動することにします。
現行世代のm4やm5、t2インスタンスはVPC外で起動できないため、旧世代である m3.medium で起動しています。

参考
VPC でのみ利用可能なインスタンスタイプ
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-vpc.html#vpc-only-instance-types

よりコストを気にする場合は、VPC内にt2.nanoやt2.microなどで起動するのが良いかもしれません。

以下のようになりました。

実際に使う場合は、以下の編集が最低限必要になります。

  • aws_ssh_key_id: AWSのキーペア名
  • ssh_key:上で指定したキーペアに対応する秘密鍵のファイルパス
  • security_group_ids: sshアクセス可能なセキュリティグループのID

converge の実行

うまく実行されたようでしたので、実際にログインして確認してみます。

ディレクトリ作成のレシピに沿って、正しく作られていることが確認できました。

インスタンスの破棄

AWSですので無駄な課金が走らないように、テスト後は忘れずに削除しましょう。

ローカルのvagrantと同様に kitchen destroy を実行するだけで、EBSも含めてシャットダウンとリソースの削除が行われました。

所感

Chefの学習コストが高いと聞いていましたが思ったほどではなさそうでした。
OpsWorksはカスタムAMIを使うことで、一切Chefを使わない運用も可能ではあるのですが、カスタムAMIとChefによるプロビジョンを併用することで、より起動時間と柔軟性を自由にデザインした構成が実現できそうです。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください