--- title: PCF DevでAWSに簡易Cloud Foundry環境を作る tags: ["Cloud Foundry", "PCF Dev", "Pivotal Cloud Foundry", "AWS"] categories: ["Service", "PaaS", "CloudFoundry"] date: 2016-06-04T08:33:38Z updated: 2016-06-04T09:00:33Z --- `vagrant up`でお手軽にローカルCloud Foundry環境を作れる[PCF Dev](https://docs.pivotal.io/pcf-dev/index.html)ですが、Vagrant AWS Pluginを使えばAWS上にデプロイすることもできます。 EC2 1インスタンスで済むので、「ラップトップに入れるのは重いし、みんなで使えるちょっとした検証用Cloud Foundryを用意したい」という場合に便利です。Dockerイメージのpushにも対応しています。 なお、PCF Devをラップトップにインストールする方法は[こちら](https://blog.ik.am/entries/378)を参照してください。 本記事で検証したPCF Devのバージョンは[0.15.0](https://network.pivotal.io/products/pcfdev#/releases/1710)で、Vagarntのバージョンは次の通りです。 ``` console $ vagrant --version Vagrant 1.8.1 $ vagrant plugin list vagrant-aws (0.7.0) vagrant-share (1.1.5, system) ``` Vagrant AWS Pluginは以下でインストールできます。 ``` console $ vagrant plugin install vagrant-aws ``` ### セットアップ方法 PCF Devは[Pivotal Network](https://network.pivotal.io/products/pcfdev)からダウンロードできます。(下図はv0.13ですが読み替えてください) スクリーンショット 0028-04-05 7.33.45.png ダウンロードするにはPivotal Networkにログインする必要があります。[こちら](https://network.pivotal.io/registrations/new)からアカウントを作成してください。 ![image](https://qiita-image-store.s3.amazonaws.com/0/1852/9a96d83c-8b7a-b0ce-b830-f9bfa03d141e.png) ダウンロードした`pcfdev-v0.15.0.zip`を展開してください。 ``` console $ 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`に作成します。 ``` bash export AWS_ACCESS_KEY_ID= export AWS_SECRET_ACCESS_KEY= export AWS_SSH_PRIVATE_KEY_NAME= export AWS_SSH_PRIVATE_KEY_PATH= export AWS_REGION=ap-northeast-1 ``` 適用します。 ``` console $ source aws.sh ``` あとは`vagrant up --provider=aws`するだけ。簡単ですね! 注意点は、デフォルトではDefault VPCとDefault Security Groupが使われる点です。SSH, HTTP, HTTPSのポートは空けておいてください。 ``` console $ 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`コマンドを使用して、 ``` console $ 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`に設定する必要があります。 ``` ruby aws.security_groups=["sg-xxxxxxxx"] aws.associate_public_ip=true aws.subnet_id = "subnet-xxxxxxxx" ``` ### アプリケーションのデプロイ [GolangのHello Worldアプリ](https://github.com/cloudfoundry-community/simple-go-web-app)を`git clone`して`cf push`します。初回は各種buildpackのダウンロードがあったりして少し時間がかかります。 ``` console $ 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 `です。Jenkinsはメモリとディスクを多く使用するので、`-m`と`-k`でこれらも指定しておきます。 ``` console $ 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 ``` できました。 ![image](https://qiita-image-store.s3.amazonaws.com/0/1852/03a3cde4-8ad1-f0e3-343c-3d5fa361fe02.png) Jenkinsはローカルディスクを使うのでCFで扱うアプリとしては向いておらず、デモ用途くらいにしか使えない点に注意してください。 現時点ではHTTPしか受け付けないのとポートもひとつしかバインドできません。 次か次の次のバージョンでは[TCPルーティング](https://www.cloudfoundry.org/tcp-routing-comes-to-cloud-foundry/)がサポートされると思います。夢が広がりますね。 ### バックエンドサービスを使用する 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](http://pivotal-japan.connpass.com/event/33314/)に予定しています。 資料も公開しているので、セットアップしたPCF Devで試してみてください。 https://github.com/Pivotal-Japan/cf-workshop (「ログの転送 / Forward logging」はPCF Dev未対応です)