IBM Cloudで静的コンテンツを公開するまで何分？

## はじめに
すでにIBM Cloudがライトアカウントで一般利用できるようになってからすでに何年も経っていますが、あえて今更ながら静的コンテンツをインターネットに公開するまで何分ほどかかるかトライアルします

## 前提条件、実行環境
- CLIをベースに作業するので、IBM Cloud CLIがインストールされていること
- Windows 10
- IBM Cloudにログインするところから
- Cloud Foundryのサービスで公開します

## 公開環境の作成
まずはログインから。時刻も表示しておきます。

```
C:\qiita>echo %date% %time%
2020/07/20 19:05:10.71

C:\qiita>ibmcloud login -u [登録したメールアドレス] -p [パスワード]
API エンドポイント: https://cloud.ibm.com
地域: us-south
認証中です...
OK

ターゲットのアカウント katahiro's Account (9a3c1e21eb0b45969c26c2d4b5fc0b9f) <-> 2094484


API エンドポイント:      https://cloud.ibm.com
地域:                    us-south
ユーザー:                [登録したメールアドレス]
アカウント:              katahiro's Account (9a3c1e21eb0b45969c26c2d4b5fc0b9f) <-> 2094484
リソース・グループ:      リソース・グループがターゲットになっていません。'ibmcloud target -g RESOURCE_GROUP' を使用してください
CF API エンドポイント:
組織:
スペース:
```

登録していたメールアドレスが、40Byteを超えており、すでにタイプで時間ロス・・・
Cloud Foundryを実行する上で、組織(Organization)とスペースが存在しないので、まずそれを作成します。

```
C:\qiita>ibmcloud account org-create hirokata-org
[登録したメールアドレス] として組織 hirokata-org を作成しています...
OK

GUID             e75874d8-39ea-4b4d-8a1b-4b2fa449290a
名前             hirokata-org
地域
請求処理が有効   false
状況             active

ヒント: 新しい組織をターゲットにするには、'ibmcloud target -o hirokata-org' を使用します
```
組織を作成したので、CLIの実行環境を作成した組織にセットしましょう。

```
C:\qiita>ibmcloud target -o hirokata-org
ターゲットの Cloud Foundry (https://api.us-south.cf.cloud.ibm.com)

ターゲットの組織 hirokata-org



API エンドポイント:      https://cloud.ibm.com
地域:                    us-south
ユーザー:                [登録したメールアドレス]
アカウント:              hirokata's Account (9a3c1e21eb0b45969c26c2d4b5fc0b9f) <-> 2094484
リソース・グループ:      リソース・グループがターゲットになっていません。'ibmcloud target -g RESOURCE_GROUP' を使用してください
CF API エンドポイント:   https://api.us-south.cf.cloud.ibm.com (API バージョン: 2.148.0)
組織:                    hirokata-org
スペース:
```
OK、では続いてスペースの作成。

```
C:\qiita>ibmcloud account space-create hirokata-space
[登録したメールアドレス] としてスペース hirokata-space を組織 hirokata-org 内に作成しています...
OK
[登録したメールアドレス] として役割 SpaceManager を組織 hirokata-org / スペース hirokata-space 内のユーザー [登録したメールアドレス] に割り当てています...
OK
[登録したメールアドレス] として役割 SpaceDeveloper を組織 hirokata-org / スペース hirokata-space 内のユーザー [登録したメールアドレス] に割り当てています...
OK
```
スペースを作成したので、CLIの実行環境にその組織を指定しましょう。

```
C:\qiita>ibmcloud target -s hirokata-space
ターゲットのスペース hirokata-space



API エンドポイント:      https://cloud.ibm.com
地域:                    us-south
ユーザー:                [登録したメールアドレス]
アカウント:              hirokata's Account (9a3c1e21eb0b45969c26c2d4b5fc0b9f) <-> 2094484
リソース・グループ:      リソース・グループがターゲットになっていません。'ibmcloud target -g RESOURCE_GROUP' を使用してください
CF API エンドポイント:   https://api.us-south.cf.cloud.ibm.com (API バージョン: 2.148.0)
組織:                    hirokata-org
スペース:                hirokata-space

C:\qiita>
```

## 公開コンテンツの作成
cf-publish-qiita/ ←コンテンツ公開のアプリケーション名になります。
├ public/
│　└ index.html ←公開コンテンツ(みんな大好きHello World)
└ Staticfile　←Cloud Foundryでの公開設定、およびBuildPackでStatic_buildを利用するために必要

