AWS OpsWorks for Chef Automate - Getting Started やってみた

#1. はじめに
* [AWS OpsWorks for Chef Automate](https://aws.amazon.com/jp/opsworks/chefautomate/)  サービスがどんなものなのかを調べるため、[Getting Started](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/gettingstarted-opscm.html) をやってみたこと、その時に躓いたことや気になる点などをメモしておく。
* ちなみに、AWS OpsWorks for Chef Automate サービスの内容、所感などは別の機会にまとめる。

#2. AWS OpsWorks for Chef Automate 利用時の注意点
##2.1 [Create a Chef Server](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/gettingstarted-opscm-create.html)
* AWS OpsWorks for Chef Automate サービスの利用にあたり、Chefサーバ(EC2インスタンス)を作成する必要がある。
* 2016年12月時点では、Chefサーバ用のEC2インスタンスタイプは、次の３タイプ選べる。
<pre>
t2.medium
m4.large
m4.2xlarge
</pre>
* [Chefサーバについて](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/welcome_opscm.html)
 * An AWS OpsWorks for Chef Automate server runs on an Amazon Elastic Compute Cloud instance. 
 * The instance is configured to run the newest version of Amazon Linux (2016.09), Chef Server 12.x, and the most current version of Chef Automate Server, version 0.6.x.

##2.2 [Region Support for AWS OpsWorks for Chef Automate](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/welcome_opscm.html#opscm-region)
* 2016年12月時点では、次の３つのリージョンのいずれかに Chefサーバを作成する。
<pre>
US East (N. Virginia) Region
US West (Oregon) Region
EU (Ireland) Region
</pre>


##2.3 [料金](https://aws.amazon.com/jp/opsworks/chefautomate/pricing/)
* AWS OpsWorks for Chef Automate では、Chef サーバーに接続されているノードの数とそれらのノードの実行時間に基づいて課金されます。
* Chef サーバーを実行している基盤となる Amazon Elastic Compute Cloud (Amazon EC2) インスタンスに対しても課金されます。前払い料金や最低料金はありません。

#3. [事前準備](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/gettingstarted-opscm.html)
##3.1 [Get an AWS Account and Your AWS Credentials](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/gettingstarted-opscm.html)
* AWSアカウント作成 ⇒ すでに作成済みのものを使う
* IAMユーザ作成、Access Key & Secret Access Key ⇒ 今回は作成していない

##3.2 [Set Up a VPC](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/gettingstarted-opscm.html#set-up-vpc)
* Chefサーバ用 EC2インスタンスを起動するための VPC を用意する。
 * このVPCは、[2.2](#22-region-support-for-aws-opsworks-for-chef-automate) のいずれかのリージョンにある必要がある。
 * 今回は、バージニア リージョンに次のVPCを作成した。ポイントは、「DNS解決」を「はい」にしておくこと（DNS resolution should be enabled.）
![20161211-01.png](https://qiita-image-store.s3.amazonaws.com/0/148868/d939a5b1-b7fc-267d-9d28-c5a3af9ce4f0.png)
* 上記のVPC内に、パブリックサブネットを用意する。
 * 上記VPCにインターネットゲートウェイを作成してアタッチした。
 * 次のパブリックサブネット用のルートテーブを作成した(上記のインターネットゲートウェイを追加）。
![20161211-02.png](https://qiita-image-store.s3.amazonaws.com/0/148868/9cbbfce7-948d-218f-460e-9330f3a87f27.png)
 * 今回は、次のサブネットを作成した。ポイントは、「自動割り当てパブリック IP」を「はい」にしておくこと(On the subnet, enable Auto-assign public IP.)。ルートテーブルをパブリックサブネット用のルートテーブルへ変更すること。
![20161211-03.png](https://qiita-image-store.s3.amazonaws.com/0/148868/1d21c4eb-0bf7-d7fe-9a49-448b609ef9c8.png)

##3.3 [Set Up an EC2 Key Pair (Optional)](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/gettingstarted-opscm.html#d0e2840)
* これから作成するChefサーバ用EC2インスタンスへSSH接続するため用のSSH keyペアを用意する。ChefサーバへSSH接続出来なくても Chef Automate サービスは利用できるが、念のため。
* SSH keyペアはリージョン超えは出来ないため、例えば、すでに東京リージョンで作成していても、他のリージョンではそのSSH keyペアを利用することは出来ない。
* 今回は、バージニア リージョンにChefサーバを作成するため、バージニア リージョンにSSH keyペアを作成する。ちなみに、特にChefサーバへSSH接続しなくても 

##3.4 Security Group
* AWS OpsWorks for Chef Automate 用のSecurity Groupを作成しておく。
* これは、作業用PC(今回は私の自宅のMacBookAir(macOS Sierra, バージョン10.12.1))からChef Automateへ Chefのクックブック登録や、ノード登録などを行う際に必要なアクセス制限を設定する。
* 今回は、バージニア リージョンに次のセキュリティグループを作成した。送信元のIPアドレスは、私の自宅のインターネット環境のもの。
![20161211-04.png](https://qiita-image-store.s3.amazonaws.com/0/148868/d9855b92-0001-9533-b2b8-5caeef9d72ac.png)

#4. [Chefサーバ作成](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/gettingstarted-opscm-create.html)
* 手順

>1) AWSマネジメントコンソールへサインイン
https://console.aws.amazon.com/opsworks/

>2) サービスOpsWorks ⇒ Chef Automate servers
https://console.aws.amazon.com/opsworks/chefautomate/home?region=us-east-1#/

>3) Create Chef Automate server
>>リージョンはバージニア(US East (N. Virginia))を選択
>>EC2インスタンスタイプは t2.medium を選択
>>
![20161211-05.png](https://qiita-image-store.s3.amazonaws.com/0/148868/bdf39e1f-dfbf-0b67-5c7a-e0bd6f3e6146.png)

>4) Select an SSH key
>>[3.3](#33-set-up-an-ec2-key-pair-optional) で作成した SSH key を選択
>>
![20161211-06.png](https://qiita-image-store.s3.amazonaws.com/0/148868/82540266-5d6e-5edb-5aac-1ec0851a3108.png)

>5) Configure advanced settings - Network and security
>>VPC, Subnet は、[3.2](#32-set-up-a-vpc) で作成したものを選択
>>Security group は、[3.4](#34-security-group) で作成したものを選択
>>Service role と、 Instance profile は、どちらも Generate a new one を選択
>>
![20161211-07.png](https://qiita-image-store.s3.amazonaws.com/0/148868/0a5028e7-77ab-fd99-c3ff-e6a8a8cf9531.png)
>>
>>ちなみに、Service role や Instance profile の設定が誤っていると、あとで行う berks upload の際に、次のようなエラーが出る。
<pre>
Ridley::Errors::HTTPInternalServerError: {"error":["internal service error"]} 
</pre>

>6) Configure advanced settings - System maintenance, Automated backup
>>今回はデフォルトの設定のままで

>7) Review - 設定確認
>>
![20161211-08.png](https://qiita-image-store.s3.amazonaws.com/0/148868/906f97c4-a918-cda8-f444-96a25bd4b421.png)

>8) Launch - Chefサーバ起動開始
>>完了まで、約２０分・・（実際はもう少し早い）
>>
![20161211-09.png](https://qiita-image-store.s3.amazonaws.com/0/148868/91160eea-181e-1f0d-6989-c743c4262bec.png)

>9) credentials ファイルと、Starter kit ファイルを作業用PCへダウンロード


#5. [Chef Automate dashboard ページへログイン](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/opscm-chef-dashboard.html)
* Chefサーバの起動が完了したら、Chef Automate dashboard　にサインインできるようになる。
![20161211-10.png](https://qiita-image-store.s3.amazonaws.com/0/148868/808facc1-7442-e4ef-178d-f42592334dd3.png)
* Chef Automate dashboard の URL は、Server information の項目にある。
<pre>
https://test-chef-automate-y2angzfa3bcmkx6e.us-east-1.opsworks-cm.io
</pre>
* ログイン認証情報(Username/Password)は、先ほどダウンロードした credentials ファイルにある。


#6. [Chef Automate を利用するための設定](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/opscm-starterkit.html)
##6.1 作業用PCに ChefDK をインストールする
* 私の作業用PCは、自宅のMacBookAir(macOS Sierra, バージョン10.12.1)なので、次のファイルをダウンロードして、インストールした。
<pre>
Mac OS X/macOS 10.12 ⇒ chefdk-1.0.3-1.dmg

##6.2 Starter Kit を配備する例
* Starter Kit(starter_kit.zip)を、作業用PCの ~/work に置く
* 作業用PCのターミナルから

```
$ unzip starter_kit.zip
Archive:  starter_kit.zip
   creating: test-chef-automate-y2angzfa3bcmkx6e/
   creating: test-chef-automate-y2angzfa3bcmkx6e/.chef/
   creating: test-chef-automate-y2angzfa3bcmkx6e/.chef/ca_certs/
   creating: test-chef-automate-y2angzfa3bcmkx6e/cookbooks/
   creating: test-chef-automate-y2angzfa3bcmkx6e/environments/
   creating: test-chef-automate-y2angzfa3bcmkx6e/roles/
  inflating: test-chef-automate-y2angzfa3bcmkx6e/.chef/ca_certs/opsworks-cm-ca-2016-root.pem
  inflating: test-chef-automate-y2angzfa3bcmkx6e/Berksfile
  inflating: test-chef-automate-y2angzfa3bcmkx6e/README.md
  inflating: test-chef-automate-y2angzfa3bcmkx6e/chefignore
  inflating: test-chef-automate-y2angzfa3bcmkx6e/cookbooks/README.md
  inflating: test-chef-automate-y2angzfa3bcmkx6e/environments/README.md
  inflating: test-chef-automate-y2angzfa3bcmkx6e/roles/README.md
  inflating: test-chef-automate-y2angzfa3bcmkx6e/.chef/knife.rb
  inflating: test-chef-automate-y2angzfa3bcmkx6e/.chef/private.pem
  inflating: test-chef-automate-y2angzfa3bcmkx6e/userdata.sh

$ cd test-chef-automate-y2angzfa3bcmkx6e

$ tree . -a
.
├── .chef
│   ├── ca_certs
│   │   └── opsworks-cm-ca-2016-root.pem
│   ├── knife.rb
│   └── private.pem
├── Berksfile
├── README.md
├── chefignore
├── cookbooks
│   └── README.md
├── environments
│   └── README.md
├── roles
│   └── README.md
└── userdata.sh

5 directories, 10 files
```

##6.3 Berkshelfを使って、リモートソースからクックブックを取得する、Chefサーバへアップロード
* Berksfile ファイルに apache2 のクックブックを追加する

```
$ cat Berksfile
source "https://supermarket.chef.io"
cookbook "chef-client"
cookbook "apache2"
```

* クックブックを取得

```
$ berks vendor
Resolving cookbook dependencies...
Fetching cookbook index from https://supermarket.chef.io...
Using apache2 (3.2.2)
Using chef-client (7.0.3)
Using compat_resource (12.16.2)
Using cron (3.0.0)
Using logrotate (2.1.0)
Using ohai (4.2.3)
Using windows (2.1.1)
Vendoring apache2 (3.2.2) to /Users/toru-nishimura/work/test-chef-automate-y2angzfa3bcmkx6e/berks-cookbooks/apache2
Vendoring chef-client (7.0.3) to /Users/toru-nishimura/work/test-chef-automate-y2angzfa3bcmkx6e/berks-cookbooks/chef-client
Vendoring compat_resource (12.16.2) to /Users/toru-nishimura/work/test-chef-automate-y2angzfa3bcmkx6e/berks-cookbooks/compat_resource
Vendoring cron (3.0.0) to /Users/toru-nishimura/work/test-chef-automate-y2angzfa3bcmkx6e/berks-cookbooks/cron
Vendoring logrotate (2.1.0) to /Users/toru-nishimura/work/test-chef-automate-y2angzfa3bcmkx6e/berks-cookbooks/logrotate
Vendoring ohai (4.2.3) to /Users/toru-nishimura/work/test-chef-automate-y2angzfa3bcmkx6e/berks-cookbooks/ohai
Vendoring windows (2.1.1) to /Users/toru-nishimura/work/test-chef-automate-y2angzfa3bcmkx6e/berks-cookbooks/windows
```
[注意]
*[Webのドキュメント](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/opscm-starterkit.html)では、「berks install」と記載されているけど、「berks vendor」に置き換わりましたというメッセージが出る。starter_kit.zipの中にあるREADME.mdでは、「berks vendor」となっている。*

* クックブックをChefサーバへアップロード

```
$ SSL_CERT_FILE='.chef/ca_certs/opsworks-cm-ca-2016-root.pem' berks upload
Uploaded apache2 (3.2.2) to: 'https://test-chef-automate-y2angzfa3bcmkx6e.us-east-1.opsworks-cm.io:443/organizations/default'
Uploaded chef-client (7.0.3) to: 'https://test-chef-automate-y2angzfa3bcmkx6e.us-east-1.opsworks-cm.io:443/organizations/default'
Uploaded compat_resource (12.16.2) to: 'https://test-chef-automate-y2angzfa3bcmkx6e.us-east-1.opsworks-cm.io:443/organizations/default'
Uploaded cron (3.0.0) to: 'https://test-chef-automate-y2angzfa3bcmkx6e.us-east-1.opsworks-cm.io:443/organizations/default'
Uploaded logrotate (2.1.0) to: 'https://test-chef-automate-y2angzfa3bcmkx6e.us-east-1.opsworks-cm.io:443/organizations/default'
Uploaded ohai (4.2.3) to: 'https://test-chef-automate-y2angzfa3bcmkx6e.us-east-1.opsworks-cm.io:443/organizations/default'
Uploaded windows (2.1.1) to: 'https://test-chef-automate-y2angzfa3bcmkx6e.us-east-1.opsworks-cm.io:443/organizations/default'
```

* クックブックのアップロード確認

```
$ knife cookbook list
apache2           3.2.2
chef-client       7.0.3
compat_resource   12.16.2
cron              3.0.0
logrotate         2.1.0
ohai              4.2.3
windows           2.1.1
```
Chef Automate dashboard で確認すると、"COOKBOOK CHANGES"のところが 7 となっている。


#7. [Chef サーバに ノードを追加する](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/opscm-addnodes.htmlt)
##7.1 ノード（EC2インスタンス）を作成
* 今回は、テスト用として、東京リージョンの適当なVPCに適当なEC2を作成する。
 * AMI: Amazon Linux AMI 2016.09.0 (HVM), SSD Volume Type - ami-0c11b26d
 * 自動割り当てパブリック IP: 有効化
 * タグ名: chef-node-test
 * セキュリティグループ: 私の自宅のインターネット環境からのSSH接続を許可する
* [注意]*[サポートしているOSの一覧](https://docs.chef.io/platforms.html)*

##7.2 Chefサーバのセキュリティグループに、 7.1 で作成した EC2 からの HTTPS 接続を許可する設定を入れる。

##7.3 nodeのセットアップ、クックブック適用
* 作業用PCのターミナルから

```
$ knife bootstrap 54.199.172.154 -N chef-node-test -x ec2-user -i ~/.ssh/aws/*** --sudo --run-list "recipe[chef-client],recipe[apache2]"
..
54.199.172.154 Running handlers:
54.199.172.154 Running handlers complete
54.199.172.154 Chef Client finished, 90/113 resources updated in 20 seconds

$ knife node show chef-node-test
Node Name:   chef-node-test
Environment: _default
FQDN:
IP:          54.199.172.154
Run List:    recipe[chef-client], recipe[apache2]
Roles:
Recipes:     chef-client, chef-client::default, apache2, apache2::default, chef-client::service, chef-client::init_service, apache2::mpm_prefork, apache2::mod_status, apache2::mod_alias, apache2::mod_auth_basic, apache2::mod_authn_core, apache2::mod_authn_file, apache2::mod_authz_core, apache2::mod_authz_groupfile, apache2::mod_authz_host, apache2::mod_authz_user, apache2::mod_autoindex, apache2::mod_deflate, apache2::mod_dir, apache2::mod_env, apache2::mod_mime, apache2::mod_negotiation, apache2::mod_setenvif, apache2::mod_log_config, apache2::mod_logio, apache2::mod_unixd
Platform:    amazon 2016.09
Tags:
```