# 23June2022 CloudHub運用コース
- 目次
[ToC]
## モジュール0: 準備
:::info
:information_source: コース資料
- :star: **APOpsCloud4.4_studentFiles_07dec2021.zip**
- 2日間を通して使用するファイル集
- APOpsCloud4.4_studentSlides_JA_07dec2021.zip (受講者スライド)
- 復習に使用
- APOpsCloud4.4_studentManual_JA_07dec2021.pdf (受講者マニュアル)
- 復習に使用
:::
### セットアップ
[CloudHub 運用コース セットアップマニュアル](https://salesforce.quip.com/mfmHABywK5rn)をご参照ください。
1. [Advanced REST Client](http://install.advancedrestclient.com/install)
- [Postman](https://www.postman.com/downloads/)など、その他のREST APIクライアントアプリケーションも使用可能です。
2. [Anypoint Platform CLI](https://docs.mulesoft.com/jp/runtime-manager/anypoint-platform-cli#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
3. [Open JDK8+](Apache JMeter の実行に使用します)
- [Java インストールと環境変数設定](https://salesforce.quip.com/5B2PAV46QbB5#DCSABAatba1)
4. [Apache JMeter](http://%29https//dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.4.3.zip) - zip ファイル
- Mac: bin/jmeter
- Windows: bin/jmeter.bat
5. [OpenSSL](https://github.com/openssl/openssl)
## モジュール1: Anypoint Platform の概要
- Anypoint Platform コントロールプレーン
- Anypoint Platform でアプリケーションを設計・開発・デプロイ・管理・監視etcするためのツール/コンポーネント群
- URL: https://anypoint.mulesoft.com (US)
- ステータスの確認: https://status.mulesoft.com/
- Anypoint Platform ランタイムプレーン
- MuleランタイムとMuleアプリケーションをデプロイする環境・インフラ
- :star: **CloudHub**
- スタンドアロンMuleランタイム
- Runtime Fabric
### 2日間使用する Anypoint Platform 認証情報
- パスワード: @Mulesoft2020
| 受講者名 | ユーザー | 閲覧専用ユーザー |
|:-------- |:--------:| --------:|
| Izuno | Cloud01Student01 | Cloud01Viewer01 |
| Anzai| Cloud01Student02 | Cloud01Viewer02 |
| Watanabe| Cloud01Student03 | Cloud01Viewer03 |
| Takimoto| Cloud01Student04 | Cloud01Viewer04 |
| Yamamoto| Cloud01Student05 | Cloud01Viewer05 |
| Sudo| Cloud01Student06 | Cloud01Viewer06 |
| Nomura | Cloud01Student07 | Cloud01Viewer07 |
### Muleアプリケーション
- Anypoint Studio(IDE)で開発
- ローコードで開発可能な Java アプリケーション
- XMLで定義
- jar ファイルにパッケージング (Maven)
- Mule ランタイム(エンジン/アプリケーションサーバー)にデプロイされ実行される
### CloudHub ワーカー
- OS, Java, Mule Runtime などを MuleSoft が管理するAWS EC2 インスタンス= 仮想マシン
- 管理するインフラを少なく -> Muleアプリケーションの開発に集中することができる
- [CloudHubワーカーについて](https://docs.mulesoft.com/jp/runtime-manager/cloudhub-architecture#cloudhub-%E3%83%AF%E3%83%BC%E3%82%AB%E3%83%BC)

### スケーリング
- スケールイン/スケールアウト: CloudHubワーカーの数を増やす/数を減らす
- スケールアップ/スケールダウン: CloudHubワーカーのサイズを大きくする/小さくする
## モジュール2: ユーザーとリソースの管理
### Organization(組織)
- トップレベルのグループ
### Business Group(ビジネスグループ)
- CloudHub vCore リソース
- Network connetion, Load Balancer, VPC などのリソース
- Environments を複数持つことができる
#### サブグループの作成
- Cloud01Class
- Cloud01Group*XX*
- :star: Cloud01SubGroup*XX* `//ココ!`
### Environments(環境)
- Sandbox Type: **Dev**, Stag, QA...
- Production Type: **Prod**...
- Sandbox よりも良い MuleSoft SLA 保証
- (Design Type: Flow Designer で作成したアプリケーションを動かすための vCore)
### User(ユーザー)
- anypoint.mulesoft.com ログインするユーザー
- SSO も使用可能
### Teams(チームズ)
- ビジネスグループを横断したユーザーのグループ。複数のPersmission(権限)を、複数のビジネスグループで柔軟に管理できる。
- Teams 単位での Exchange アセットの共有も可能
- 各チームのメンバーの種類
- Maintainer(管理者)
- Member(メンバー)
- 親チームの権限は、子チームに継承される
- 親チームとなるチームの権限は、最小限で構成していく
- すべてのチームは **Everyone** を親に持つ
- Everyone (X) `//デフォルト`
- CloudHub Network Viewer (XY)
- App Deployer (XYa)
- TeamZZZ (XYb)
### Roles(役割)
- *非推奨* 新機能であるTeamsを推奨
### Permissions(権限)
- Userに直接付与も可能だが、Teams単位で権限をグルーピングすることを推奨している
#### 権限変更によるViewerの見え方の変化
- 権限がないとき

- Viewer権限の追加

- Deployer権限の追加

## Module 3: Mule アプリケーションの管理
### Muleアプリケーションのデプロイ
- デプロイ可能なアーカイブ (JAR) を Runtime Managerにアップロードする
- このクラスで中心トピック
- Runtime Manager で Exchange Asset を選択
- Anypoint Studio からデプロイ
- Anypoint Platform REST API でデプロイ
- 本コース後半で学びます
- Anypoint-CLI コマンドラインツールでデプロイ
- 本コース後半で学びます
- Maven プラグインでデプロイ
### Runtime Manager
- Muleランタイムのホスティングと、Muleアプリケーションのデプロイを管理
- 実行中のMuleランタイムとアプリケーションの監視も可能
- [アラート](https://docs.mulesoft.com/jp/runtime-manager/alerts-on-runtime-manager)の設定も可能
### MuleアプリケーションをCloudHubデプロイ
- 環境
- Prod
- アプリケーション名
- **server-info-01XX**
- CloudHubアプリケーションの名前は、グローバルで一意である必要がある
- jarファイル (Choose File > Upload File)
- APOpsCloud4.4_studentFiles_07dec2021
- mod03-mule
- **server-info-5.5.0-mule-application.jar**
### CloudHubネットワークの仕組み
- CH Worker (仮想マシン) IP
- 3.112.34.208:**8081**
- DNS (Shared Load Balancer)
- server-info-0101.jp-e1.cloudhub.io: **80**
- DNS (wokrker)
- **mule-worker**-server-info-ch0101.jp-e1.cloudhub.io:**8081**

### CloudHubのログ
- 100MB, 30日 (Platinum, Gold)
- 外部のログツールや、ストレージに保管する運用
### Anypoint Monitoring のログ
For Titanium Subscription, you will get 200 GB per production core.
https://help.mulesoft.com/s/article/Anypoint-Monitoring-Log-FAQ
## Module 4: Mule アプリケーションのモニタリング (監視) と分析
- Log Analyzer
- https://help.mulesoft.com/s/article/Support-Log-file-analyzer-tool
### CloudHub Runtime Manager Log
- CloudHub のアプリケーションログの設定には、デフォルトで 「CloudHub log4j2 アペンダー」が使用される
- https://docs.mulesoft.com/jp/runtime-manager/custom-log-appender#log4j-%E8%A8%AD%E5%AE%9A%E3%81%AE%E4%BD%9C%E6%88%90

### 監視対象アプリケーション: price-lookup-01xx
jar: {studentFiles}/mod4-monitoring/**price-lookup-service-5.5.0-mule-application.jar**


### Tracing
https://docs.mulesoft.com/tracing-module/1.0/tracing-module-logging
Q.Tracing Module はPlatinumサブスクリプションでも使えますか?
A.使用できます。開発者がMuleアプリケーションの中に実装するとともに、Log4j appenderの設定が必要です。
- Tracing Module
- https://docs.mulesoft.com/tracing-module/1.0/tracing-module-logging
- Logging Variable の追加 + Pattern Layout を変更 = ログの拡張
```
<!-- <PatternLayout pattern="%-5p %d [%t] [processor: %X{processorPath}; event: %X{correlationId}] %c: %m%n"/>-->
<PatternLayout pattern="%-5p %d [%t] [%MDC] %c: %m%n"/>
```
Q:monitoring ダッシュボードで以下はどう違うのでしょうか?
A:https://docs.mulesoft.com/monitoring/app-dashboards#overview-charts
* Average Response Time (AからNまでの平均)
* Muleアプリ内でMuleイベントが処理される平均時間。
* Inbound - Average Response Time (A-N, B-M, D-Gの平均)
* インバウンド・リクエストの平均応答時間。Muleアプリが複数のコネクターを持つ場合、すべてのコネクターの応答時間がこの指標に含まれます。
* Outbound - Average Response Time (HからKまでの平均時間)
* アウトバウンド・リクエストの平均応答時間。Muleアプリが複数のコネクターを持つ場合、すべてのコネクターの応答時間がこの指標に含まれます。

Q: (続き)Average Response Timeよりも、Inbound-Avarage Response Timeが長い場合がある。どのようなケースで起きるのか?
A: 外部呼び出しを行うコネクターには、同期呼び出しと非同期呼び出しがあるものがあります。非同期の呼び出し(JMSのPublishなど)では、他のフローを呼び出した後、結果を待たずに後続処理が続行されるので、A-Nの応答時間より、B-MやD-Gが長いケースがあります。また、メトリクスの受信/保管は非同期に行われているため、複数のメトリクスの計測/表示タイミングが同時とは限りません。必要に応じて、サポートにお問い合わせください。
## Module 5: Mule アプリケーションの設定
`Couldn't find configuration property value for key ${env} `
### Runtime Manager > Properties タブ
`env=dev`
- プロパティ値は、大文字/小文字が区別されるので、要注意!


### パスワードの管理
1. Runtiem Manager プロパティタブでデプロイ時に設定する
- [safely hidden properties](https://docs.mulesoft.com/jp/runtime-manager/secure-application-properties#create-safely-hidden-application-properties)を使用する
2. yamlで構成する (=jarファイルの一部に組み込む)
- [セキュア設定プロパティ](https://docs.mulesoft.com/jp/mule-runtime/4.4/secure-configuration-properties)
```
encrypted:
value1: "![nHWo5JhNAYM+TzxqeHdRDXx15Q5R56YVGiQgXCoBCew=]"
value2: "![nHWo6XyCADP+TzxqeHdRDXx15Q5R56YVGiQgXCoDFaj=]"
testPropertyA: "testValueA"
testPropertyB: "testValueB"
```
```
<flow name="main">
<set-payload value="${secure::encrypted.value1}"/>
</flow>
```
3. 外部のプロパティストレージを使用して自動化する (CI/CDパイプライン)
### Runtime Manager > Scheduler
スケジュール実行の頻度を変更(開発者が変更する必要はありません)
- 定期間隔での実行
- CRON式での設定
- https://crontab.guru/

Q: Business Groupをまたいだアプリケーションのコピーはできるか?
A: EnvironmentはBusiness Groupに紐づいて作成されるので、環境間の移行の操作では他のBusiness GroupのEnvironmentにあるアプリケーションをそのまま取得して移行することはできません。Exchangeからファイルを取得することは可能です。
Q: Exchangeにjarを公開するには?
A: CustomというカテゴリでJarを公開・共有することができます。
https://docs.mulesoft.com/jp/exchange/to-create-an-asset
https://varun-verma.medium.com/using-mulesoft-exchange-for-storing-custom-jar-files-55570cb430fd
## Module 6: パフォーマンスと信頼性の目標を達成する
### Object Store & VM on CloudHub
Object Store: key-value ペアのストレージ

### Object Store v2 - only on CloudHub
- 特別な設定なしで使用可能
- Object Store v2 REST API を使用可能
- 多くの場合は、MuleアプリケーションからObject Storeコネクタを使用して、値を作成・更新・保存する
- Cloudベースのkey-value store
`{hoge:fuga}`
- 複数のワーカーで共有が可能
- ワーカーが停止して再起動した後もデータは保持される
- 通信時と保管時のセキュリティ◎
- 制限
- 10 TPS
- アドオン: 100 TPS
- TTL: 30日間
- 更新されればリセット
- 各値: 10MB以下にする
- エントリ数に制限はなし
#### 信頼性
https://docs.mulesoft.com/jp/runtime-manager/cloudhub-hadr
- 高可用性 (High Availability, HA)

- 災害復旧 (Disaster Recovery, DR)

#### Object Store v2 テスト
- OSv2 に値を保存(/store)
http://object-store-0101.jp-e1.cloudhub.io/store?key=Alice&value=first
`{"Alice":"first"}`
Worker1:`18.176.58.185:8081`
Worker2: `3.112.2.89:8081`
- Worker1の/storeを直接呼び出す(ポート**8081**)
`http://<worker-1>:8081/store?key=Bob&value=second`
- Worker2からBobの値を直接参照する(ポート**8081**)
`http://<worker-2>:8081/retrieve?key=Bob&value=second`
//2つのワーカーでOSv2は共有されている??
#### Batch Jobと永続化キューについて
- 多くのレコードを分割して非同期&マルチスレッドで処理
- https://docs.mulesoft.com/jp/mule-runtime/4.4/batch-processing-concept
- 10000件のレコードを分割して、**Batch Queue**で管理する
- 100
- 100
- 100
- 100
- 100
- ..
- Batch Job は、VMキューを使用する (Batch Queue)
- **VM persistent Queue(永続化キュー)は、Batch Queue にも適用されてしまう**= Cloud上のキューへの読み書きが頻繁に発生=パフォーマンスに悪影響
> MuleSoft recommends that applications containing Batch Component do not use CloudHub Persistent Queue
- **Batch Job をもつMuleアプリケーションでは、VM persistent Queue(永続化キュー)を使用しない**
- https://help.mulesoft.com/s/article/Mule-Batch-Process-and-CloudHub-Persistent-Queues
- もしくは、プロパティを渡して回避
- `batch.persistent.queue.disable=true`
## Module 7: CloudHub インフラストラクチャの管理
### VPC(Virtual Private Cloud, VPC)
- Firewallを構成できるプライベートなクラウド空間
- プライベートIPアドレス
- VPC <-> オンプレとの接続オプションも多数あります
### CloudHub DNS
1. SLB (共有ロバランサー)
- \<\<appname\>\>.jp-e1.cloudhub.io
2. ワーカー(パブリックIPアドレス)
- **mule-worker-**\<\<appname\>\>.jp-e1.cloudhub.io
3. ワーカー(プライベートIPアドレス)
- **mule-worker-internal**-\<\<appname\>\>.jp-e1.cloudhub.io
### CIDR
A.B.C.D/**E**
`10.0.1.0/32`
32 - 32 = 0
0^2 = 1
`10.0.1.0/24`
32 - 24 = 8
2^8 = **256**
`10.0.1.0/16`
32 - 16 = 16
2^16 = 65536
- 基本は大きめに作る
- 例えば: VPC にデプロイする CloudHub ワーカーの予定数の最大値の 10 倍
- リサイズにはダウンタイムが発生する
- プライベート IP アドレスの数 ≒ 管理できるワーカーの数(厳密には違う: ゼロダウンタイムを実現するブルーグリーンデプロイメントのために、IPアドレスはワーカーの数以上に必要)
- Private アドレスを指定して作るのが基本 (TODO)
- リサイズにはダウンタイムが発生する

参考:[CIDRブロックの決め方(MuleSoft Blog)](https://blogs.mulesoft.com/api-integration/security/how-to-choose-the-cidr-block-for-your-vpc/)
### VPCへのデプロイ
#### backend api
- name: api-backend-01XX
- jar: api-backend-5.5.0-mule-application.jar
- `backend.http.port=18080`
- URL: api-backend-01XX.jp-e1.cloudhub.io
#### proxy api
- name: api-proxy-01XX
- jar: api-proxy-5.5.0-mule-application.jar
- `backend.http.port=18080`
- `backend.http.host=mule-worker-internal-api-backend-01XX.jp-e1.cloudhub.io`
- URL: api-proxy-01XX.jp-e1.cloudhub.io


18080 を解放


### DLB (専用ロードバランサ)

- VPC の中にセットアップ
- Firewallの設定が可能
- IPアドレスの許可リストの設定が可能
- 相互のTLS
- マッピングルール
- {dlnDns}/{app}/
- <lb-name(ロードバランサー名)>.lb.anypointdns.net
- CNAME
- ヴァニティドメインが使用可能
### OpenSSL
Windows: `bin/openssl.exe req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt`
Mac: `oppenssl`
`req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt`
テスト: https://tokyo-dlb-0101.lb.anypointdns.net/dlb-backend-0101/
https://{dlbDns}/<appName>/
:warning: **最後の / を入れないと 404 Not Found になります**
## Module8: 管理タスクの自動化
### Anypoint CLI
https://docs.mulesoft.com/jp/runtime-manager/anypoint-platform-cli
- インタラクティブモード
ユーザーがコマンドを打っていくモード
Anypoint Platform と接続
```anypoint-cli --username=Cloud01Student01 --password=@Mulesoft2020 --organization=Cloud01SubGroup01 --environment=Prod```
//認証情報を渡す
`runtime-mgr cloudhub-alert list` // CH アラートの一覧
`runtime-mgr cloudhub-application list` // CHアプリケーションの一覧
`runtime-mgr cloudhub-application delete hidden-properties-0101` // CHアプリケーションの削除
`use environment Dev` //開発環境に切り替わる
- スクリプティングモード
スクリプトを読み込んでいくモード

- Proxy経由でAnypoint Platformにログイン
- https://docs.mulesoft.com/jp/runtime-manager/anypoint-platform-cli

### Anypoint Platform REST API
https://anypoint.mulesoft.com/exchange/portals/anypoint-platform/
#### API 呼び出しの手順
1. https://anypoint.mulesoft.com/accounts/login に POST リクエストを送信します。
Header
`Content-Type: application/json`
Body
```
{
"username": "REPLACE_HERE!",
"password": "REPLACE_HERE!"
}
```
2. 403 Forbidden 「invalid csrf token」エラーが表示された場合は、Advanced REST Client の _csrf クッキーを削除します。
- Request > Web session > Cookie manager

3. 再度リクエストを送信すると 200 :ok: と access_token が返されます。
```
{
"access_token": "ffacd52c-2c2d-49a6-9c56-845d924db0fb",
"token_type": "bearer",
"redirectUrl": "/home/"
}
```
4. このアクセストークンを Authorization ヘッダーに使用して、 Anypoint Platform API を呼び出すことが可能になります。
例:
GET: `https://anypoint.mulesoft.com/accounts/api/users/me`
Header:`Authorization: Bearer 80566d46-3827-463c-b624-c36bae02d0df`
Access Managemnt API
https://anypoint.mulesoft.com/accounts/api/users/me

#### PostmanのProxy設定

#### Advanced Rest ClientのProxy設定

## Module 9: まとめ
Q: Prod DLBとSandboxのDLBを編集する権限を分けるにはどうすれば良いか?
A: CloudHub Network AdministratorのPremissionでは、Business Group内の権限を分離することができないので、**リソースを分割するためのBusiness Group**を作り、Permissionを割り当てるのが良いです。
将来的な製品の改善のため、機能改善要望を[Ideas Portal](https://help.mulesoft.com/s/ideas)からVoteしていただくこともお勧めです。
- :NG:Permission (CloudHub Network Administrator)を割り当てた状態では、DevもProdも操作できてしまう。


- :NG:CloudHub Admin(Dev)ではアプリのデプロイはできるが、ネットワークは管理できない


- :NG:カスタムRole(CloudHub Admin-Devに、Network AdministratorのPremissionを追加)


- :star:リソース(Environment, VPC, DLB)を分割するためのBusiness Groupを作成

Q: Client ごとに流量が多くなったときにアラートを発報する機能はあるか?
A: 製品付属の機能で、そのまま該当するものはありません。Clientごとのリクエスト数を計測するカスタムポリシーを作成して、ポリシー違反が発生したときにアラートをONにするような設定が必要です。
Q: Object Storeを冗長化することはできるか?
A: アプリケーションのデプロイ時に自動作成される一時データの保管場所なので、ユーザがカスタマイズして構成変更することはできません。
https://help.mulesoft.com/s/article/The-Different-Types-of-Object-Stores-Explained
https://docs.mulesoft.com/jp/object-store/osv2-faq
参考:Forumサイト
https://help.mulesoft.com/s/forum