```
C:\qiita>mkdir cf-publish-qiita
C:\qiita>cd cf-publish-qiita
C:\qiita\cf-publish-qiita>mkdir public
C:\qiita\cf-publish-qiita>echo Hello World > public\index.html
C:\qiita\cf-publish-qiita>echo root: public > Staticfile
```

## 公開
`cf push`するだけです

```
C:\qiita\cf-publish-qiita>ibmcloud cf push cf-publish-qiita -m 32M
'cf push cf-publish-qiita -m 32M' を起動しています...

Pushing app cf-publish-qiita to org hirokata-org / space hirokata-space as [登録したメールアドレス]...
Getting app info...
Updating app with these attributes...
  name:                cf-publish-qiita
  path:                C:\qiita\cf-publish-qiita
  command:             $HOME/boot.sh
  disk quota:          1G
  health check type:   port
  instances:           1
  memory:              32M
  stack:               cflinuxfs3
  routes:
    cf-publish-qiita.mybluemix.net

Updating app cf-publish-qiita...
Mapping routes...
Comparing local files to remote cache...
Packaging files to upload...
Uploading files...
 445 B / 445 B [============================================================================================================================================================================================] 100.00% 1s

Waiting for API to complete processing files...

Stopping app...

Staging app and tracing logs...
   Downloading xpages_buildpack...
   Downloading liberty-for-java_v3_46-20200626-1029...
   Downloading swift_buildpack...
   Downloading sdk-for-nodejs...
…
(長いので中略)
…
   Downloaded build artifacts cache (2M)
   -----> Staticfile Buildpack version 1.5.6
   -----> Installing nginx
          Using nginx version 1.17.10
   -----> Installing nginx 1.17.10
          Copy [/tmp/cache/final/dependencies/9d0e3e32d05f770cc90826acd3dcd3a5e8aa5f2f327670a11638d2655150ce52/nginx-static_1.17.10_linux_x64_cflinuxfs3_f2c99636.tgz]
          **WARNING** nginx 1.17.x will no longer be available in new buildpacks released after 2020-05-01.
          See: https://nginx.org/
   -----> Root folder /tmp/app/public
   -----> Copying project files into public
   -----> Configuring nginx
   Exit status 0
   Uploading droplet, build artifacts cache...
   Uploading build artifacts cache...
   Uploading droplet...
   Uploaded build artifacts cache (2M)
   Uploaded droplet (2M)
   Uploading complete
   Cell 506a3954-c895-4a4a-a57f-bfd766113116 stopping instance f736646c-511f-480d-938b-e3e16e13a84f
   Cell 506a3954-c895-4a4a-a57f-bfd766113116 destroying container for instance f736646c-511f-480d-938b-e3e16e13a84f
   Cell 506a3954-c895-4a4a-a57f-bfd766113116 successfully destroyed container for instance f736646c-511f-480d-938b-e3e16e13a84f

Waiting for app to start...

name:              cf-publish-qiita
requested state:   started
routes:            cf-publish-qiita.mybluemix.net
last uploaded:     Mon 20 Jul 19:45:42 JST 2020
stack:             cflinuxfs3
buildpacks:        staticfile

type:            web
instances:       1/1
memory usage:    32M
start command:   $HOME/boot.sh
     state     since                  cpu    memory       disk         details
#0   running   2020-07-20T10:45:57Z   0.3%   13M of 32M   5.3M of 1G


C:\qiita\cf-publish-qiita>echo %date% %time%
2020/07/20 19:09:30.89

C:\qiita\cf-publish-qiita>
```

## 公開完了
約4分ほどで、リンク先に静的コンテンツを公開することが出来ました。
http://cf-publish-qiita.mybluemix.net/
あらかじめCloud Foundryの組織やスペースが作成されている環境であれば、もっと早く公開が可能になります。

## 技術情報
本来、Cloud Foundryでは、マニフェストファイルを用意したり、`cf app push`の際にBuild Packを指定することで、Cloud Foundry上で、どのようにアプリケーションをBuildするか決定するのですが、pushするアプリケーションのディレクトリの直下に`Staticfile`を用意することで、自動的にStatic Build Packによってbuildしてくれます。
`Staticfile`には、今回`public`ディレクトリ以下が公開コンテンツとの指定のみしていますが、様々なセッティングが可能なので、興味ある方は、下記のDocumentを確認してみてください。
https://docs.cloudfoundry.org/buildpacks/staticfile/index.html