---
title: bosh-bootloaderでAWSまたはGCPにBOSH環境を簡単に構築する
tags: ["BOSH", "BOSH Bootloader", "UAA", "CredHub", "Concourse CI"]
categories: ["Dev", "Infrastructure", "BOSH"]
date: 2017-07-30T15:06:18Z
updated: 2017-09-04T14:58:42Z
---

**目次**
<!-- toc -->

### bosh-bootloaderとは

[BOSH](https://bosh.io)を使ったソフトウェアのデプロイは基本的に以下の手順になります。

1. IaaS環境セットアップ
1. BOSH Directorのデプロイ(`bosh-init`, CLI v2の場合は`bosh create-env`)
1. 対象のソフトウェア/クラスタのデプロイ (`bosh deploy`)



このうち、1.と2.は初回だけ行えば良いのですが、ここをまとめてやってくれるのが[bosh-bootloader](https://github.com/cloudfoundry/bosh-bootloader)です。

bosh-bootloaderは現時点で

* AWS
* GCP

に対応しています。

> [OpenStack](https://github.com/cloudfoundry/bosh-bootloader/issues/77), [Azure](https://github.com/cloudfoundry/bosh-bootloader/issues/126)対応のissueは存在しています。


### ツールのインストール

bosh-bootloaderを使うには

* `bbl`
* `bosh` v2
* `terraform`

のインストールが必要です。

#### bosh-bootloaderのインストール

```
wget https://github.com/cloudfoundry/bosh-bootloader/releases/download/v4.0.0/bbl-v4.0.0_osx
install bbl-v4.0.0_osx /usr/local/bin/bbl
```

本稿で扱う`bbl`のバージョンは`4.0.0`です。

```
$ bbl version
bbl 4.0.0 (darwin/amd64)
```

#### BOSH CLIのインストール

```
wget https://s3.amazonaws.com/bosh-cli-artifacts/bosh-cli-2.0.28-darwin-amd64
install bosh-cli-2.0.28-darwin-amd64 /usr/local/bin/bosh
```

本稿で扱う`bosh`のバージョンは`2.0.28`です。(`2.0.24`以上が必須です)


```
$ bosh -v
version 2.0.28-cb77557-2017-07-11T23:04:15Z

Succeeded
```

#### terraformのインストール

```
wget https://releases.hashicorp.com/terraform/0.9.11/terraform_0.9.11_darwin_amd64.zip
unzip terraform_0.9.11_darwin_amd64.zip 
install terraform /usr/local/bin/terraform
```

本稿で扱う`bosh`のバージョンは`0.9.11`です。(`0.9.7`以上が必須です)


```
$ terraform -v
Terraform v0.9.11
```

### AWSでbosh-bootloader

基本的は[getting-started-aws.md](https://github.com/cloudfoundry/bosh-bootloader/blob/master/docs/getting-started-aws.md)の通り。

#### `bbl`用のIAM作成

```
mkdir ~/bbl
cd ~/bbl

policy=`cat <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:*",
                "cloudformation:*",
                "elasticloadbalancing:*",
                "route53:*",
                "iam:*",
                "logs:*",
                "kms:*"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
EOF`

aws iam create-user --user-name "bbl-user"
aws iam put-user-policy --user-name "bbl-user" \
	--policy-name "bbl-policy" \
	--policy-document "$policy"
aws iam create-access-key --user-name "bbl-user" > access-key.json
```

#### `bbl`実行

```
export BBL_IAAS=aws
export BBL_AWS_ACCESS_KEY_ID=`jq -r .AccessKey.AccessKeyId access-key.json `
export BBL_AWS_SECRET_ACCESS_KEY=`jq -r .AccessKey.SecretAccessKey access-key.json `
export BBL_AWS_REGION=ap-northeast-1

bbl up
```

ログは

```
step: checking if keypair "keypair-bbl-env-vanern-2017-07-30t09-13z" exists
step: creating keypair
step: validating whether stack needs to be migrated
step: generating terraform template
step: applied terraform template
step: creating bosh director
Deployment manifest: '/var/folders/15/fww24j3d7pg9sz196cxv_6xm4nvlh8/T/806931787/manifest.yml'
Deployment state: '/var/folders/15/fww24j3d7pg9sz196cxv_6xm4nvlh8/T/806931787/state.json'

Started validating
  Downloading release 'bosh'... Finished (00:00:43)
  Validating release 'bosh'... Finished (00:00:00)
  Downloading release 'bosh-aws-cpi'... Finished (00:00:20)
  Validating release 'bosh-aws-cpi'... Finished (00:00:00)
  Downloading release 'os-conf'... Finished (00:00:01)
  Validating release 'os-conf'... Finished (00:00:00)
  Validating cpi release... Finished (00:00:00)
  Validating deployment manifest... Finished (00:00:00)
  Downloading stemcell... Finished (00:00:06)
  Validating stemcell... Finished (00:00:00)
Finished validating (00:01:13)

Started installing CPI
  Compiling package 'ruby_aws_cpi/c6ba8a1e1b53b94ee9caf13d2d749c40cecfa038'... Finished (00:02:15)
  Compiling package 'bosh_aws_cpi/137cfc70652337ff1d3fca795e6d9ddd6e7e68dd'... Finished (00:00:02)
  Installing packages... Finished (00:00:00)
  Rendering job templates... Finished (00:00:00)
  Installing job 'aws_cpi'... Finished (00:00:00)
Finished installing CPI (00:02:19)

Starting registry... Finished (00:00:00)
Uploading stemcell 'bosh-aws-xen-hvm-ubuntu-trusty-go_agent/3421.9'... Finished (00:00:16)

Started deploying
  Creating VM for instance 'bosh/0' from stemcell 'ami-b8faefdf light'... Finished (00:00:29)
  Waiting for the agent on VM 'i-065d2b9cfcbcd14d2' to be ready... Finished (00:00:35)
  Creating disk... Finished (00:00:13)
  Attaching disk 'vol-08de572130113912e' to VM 'i-065d2b9cfcbcd14d2'... Finished (00:00:20)
  Rendering job templates... Finished (00:00:04)
  Compiling package 'ruby/c1086875b047d112e46756dcb63d8f19e63b3ac4'... Skipped [Package already compiled] (00:00:01)
  Compiling package 'mysql/b7e73acc0bfe05f1c6cbfd97bf92d39b0d3155d5'... Skipped [Package already compiled] (00:00:00)
  Compiling package 'libpq/661f5817afe24fa2f18946d2757bff63246b1d0d'... Skipped [Package already compiled] (00:00:00)
  Compiling package 'ruby_aws_cpi/c6ba8a1e1b53b94ee9caf13d2d749c40cecfa038'... Finished (00:01:56)
  Compiling package 'nats/63ae42eb73527625307ff522fb402832b407321d'... Skipped [Package already compiled] (00:00:01)
  Compiling package 'registry/d81865cf0ad85fd79cb19aeb565bf622f2a17a83'... Skipped [Package already compiled] (00:00:03)
  Compiling package 'director/e9cd35786422e87bd0571a4423bc947e50fe97e6'... Skipped [Package already compiled] (00:00:03)
  Compiling package 'davcli/5f08f8d5ab3addd0e11171f739f072b107b30b8c'... Skipped [Package already compiled] (00:00:00)
  Compiling package 'postgres-9.4/ded764a075ae7513d4718b7cf200642fdbf81ae4'... Skipped [Package already compiled] (00:00:01)
  Compiling package 'health_monitor/e9317b2ad349f019e69261558afa587537f06f25'... Skipped [Package already compiled] (00:00:03)
  Compiling package 's3cli/bb1c1976d221fdadf13a6bc873896cd5e2433580'... Skipped [Package already compiled] (00:00:00)
  Compiling package 'bosh_aws_cpi/137cfc70652337ff1d3fca795e6d9ddd6e7e68dd'... Finished (00:00:02)
  Compiling package 'verify_multidigest/8fc5d654cebad7725c34bb08b3f60b912db7094a'... Skipped [Package already compiled] (00:00:00)
  Compiling package 'nginx/2ec2f63293bf6f544e95969bf5e5242bc226a800'... Skipped [Package already compiled] (00:00:00)
  Compiling package 'postgres/3b1089109c074984577a0bac1b38018d7a2890ef'... Skipped [Package already compiled] (00:00:00)
  Updating instance 'bosh/0'... Finished (00:00:15)
  Waiting for instance 'bosh/0' to be running... Finished (00:00:10)
  Running the post-start scripts 'bosh/0'... Finished (00:00:00)
Finished deploying (00:04:31)

Stopping registry... Finished (00:00:00)
Cleaning up rendered CPI jobs... Finished (00:00:00)

Succeeded
step: created bosh director
step: generating cloud config
step: applying cloud config
```


* VPC
* Subnets
* Route Tables
* Security Groups
* EIP
* EC2 (NAT VM / BOSH VM)

が自動で作成されます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/13d7a969-ab1b-0ecb-806a-7b117d96fbd0.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/c65a7185-85ca-46b7-72d6-3652168290a4.png)

#### BOSH CLIに設定を反映

```
export BOSH_ENVIRONMENT=`bbl director-address`
export BOSH_CLIENT=`bbl director-username`
export BOSH_CLIENT_SECRET=`bbl director-password`
export BOSH_CA_CERT=`bbl director-ca-cert`

bosh log-in
```

これでBOSHのセットアップ(手順の1., 2.)が完了です。

Directorには、`bbl`で作られた環境情報がCloud Configに設定済みです

```
$ bosh cloud-config
```

[出力結果](https://gist.github.com/making/c51b368e9d47db510d7484beca60b20e)


最新のStemcellをアップロードしておきます。

```
bosh upload-stemcell https://bosh.io/d/stemcells/bosh-aws-xen-hvm-ubuntu-trusty-go_agent
```

#### ロードバランサの作成


`bbl`でIaaSのロードバランサを作成することもできます。

LBの種類は

* `concourse`
* `cf`

の2種類がサポートされています。

前者はConcourseで利用される想定のロードバランサで、HTTP(80), HTTPS(4443)で受付けて8080にフォワード, TCP(2222)で受付けて2222にフォワードするLB一つ作成されます。Concourse以外でも、8080でHTTPを受付ているアプリケーションをデプロイしたい場合には利用可能です。

後者はCloud Foundryで利用される想定のロードバランサで、GoRouter, TCP Router, SSH Proxy用のLB3つができます。



##### Concourse用途のLB


```
bbl create-lbs --type concourse --key <YOUR-key.pem> --cert <YOUR-cert.pem> 
```

Concourse用途のロードバランサ(ELB)のリスナーは次のような設定になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/96a9e897-135f-0792-0e6c-75054fe581dd.png)

Cloud Configもアップデートされます。`vm_extensions:`に次の内容が設定されます。

```
$ bosh cloud-config | grep elb -B 1 -A 5
- cloud_properties:
    elbs:
    - bbl-env-va-05b9c6c-concourse-lb
    security_groups:
    - sg-27008f41
    - sg-fb038c9d
  name: lb
```

ここまでできるとBOSHでソフトウェアのデプロイが可能です。次のサンプルアプリをデプロイしましょう。

`sample.yml`に次の内容を設定してください。

``` yaml
---
name: hello-legacy-tomcat

releases:
- name: hello-legacy-tomcat
  version: 0.2
  url: https://github.com/making-dev/hello-legacy-tomcat-boshrelease/releases/download/0.2/hello-legacy-tomcat-0.2.tgz
  sha1: a401254722d4b032f0170b1d17ca3546fd611524

stemcells:
- alias: ubuntu
  os: ubuntu-trusty
  version: latest

update:
  canaries: 2
  max_in_flight: 1
  canary_watch_time: 5000-60000
  update_watch_time: 5000-60000

instance_groups:
- name: hello-legacy-tomcat
  azs: [z1]
  instances: 1
  jobs:
  - name: hello-legacy-tomcat
    release: hello-legacy-tomcat
    properties: {}
  vm_type: t2.small
  stemcell: ubuntu
  persistent_disk_type: default
  networks:
  - name: private
  vm_extensions:
  - lb
```

`bosh deploy`でデプロイ


```
bosh -n deploy -d hello-legacy-tomcat sample.yml
```

デプロイされたら`bosh vms`で状態を確認できます。

```
$ bosh vms

Task 5. Done

Deployment 'hello-legacy-tomcat'

Instance                                                  Process State  AZ  IPs        VM CID               VM Type   
hello-legacy-tomcat/c0060931-d188-4df6-b843-4b5bcf07f7a8  running        z1  10.0.16.4  i-04eaa581f98467111  t2.small  

1 vm
```

ELB経由で8080番にアクセスできます。

```
$ curl http://<elbのprefix>.ap-northeast-1.elb.amazonaws.com
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
```

##### Cloud Foundry用途のLB

```
bbl create-lbs --type cf --key <YOUR-key.pem> --cert <YOUR-cert.pem> 
```

次のように3つのELBが作成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/4da9bef3-8648-8736-f2fc-8842e4ba69fa.png)


### GCPでbosh-bootloader

後日書く。

### 環境の削除

```
bbl destroy
```

で作成した環境を削除できます。

### bosh-bootloaderでIaaS設定のみ行う

bosh-bootloaderは便利ですが、BOSH Directorの設定は自分で行いたい場合があります。
特にBOSH CLI v2からは[bosh-deployment](https://github.com/cloudfoundry/bosh-deployment)と`bosh create-env`で簡単にBOSH Director VMを作成でき、UAA連携、CredHub連携など拡張ポイントがあります。VM typeの選択もしたいです。

bosh-bootloaderではIaaSの設定だけで止めるオプションがあります。手順1.だけbosh-bootloaderで行い、手順2は`bosh create-env`で行う形です。

[Advanced BOSH Configuration](https://github.com/cloudfoundry/bosh-bootloader/blob/master/docs/advanced.md)に書かれています。

```
bbl up --no-director
```

この場合は、Director VMは作成されません。`bosh-deployment-vars`で`bosh create-env`に必要な情報を取得できます。

```
$ bbl bosh-deployment-vars
internal_cidr: 10.0.0.0/24
internal_gw: 10.0.0.1
internal_ip: 10.0.0.6
director_name: bosh-bbl-env-vanern-2017-07-30t11-02z
external_ip: xxx.yyy.zzz.www
az: ap-northeast-1c
subnet_id: subnet-866e4ede
access_key_id: xxxxxxxxxxxxxxxx
secret_access_key: yyyyyyyyyyyyyyyyy
iam_instance_profile: terraform-005e1c7e8182cd3d46208a6399
default_key_name: keypair-bbl-env-vanern-2017-07-30t11-02z
default_security_groups: [sg-c4109fa2]
region: ap-northeast-1
private_key: |-
  -----BEGIN RSA PRIVATE KEY-----
  ...
  -----END RSA PRIVATE KEY-----
```

#### `bosh create-env`でDirectorのセットアップ

Directorは標準的な[bosh-deployment](https://github.com/cloudfoundry/bosh-deployment)で作成します。

```
git clone https://github.com/cloudfoundry/bosh-deployment.git deploy
```

AWSの場合、

```
bosh create-env deploy/bosh.yml  \
  --state ./state.json  \
  -o deploy/aws/cpi.yml  \
  -o deploy/external-ip-with-registry-not-recommended.yml \
  --vars-store ./creds.yml  \
  -l <(bbl bosh-deployment-vars) 
```

でDirectorをセットアップできます。非推奨ではありますが、Directorに直接Public IPを設定するために`external-ip-with-registry-not-recommended.yml`も指定します。

せっかくなのでDirectorのVMサイズを変更してみます。次のようなYAMLファイルを作成します。

`director-size.yml`


``` yaml
- type: replace
  path: /resource_pools/name=vms/cloud_properties/instance_type
  value: t2.small
```

このファイルを`bosh create-env`の引数に追加します。


```
bosh create-env deploy/bosh.yml \
  --state ./state.json \
  -o deploy/aws/cpi.yml \
  -o deploy/external-ip-with-registry-not-recommended.yml \
  -o director-size.yml \
  --vars-store ./creds.yml \
  -l <(bbl bosh-deployment-vars) 
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1852/fbae1631-6230-156a-c72c-ee3aff1c8232.png)

`t2.small`になっていることがわかります。

BOSH Directorの設定、及びCloud Configの設定は次のようになります。

```
export BOSH_ENVIRONMENT=`bosh int --path /external_ip <(bbl bosh-deployment-vars)`
export BOSH_CLIENT=admin
export BOSH_CLIENT_SECRET=`bosh int creds.yml --path /admin_password`
export BOSH_CA_CERT=`bosh int creds.yml --path /director_ssl/ca`
bosh -n update-cloud-config <(bbl cloud-config)
```

#### UAAの追加


`bosh create-env`の引数にUAA用のファイルを追加して実行します。

```
bosh create-env deploy/bosh.yml \
  --state ./state.json \
  -o deploy/aws/cpi.yml \
  -o deploy/uaa.yml \
  -o deploy/external-ip-with-registry-not-recommended.yml \
  -o deploy/external-ip-not-recommended-uaa.yml \
  -o director-size.yml \
  --vars-store ./creds.yml \
  -l <(bbl bosh-deployment-vars) 
```

BOSH Directorの設定、及びCloud Configの設定は次のようになります(再掲)。

```
export BOSH_ENVIRONMENT=`bosh int --path /external_ip <(bbl bosh-deployment-vars)`
export BOSH_CLIENT=admin
export BOSH_CLIENT_SECRET=`bosh int creds.yml --path /admin_password`
export BOSH_CA_CERT=`bosh int creds.yml --path /director_ssl/ca`
bosh -n update-cloud-config <(bbl cloud-config)
```

> 次のように`--ops-file`オプションでBOSH CLIのように差分だけ適用してBOSHのデプロイをカスタマイズすることもできます。
> 
> ```
> bbl up --ops-file ./bosh-deployment/uaa.yml
> ```


#### CredHubの追加

まずはSecurity GroupにUAAアクセス用の8844ポート許可を追加します。

AWSの場合、

```
aws ec2 authorize-security-group-ingress --group-id $SECURITY_GROUP --protocol tcp --port 8844 --cidr 0.0.0.0/0
```

CredHubの設定も同じようにできますが、`bosh-deployment`に外部からCredHubにアクセスするための`external-ip-not-recommended-credhub.yml`は用意されていないので、次のファイルを自分で作成します。

``` yaml
- type: replace
  path: /variables/name=credhub_tls/options/alternative_names/-
  value: ((external_ip))

- type: replace
  path: /instance_groups/name=bosh/jobs/name=credhub/properties/credhub/authentication/uaa/url
  value: "https://((external_ip)):8443"
```

それから`bosh create-env`の引数にCredHub用のファイルを追加して実行します。

```
bosh create-env deploy/bosh.yml \
  -o deploy/aws/cpi.yml \
  -o deploy/uaa.yml \
  -o deploy/credhub.yml \
  -o deploy/external-ip-with-registry-not-recommended.yml \
  -o deploy/external-ip-not-recommended-uaa.yml \
  -o external-ip-not-recommended-credhub.yml \
  -o director-size.yml \
  --vars-store ./creds.yml \
  -l <(bbl bosh-deployment-vars) 
```

CredHubには次のコマンドでログインできます。

```
bosh int ./creds.yml --path /uaa_ssl/ca > ~/uaa_ca
bosh int ./creds.yml --path /credhub_ca/ca > ~/credhub_ca
credhub login -s `bosh int --path /external_ip <(bbl bosh-deployment-vars)`:8844 -u credhub-cli -p `bosh int creds.yml --path /credhub_cli_password` --ca-cert ~/uaa_ca --ca-cert ~/credhub_ca
```


### 参考資料

CF Summit 2017の次のセッションが参考になります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/lIhx69WfRcE" frameborder="0" allowfullscreen></iframe>

[PDF](https://schd.ws/hosted_files/cfsummit2017/60/CF%20Summit%20Talk.pdf)
