vagrant up
でお手軽にローカルCloud Foundry環境を作れるPCF Devですが、Vagrant AWS Pluginを使えばAWS上にデプロイすることもできます。
EC2 1インスタンスで済むので、「ラップトップに入れるのは重いし、みんなで使えるちょっとした検証用Cloud Foundryを用意したい」という場合に便利です。Dockerイメージのpushにも対応しています。
なお、PCF Devをラップトップにインストールする方法はこちらを参照してください。
本記事で検証したPCF Devのバージョンは0.15.0で、Vagarntのバージョンは次の通りです。
$ vagrant --version
Vagrant 1.8.1
$ vagrant plugin list
vagrant-aws (0.7.0)
vagrant-share (1.1.5, system)
Vagrant AWS Pluginは以下でインストールできます。
$ vagrant plugin install vagrant-aws
セットアップ方法
PCF DevはPivotal Networkからダウンロードできます。(下図はv0.13ですが読み替えてください)
ダウンロードするにはPivotal Networkにログインする必要があります。こちらからアカウントを作成してください。
ダウンロードしたpcfdev-v0.15.0.zip
を展開してください。
$ unzip pcfdev-v0.15.0.zip
$ cd pcfdev-v0.15.0
$ ls -l
total 64
-rw-r--r--@ 1 makit 720748206 4448 4 30 05:18 Vagrantfile
-rwxr-xr-x@ 1 makit 720748206 129 4 29 08:11 destroy-osx
-rw-r--r--@ 1 makit 720748206 122 4 29 08:11 destroy-windows.ps1
-rwxr-xr-x@ 1 makit 720748206 1903 4 29 08:11 start-osx
-rw-r--r--@ 1 makit 720748206 2372 4 29 08:11 start-windows.ps1
-rwxr-xr-x@ 1 makit 720748206 123 4 29 08:11 stop-osx
-rw-r--r--@ 1 makit 720748206 116 4 29 08:11 stop-windows.ps1
AWSの設定のための環境変数を定義する必要があります。以下のaws.sh
に作成します。
export AWS_ACCESS_KEY_ID=<Access Key ID>
export AWS_SECRET_ACCESS_KEY=<Secret Access Key>
export AWS_SSH_PRIVATE_KEY_NAME=<Keypair名>
export AWS_SSH_PRIVATE_KEY_PATH=<Keypairのpemファイルのパス>
export AWS_REGION=ap-northeast-1
適用します。
$ source aws.sh
あとはvagrant up --provider=aws
するだけ。簡単ですね!
注意点は、デフォルトではDefault VPCとDefault Security Groupが使われる点です。SSH, HTTP, HTTPSのポートは空けておいてください。
$ vagrant up --provider=aws
Bringing machine 'default' up with 'aws' provider...
==> default: Checking if box 'pcfdev/pcfdev' is up to date...
/Users/makit/.vagrant.d/gems/gems/vagrant-aws-0.7.0/lib/vagrant-aws/action/run_instance.rb:98: warning: duplicated key at line 100 ignored: :associate_public_ip
==> default: Warning! The AWS provider doesn't support any of the Vagrant
==> default: high-level network configurations (`config.vm.network`). They
==> default: will be silently ignored.
==> default: Launching an instance with the following settings...
==> default: -- Type: m4.xlarge
==> default: -- AMI: ami-e8aab286
==> default: -- Region: ap-northeast-1
==> default: -- Keypair: pcf-dev
==> default: -- Block Device Mapping: [{"DeviceName"=>"/dev/sda1", "Ebs.VolumeSize"=>100, "Ebs.DeleteOnTermination"=>true, "Ebs.VolumeType"=>"gp2"}]
==> default: -- Terminate On Shutdown: false
==> default: -- Monitoring: false
==> default: -- EBS optimized: true
==> default: -- Source Destination check:
==> default: -- Assigning a public IP address in a VPC: false
==> default: -- VPC tenancy specification: default
==> default: Waiting for instance to become "ready"...
==> default: Waiting for SSH to become available...
==> default: Machine is booted and ready for use!
==> default: Running provisioner: shell...
default: Running: inline script
==> default: stdin: is not a tty
==> default: Waiting for services to start...
==> default: 0 out of 48 running
==> default: 0 out of 48 running
==> default: 0 out of 48 running
==> default: 0 out of 48 running
==> default: 0 out of 48 running
==> default: 6 out of 48 running
==> default: 48 out of 48 running
==> default: PCF Dev is now running.
==> default: To begin using PCF Dev, please run:
==> default: cf login -a api.54.199.232.125.xip.io --skip-ssl-validation
==> default: Email: admin
==> default: Password: admin
あとはcf
コマンドを使用して、
$ cf login -a api.54.199.232.125.xip.io --skip-ssl-validation
API エンドポイント: api.54.199.232.125.xip.io
Email> admin
Password>
認証中です...
OK
組織 pcfdev-org をターゲットにしました
スペース pcfdev-space をターゲットにしました
API エンドポイント: https://api.54.199.232.125.xip.io (API バージョン: 2.54.0)
ユーザー: admin
組織: pcfdev-org
スペース: pcfdev-space
インスタンスタイプはm4.xlarge
がVagrantfile
に指定されています。変更したい場合はVagrantfile
を修正してください。使い方次第ですが、メモリ8GB以上、できれば16GBはあった方が良いです。(最小は3GBです。使ったことないけど)
もしDefault VPCを削除してしまっていたら、VCPの情報をVagrantfile
に設定する必要があります。
aws.security_groups=["sg-xxxxxxxx"]
aws.associate_public_ip=true
aws.subnet_id = "subnet-xxxxxxxx"
アプリケーションのデプロイ
GolangのHello Worldアプリをgit clone
してcf push
します。初回は各種buildpackのダウンロードがあったりして少し時間がかかります。
$ git clone https://github.com/cloudfoundry-community/simple-go-web-app.git
$ cd simple-go-web-app
$ cf push
マニフェスト・ファイル /Users/makit/git/simple-go-web-app/manifest.yml を使用しています
admin としてアプリ simple-go-web-app を組織 pcfdev-org / スペース pcfdev-space 内に作成しています...
OK
経路 simple-go-web-app.54.199.232.125.xip.io を作成しています...
OK
simple-go-web-app.54.199.232.125.xip.io を simple-go-web-app にバインドしています...
OK
simple-go-web-app をアップロードしています...
次のパスからアプリ・ファイルをアップロードしています: /Users/makit/pcf-install/simple-go-web-app
229.5K、47 個のファイルをアップロードしています
Done uploading
OK
admin として組織 pcfdev-org / スペース pcfdev-space 内のアプリ simple-go-web-app を開始しています...
Downloading binary_buildpack...
Downloading php_buildpack...
Downloading ruby_buildpack...
Downloading python_buildpack...
Downloading java_buildpack...
Downloading go_buildpack...
Downloading nodejs_buildpack...
Downloading staticfile_buildpack...
Downloaded staticfile_buildpack (2.5M)
Downloaded nodejs_buildpack (60.7M)
Downloaded ruby_buildpack (247.7M)
Downloaded java_buildpack (241.6M)
Downloaded php_buildpack (262.3M)
Downloaded binary_buildpack (8.3K)
Downloaded go_buildpack (450.3M)
Downloaded python_buildpack (254.1M)
Creating container
Successfully created container
Downloading app package...
Downloaded app package (89.4K)
Staging...
-------> Buildpack version 1.7.5
file:///tmp/buildpacks/3736f0a4294fc2936232b7ee45c02e70/dependencies/https___pivotal-buildpacks.s3.amazonaws.com_concourse-binaries_godep_godep-v62-linux-x64.tgz
-----> Checking Godeps/Godeps.json file.
-----> Installing go1.5.4... done
Downloaded [file:///tmp/buildpacks/3736f0a4294fc2936232b7ee45c02e70/dependencies/https___storage.googleapis.com_golang_go1.5.4.linux-amd64.tar.gz]
-----> Running: godep go install -tags cloudfoundry ./...
Exit status 0
Staging complete
Uploading droplet, build artifacts cache...
Uploading build artifacts cache...
Uploading droplet...
Uploaded build artifacts cache (77.1M)
Uploaded droplet (2.2M)
Uploading complete
1 個の中の 1 個のインスタンスが実行中です
アプリが開始されました
OK
アプリ simple-go-web-app はコマンド `simple-go-web-app` を使用して開始されました
admin として組織 pcfdev-org / スペース pcfdev-space 内のアプリ simple-go-web-app の正常性と状況を表示しています...
OK
要求された状態: started
インスタンス: 1/1
使用: 128M x 1 インスタンス
URL: simple-go-web-app.54.199.232.125.xip.io
最終アップロード日時: Sat Jun 4 06:05:08 UTC 2016
スタック: unknown
ビルドパック: Go
状態 開始日時 CPU メモリー ディスク 詳細
#0 実行 2016-06-04 03:06:54 PM 0.0% 128M の中の 836K 512M の中の 452K
cf apps
でデプロイされたアプリを確認できます。
$ cf apps
admin として組織 pcfdev-org / スペース pcfdev-space 内のアプリを取得しています...
OK
名前 要求された状態 インスタンス メモリー ディスク URL
simple-go-web-app started 1/1 128M 512M simple-go-web-app.54.199.232.125.xip.io
アクセスするとHello Worldが表示されます。
$ curl simple-go-web-app.54.199.232.125.xip.io
Hello world
Dockerイメージのpush
PCF DevはDockerイメージにも対応しています。試しにJenkinsをpushしてみましょう。cf push -o <Dockerイメージ名>
です。Jenkinsはメモリとディスクを多く使用するので、-m
と-k
でこれらも指定しておきます。
$ cf push jenkins -o jenkins -k 2g -m 2g
admin としてアプリ jenkins を組織 pcfdev-org / スペース pcfdev-space 内に作成しています...
OK
経路 jenkins.54.199.232.125.xip.io を作成しています...
OK
jenkins.54.199.232.125.xip.io を jenkins にバインドしています...
OK
admin として組織 pcfdev-org / スペース pcfdev-space 内のアプリ jenkins を開始しています...
Creating container
Successfully created container
Staging...
Staging process started ...
Staging process finished
Exit status 0
Staging Complete
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 0 個のインスタンスが実行中です, 1 個が開始中です
1 個の中の 1 個のインスタンスが実行中です
アプリが開始されました
OK
アプリ jenkins はコマンド `/bin/tini -- /usr/local/bin/jenkins.sh ` を使用して開始されました
admin として組織 pcfdev-org / スペース pcfdev-space 内のアプリ jenkins の正常性と状況を表示しています...
OK
要求された状態: started
インスタンス: 1/1
使用: 2G x 1 インスタンス
URL: jenkins.54.199.232.125.xip.io
最終アップロード日時: Sat Jun 4 07:04:53 UTC 2016
スタック: unknown
ビルドパック: unknown
状態 開始日時 CPU メモリー ディスク 詳細
#0 実行 2016-06-04 04:06:41 PM 0.0% 2G の中の 1.5G 2G の中の 122.8M
できました。
Jenkinsはローカルディスクを使うのでCFで扱うアプリとしては向いておらず、デモ用途くらいにしか使えない点に注意してください。
現時点ではHTTPしか受け付けないのとポートもひとつしかバインドできません。 次か次の次のバージョンではTCPルーティングがサポートされると思います。夢が広がりますね。
バックエンドサービスを使用する
PCF Devには初めから
- Redis
- MySQL
- RabbitMQ
が用意されています。
サービスを使うチュートリアルは
http://pivotal.io/platform/pcf-tutorials/getting-started-with-pivotal-cloud-foundry-dev/introduction
がオススメです。
また、SwisscomのCloud Foundryのチュートリアルがいろいろな言語に対応していて良いと思います。 https://docs.developer.swisscom.com/getting-started/index.html
OSS版Cloud Foundry、Pivotal Cloud Foundryとの違い
https://docs.pivotal.io/pcf-dev/index.html の「Comparing PCF Dev to Pivotal Cloud Foundry」に比較が載っています。 最も大きな違い(デメリット)は可用性がない点です。1 VMで監視もされていないので、VMがダウンしたら即サービスダウンです。検証環境や遊び場として使ってください。
PCF DevにはBOSHもありません。
また現時点のPCF DevではSyslog Drainがサポートされていないため、ログをsyslogで外部ログ管理サービスに転送することができません。(次か次の次で治ると思います)
もっとCloud Foundryを学びたい
Pivotal Japanで毎月Cloud Foundryワークショップを実施しています。 http://pivotal-japan.connpass.com/ でイベント告知しているので、是非ご参加ください。直近は2016/6/14に予定しています。
資料も公開しているので、セットアップしたPCF Devで試してみてください。 https://github.com/Pivotal-Japan/cf-workshop (「ログの転送 / Forward logging」はPCF Dev未対応です)