AWS クイックスタートで Pivotal Cloud Foundry (VMware Tanzu Application Service) をサクッとたててみた

## はじめに

3 年ほど前に Cloud Foundry ネタで社外イベントに登壇したのですが、ひょんなことから社内勉強会でリバイバル発表することになりました。さすがに 3 年前とは成熟度の面で差があると思い、最新情報をキャッチアップするために Cloud Foundry 環境構築に踏み切りました。

Ubuntu on WSL へのローカルデプロイを試みましたが、絶対的なメモリ不足により断念せざるを得ませんでした。続いて、mac へのローカルデプロイは試行錯誤の上、なんとかうまくいきましたが、リソース的にはギリギリです（何か別の重いアプリを起動するとスワップが発生してしまう）。

Cloud Foundry のように複数の役割を持ったノードが協調し合って成立する仕組みをローカルデプロイすること自体に無理があるのかも知れません。ありがたいことに AWS クイックスタートに「AWS での Pivotal Cloud Foundry」が用意されていますので、今回はその手順をまとめておきたいと思います。

### 前提条件

- AWS アカウントを持っていること
- VMware Tanzu Network (Pivotal Network) アカウントを持っていること

VMware Tanzu Network (Pivotal Network)  アカウントをお持ちでない方は、[「Ubuntu on WSL でローカル Cloud Foundry (PCF Dev) を動かそうとしてみた」の「Cloud Foundry (PCF Dev) の入手」手順](https://qiita.com/syamamotorhead/items/c9871a62ffe88071897c#cloud-foundry-pcf-dev-%E3%81%AE%E5%85%A5%E6%89%8B) をご参考にサインアップしてください。

## AWS クイックスタートにアクセスする

以下の URL にアクセスします。
https://aws.amazon.com/jp/quickstart/architecture/pivotal-cloud-foundry/

ちなみに、日本語では ``Pivotal Cloud Foundry`` のままですが、英語では ``VMware Tanzu Application Service on AWS`` に変更されています。

- 日本語タイトル：AWS での Pivotal Cloud Foundry
- 英語タイトル：VMware Tanzu Application Service on AWS

スクロールダウンし、「デプロイ方法」 を選択します。5 ステップの手順が記載されていますので、順番にやっていきます（ステップ 1 は、スキップします）。

1. AWS アカウントをお持ちでない場合は、https://aws.amazon.com でサインアップしてください。
1. Amazon Route 53 で、PCF ドメイン用のホストゾーンを作成します。
1. ドメインの SSL 証明書を AWS Certificate Manager にインポートします。
1. クイックスタートを起動し、必要なパラメータを指定します。デプロイには 2.5～3 時間かかります。
1. AWS アカウントにプロビジョニングされた PCF リソースにアクセスして、デプロイをテストします。

さらに詳細な手順については、[デプロイメントガイド（PDF）](https://aws-quickstart.s3.amazonaws.com/quickstart-pivotal-cloudfoundry/doc/pivotal-cloud-foundry-on-the-aws-cloud.pdf)もご確認ください。

![screenshot-aws.amazon.com-2020.08.23-09_33_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/43801021-fdb9-f17a-a84b-8a23bc33c7f6.png)

## Route 53 で PCF ドメイン用のホストゾーンを作成する（ステップ 2）

既存のホストゾーンを利用しました。説明上、便宜的に ``hoge.com`` としておきます。

## ドメインの SSL 証明書を AWS Certificate Manager にインポートする（ステップ 3）

### SSL 証明書を生成する

[デプロイメントガイド（PDF）](https://aws-quickstart.s3.amazonaws.com/quickstart-pivotal-cloudfoundry/doc/pivotal-cloud-foundry-on-the-aws-cloud.pdf)の 8 ページ目に記載されている通り、以下の URL にアクセスし、``scripts`` フォルダの ``gen_ssl_certs.sh`` ファイルをダウンロードするかコピペしておきます。
https://github.com/aws-quickstart/quickstart-pivotal-cloudfoundry

入手した ``gen_ssl_certs.sh`` を実行します。パラメータとして PCF 用のドメイン名を指定します。素直に ``pcf`` サブドメインとしました。

```zsh:SSL&nbsp;証明書を生成する
gen_ssl_certs.sh pcf.hoge.com
```

実行すると、以下の 2 ファイルが出力されます。

-  pcf.hoge.com.crt
-  pcf.hoge.com.key

### SSL 証明書をインポートする

AWS Certificte Manager にアクセスし、「証明書のインポート」を選択します。「証明書本文」に crt ファイルの内容を、「証明書のプライベートキー」に key ファイルの内容をそれぞれコピーし、「次へ」を選択します。
![screenshot-ap-northeast-1.console.aws.amazon.com-2020.08.23-10_16_08_masked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/37225554-8042-6f58-8bd3-4d5b1fc29435.png)
AWS Certificte Manager に以下のエントリーが追加されていることを確認しました。

- ドメイン名：*.pcf.hoge.com
- 追加の名前：*.sys.pcf.hoge.com, *.apps.pcf.hoge.com, *.login.sys.pcf.hoge.com, *.uaa.sys.pcf.hoge.com

後続の手順で必要になるので、追加した証明書の詳細を表示して ARN を控えておきましょう。
![screenshot-ap-northeast-1.console.aws.amazon.com-2020.08.23-10_27_37_masked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/5e079f4d-cca6-b11a-a2ad-ffb573a8c951.png)

## クイックスタートを実行する前に

### DeploymentSize を決めておく

後続の手順で DeploymentSize パラメータ（SmallFootPrint/Starter/Multi-AZ）を指定する必要があるため、どの規模感にするか検討しておきましょう。以下は、EC2 インスタンスの数ですが、その他のリソースについても [デプロイメントガイド（PDF）](https://aws-quickstart.s3.amazonaws.com/quickstart-pivotal-cloudfoundry/doc/pivotal-cloud-foundry-on-the-aws-cloud.pdf)の 9 ページ目にまとまっています。

- 10 instances (SmallFootPrint)
- 22 instances (Starter)
- 40 instances (Multi-AZ)

わたしは「サクッとお試し」が目的ですので、``SmallFootPrint`` を選択しました。ちなみに``SmallFootPrint`` は 10 インスタンスと記載されていますが、実際に起動されているのは 15 インスタンスでした。少し余裕を見ておいた方がよさそうです。

### サービスクォータの上限緩和をしておく

わたしは、ほぼまっさらなアカウントで ``SmallFootPrint`` を選択したため、特に必要ありませんでしたが、Multi-AZ などを選択した場合、サービスクォータの上限に抵触し、デプロイが失敗するケースがあります。デプロイ環境に応じて、適切に上限緩和しておく必要があります。

公式のサポートフォーラムでも、デプロイ失敗の原因として挙げられていました。

### Tanzu Network の API トークンを控えておく

[Tanzu Network](https://network.pivotal.io/) にサインインし、``Edit Profile`` メニューを選択します。
![screenshot-network.pivotal.io-2020.08.23-11_46_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/38e2ca37-ccdc-2bfd-0df9-e0a5eef8cec8.png)

User Profile でスクロールダウンし、``LEGACY API TOKEN [DEPRECATED]`` の値を控えておきます。
![screenshot-network.pivotal.io-2020.08.23-11_47_15_masked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/60720b6a-7d79-5810-53f4-1d7fcd5a03f1.png)

## クイックスタートを起動する（ステップ 4）

### テンプレートの指定（スタックの作成：ステップ 1）

[クイックスタートを起動](https://fwd.aws/ggmqB) リンクを選択します。CloudFormation の「スタック作成」にリダイレクトされますが、デフォルトでオレゴンリージョン（us-west-2）に設定されていますので、東京リージョン（ap-northeast-1）に切り替えてから、「次へ」を選択します。
![screenshot-ap-northeast-1.console.aws.amazon.com-2020.08.23-10_43_01_masked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/33efd3da-bab2-7ac2-3536-3bdab645e1db.png)

### スタックの詳細を指定（スタックの作成：ステップ 2）

以下の値を指定し、「次へ」を選択します。

- **スタックの名前**
 - スタックの名前：Pivotal-Cloud-Foundry（変更なし）
- **Amazon EC2 Configuraiton**
 - Environment ID：pcf（変更なし）
 - Keypair：［キーペア］（選択 ※既存のキーペアを選択しました）
 - SSL Certificate ARN：［証明書の ARN ※先ほど控えておいたもの］（入力）
 - Forward Log Output：true（変更）
- **Network and DNS Configuration**
 - Ops Manager & Bootstrap Ingress：0.0.0.0/0（入力 ※一旦、ガバガバにしておきます）
 - Route 53 Hosted Zone ID：``hoge.com``（選択）
 - Domain：``pcf.hoge.com``（入力）
- **Pivotal Cloud Foundry Configuration**
 - Size of the Deployment：SmallFootPrint（変更）
 - Skip SSL Validation：true（変更 ※true に変更しないとデプロイエラーになります）
 - Pivotal Network Token：［トークン ※先ほど控えておいたもの］（入力）
 - Admin Email：［メールアドレス］（入力）
 - Ops Manager Admin Password：［パスワード］（入力 ※英数字とダッシュとアンダースコアのみ許容されます。その他の記号を使わないようご注意ください）
 - Custom Branding Company Name：［自社の名前］（変更）
- **AWS Quick Start Configuration**
 - Quick Start S3 Bucket Name：aws-quickstart（変更なし）
 - Quick Start S3 Bucket Prefix：quickstart-pivotal-cloudfoundry/（変更なし）
- **Pivotal's End User License Agreement**
 - Accept EULA：Yes（変更）

### スタックオプションの指定（スタックの作成：ステップ 3）

「次へ」を選択します。

### レビュー（スタックの作成：ステップ 4）

以下のチェックボックスを ``ON`` にして、「スタックの作成」を選択します。

- AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。
- AWS CloudFormation によって、次の機能が要求される場合があることを承認します: CAPABILITY_AUTO_EXPAND

あとは、ひたすら待ちます。AWS クイックスタートの「デプロイ方法」には、“デプロイには 2.5～3 時間かかります。” と記載されていますが、わたしの場合は、SmallFootPrintだったためか、1 時間 50 分ほどでデプロイ完了しました。

## PCF リソースにアクセスして、デプロイをテストする（ステップ 5）

### Ops Manager にアクセスする

https\://opsman.pcf.hoge.com/ にアクセスします。以下を入力して ``SIGIN IN`` を選択します。

- ユーザ：admin
- パスワード：スタック作成時に ``Ops Manager Admin Password`` に指定したパスワード

![screenshot-opsman.pcf.abeam.cc-2020.08.23-12_24_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/188816dc-c533-5516-dc62-6177b7961dc8.png)

サインインに成功すると、Ops Manager ページが表示されます。
![screenshot-opsman.pcf.abeam.cc-2020.08.23-12_32_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/5bb1e59e-f98f-6601-0001-d6c8a360f25a.png)

### Apps Manager のパスワードを確認しておく

[デプロイメントガイド（PDF）](https://aws-quickstart.s3.amazonaws.com/quickstart-pivotal-cloudfoundry/doc/pivotal-cloud-foundry-on-the-aws-cloud.pdf)の 16 ページ目に以下のように記載されています。

> Password: You can find the password in the Pivotal Application Service tile in Ops
Manager. For instructions, see the Pivotal documentation.

Pivotal から VMware Tanzu に名称されていますので、Ops Manager の ``Small Footprint VMware Tanzu Application Service`` タイルを選択します。Small Footprint VMware Tanzu Application Service が表示されたら ``Credentials`` タブを選択します。
![screenshot-opsman.pcf.abeam.cc-2020.08.23-12_52_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/331c83fa-da7d-a19b-a291-3f9e5b654fa7.png)

スクロールダウンし、``UAA`` セクションの ``Admin Credentials`` アイテムの ``Link to Credential`` リンクを選択します。
![screenshot-opsman.pcf.abeam.cc-2020.08.23-12_49_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/6a72ae9a-f1c8-0bf4-05ee-cc70458fa7e7.png)

JSON 形式で Credential が返されますので、 ``password`` の値を控えておきましょう。

```json:.uaa.admin_credentials
{
    credential: {
        type: "simple_credentials",
        value: {
            identity: "admin",
            password: "ここにパスワードが記載されています"
        }
    }
}
```


### Apps Manager にアクセスする

https\://apps.sys.pcf.hoge.com/ にアクセスします。以下を入力して ``SIGIN IN`` を選択します。

- ユーザ：admin
- パスワード：先ほど控えておいた UAA admin のパスワード

![screenshot-login.sys.pcf.abeam.cc-2020.08.23-16_32_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/e9d66e61-0c25-ac70-7f88-a27263a559b9.png)

サインインに成功したら、``Apps Manager`` タイルを選択します。
![screenshot-login.sys.pcf.abeam.cc-2020.08.23-16_34_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/c2717d8d-1ed6-68e5-0749-46ea5050396c.png)

Apps Manager が表示されました。
![screenshot-apps.sys.pcf.abeam.cc-2020.08.23-16_34_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319241/e9cfc3ea-c751-3173-a5be-6a35d987d7ea.png)

### CF CLI からログインする

以下のコマンドを実行してログインしてみます。CF CLI が未インストールの方は、[「Ubuntu on WSL でローカル Cloud Foundry (PCF Dev) を動かそうとしてみた」の「Cloud Foundry CLI のインストール」手順](https://qiita.com/syamamotorhead/items/c9871a62ffe88071897c#cloud-foundry-cli-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) を参考にしてください。

```zsh
cf login --skip-ssl-validation
```

認証情報が求められますので、以下の値を入力します。

- Email：admin
- パスワード：先ほど控えておいた UAA admin のパスワード

```
% cf login --skip-ssl-validation
API エンドポイント: https://api.sys.pcf.hoge.com

Warning: Your targeted API's version (3.80.0) is less than the minimum supported API version (3.85.0). Some commands may not function correctly.

Email: admin
パスワード:

認証中です...
OK

Select an org:
1. aws-service-broker-org
2. system

組織 (enter to skip): 1
Targeted org aws-service-broker-org.

Targeted space aws-service-broker-space.

API エンドポイント:   https://api.sys.pcf.hoge.com
API version:          3.80.0
ユーザー:             admin
組織:                 aws-service-broker-org
スペース:             aws-service-broker-space 
```

## さいごに

AWS クイックスタートに「AWS での Pivotal Cloud Foundry」が用意されていますので、サクッといくだろうと思ってはじめたのですが、自身の無知ゆえにそれなりにハマりました。``pcf.hoge.com`` というホストゾーンを作成してスタック作成を試み、名前解決ができずロールバックされました。``Skip SSL Validation`` がデフォルトのまま（``false``）でロールバックされました。何度もロールバックされたので、S3 バケット数の上限に達してしまったこともありました。

公式のサポートフォーラムでも同様の事象が数件ヒットするものの、未解決だったり、解決策がアンマッチだったりして（クォータ緩和で解決されているパターンが多い）、とくかく情報が少ないという印象です。そうした状況を少しでも改善するために、当記事がお役に立てれば幸いです。

### 参考リンク

https://aws.amazon.com/jp/quickstart/architecture/pivotal-cloud-foundry/
https://aws-quickstart.s3.amazonaws.com/quickstart-pivotal-cloudfoundry/doc/pivotal-cloud-foundry-on-the-aws-cloud.pdf
https://github.com/aws-quickstart/quickstart-pivotal-cloudfoundry
https://qiita.com/syamamotorhead/items/0e69836e579078a0a2ac
https://qiita.com/syamamotorhead/items/c9871a62ffe88071897c