IK.AM

@making's tech note


bosh-bootloaderでAWSまたはGCPにBOSH環境を簡単に構築する

🗃 {Dev/Infrastructure/BOSH}
🏷 BOSH 🏷 BOSH Bootloader 🏷 UAA 🏷 CredHub 🏷 Concourse CI 
🗓 Updated at 2017-09-04T14:58:42Z  🗓 Created at 2017-07-30T15:06:18Z   🌎 English Page

目次

bosh-bootloaderとは

BOSHを使ったソフトウェアのデプロイは基本的に以下の手順になります。

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

このうち、1.と2.は初回だけ行えば良いのですが、ここをまとめてやってくれるのがbosh-bootloaderです。

bosh-bootloaderは現時点で

  • AWS
  • GCP

に対応しています。

OpenStack, Azure対応の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の通り。

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

image.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

出力結果

最新の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

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に次の内容を設定してください。

---
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

GCPでbosh-bootloader

後日書く。

環境の削除

bbl destroy

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

bosh-bootloaderでIaaS設定のみ行う

bosh-bootloaderは便利ですが、BOSH Directorの設定は自分で行いたい場合があります。 特にBOSH CLI v2からはbosh-deploymentbosh create-envで簡単にBOSH Director VMを作成でき、UAA連携、CredHub連携など拡張ポイントがあります。VM typeの選択もしたいです。

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

Advanced BOSH Configurationに書かれています。

bbl up --no-director

この場合は、Director VMは作成されません。bosh-deployment-varsbosh 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で作成します。

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

- 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

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は用意されていないので、次のファイルを自分で作成します。

- 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の次のセッションが参考になります。

PDF


✒️️ Edit  ⏰ History  🗑 Delete