MuleSoft で B2C Commerce を利用してみる（事前準備編）

※ これから記載する事項は、私が所属する会社とは切関係のない事柄です。


今回は私自身初めてMuleSoftに触れてみました。MuleSoft はかなりドキュメントが豊富で、基礎は公式ドキュメント「[チュートリアル: API ビルドの最初から最後まで](https://docs.mulesoft.com/jp/general/api-led-overview)」を見ればかなりわかりますので、割愛します。
今回の記事では MuleSoft から B2C Commerce を利用してみる前に、基礎を知った上でよくありそうな設定として、設定ファイルを環境で分ける設定、Basic 認証の設定、 HTTPS の設定をやってみたので紹介させていただきます。


## 前提

* 今回自身のローカル環境で使用した Anypoint Studio は Version 7.12.0 を利用しています。
* 設定の方法は複数存在しますが、今回紹介しているのはあくまで一部の方法です



## 目指す API

今回目指す API は `/api/postman/{id}` のフォーマットのエンドポイントに対して任意の JSON オブジェクトと `q` と言うクエリを指定するとその値をレスポンスとして返すものです（最終的にPostman使って確認するので `postman` と言う文言が入っています）。さらに、CloudHub へデプロし、HTTPS で繋げるようにし、Basic 認証をかけるようにします。

#### サンプルリクエスト

```sh
REQUEST: 
POST /api/postman/0001?q=ABC
Host: hogehoge.sample-trial-api.us-e2.cloudhub.io
Authorization: Basic {credential}

REQUEST BODY:
{
  "test": "Test"
}

RESPONSE BODY:
{
  "id": "0001",
  "req": {
    "test": "Test"
  },
  "q": "ABC"
}
```

#### サンプル RAML

```yaml
#%RAML 1.0
title: Sample Trial API
baseUri: http://localhost:8081/api
mediaType:
  - application/json
/postman/{id}:
  post:
    queryParameters:
      q?:
        example: Example
        type: string
    responses:
      "200":
        body:
          application/json:
            properties:
              id:
                example: Example
                type: string
              req:
                type: object
              q:
                example: Example
                type: string
    securedBy: []
    body:
      application/json:
        type: object
securitySchemes:
  SecurityScheme:
    type: Basic Authentication
securedBy: []
```



## API の設定

シンプルなAPIなので、設定は非常にシンプルです。
「Transform Message」モジュールを利用し、下記の [DataWeave 言語](https://docs.mulesoft.com/jp/mule-runtime/4.4/dataweave)を設定するだけです。

```sh
%dw 2.0
output application/json
---
{
    "id": attributes.uriParams.'id',
    "req": payload,
    "q": attributes.queryParams.'q'
}
```


![スクリーンショット 2022-11-17 17.59.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/93187b91-c34f-75cc-8203-180c7b5fe631.png)





## 設定ファイルを環境で分ける

今回は分ける必要はなかったのですが、ローカル環境と開発環境の設定ファイルを出し分けるように設定しました。設定方法は公式ヘルプの「[プロパティの設定](https://docs.mulesoft.com/jp/mule-runtime/4.4/configuring-properties)」「[環境プロパティの設定](https://docs.mulesoft.com/jp/mule-runtime/4.4/deploying-to-multiple-environments)」を参考にしました。

ローカル環境では「local-config.yaml」開発環境では「dev-config.yaml」のプロパティファイルを `src/main/resources` 配下に設置し、利用するようにします。
![スクリーンショット 2022-11-17 18.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/a5c54c55-5895-a447-2f7f-61f33a5e08f4.png)


「env」と言うグローバルプロパティを設定し、値を切り替えることでプロパティファイルを切り替えています。
![スクリーンショット 2022-11-19 13.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/c89fad9f-99df-d0c5-e55f-5ebf279cecf0.png)



ローカルでは画像のように「env」に「local」と言う値が入っています。
![スクリーンショット 2022-11-19 13.14.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/6da736f4-26a1-c8ff-1d8c-67c63db844e5.png)

CloudHub にデプロイした際には管理画面上から「dev」と言う値を設定してあります。
![スクリーンショット 2022-11-19 14.05.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/3f019469-3e0b-cc2a-5bbd-2007f397b50b.png)





## Basic 認証の設定

MuleSoft には[すぐに利用できるポリシー](https://docs.mulesoft.com/jp/api-manager/2.x/policies-policy-categories)が多くあります。この中の「基本認証 - シンプル」を利用して Basic 認証をかけたいと思います。

まずAPI Manager から新しく API を作成します。設定方法の詳細は「[RAML または OAS API プロキシを設定する](https://docs.mulesoft.com/jp/api-manager/2.x/proxy-deploy-raml-oas-proxy#raml-%E3%81%BE%E3%81%9F%E3%81%AF-oas-api-%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)」などを参考にしてください。
今回はCloudHubにすでにデプロイしてある既存のアプリケーションに対して直接繋ぐ（新しくプロキシアプリをデプロイしない）ように画像のような設定を行いました。

![スクリーンショット 2022-11-19 14.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/476df202-22e7-068a-ec75-6ac8cd610b2b.png)





そして作成したAPIに対して「基本認証 - シンプル（Basic Authentication - Simple）」ポリシーを追加します。（追加時にID、パスワードは設定できます）
![スクリーンショット 2022-11-19 15.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/539607e7-46dd-d6b9-3b3a-f6bbf2abaac1.png)

これで完了だと思ったのですが、API 作成後すぐには API Status が「Unregistered」になっており、実際にエンドポイントにアクセスしてもBasic認証はかかってなかったです。どうやら[API 自動検出](https://docs.mulesoft.com/jp/api-manager/2.x/api-auto-discovery-new-concept)の設定をしないといけないようだったので、そちらの設定も紹介します。方法については「[Mule 4 アプリケーションでの API ゲートウェイの API 自動検出の設定](https://docs.mulesoft.com/jp/api-manager/2.x/configure-autodiscovery-4-task)」を参考にしています。

「API Auto-discovery」と言う設定で API ID のところに「apiId」と言う環境変数を設定し、Flow Name には API のルートにあたるフローを設定します。（コンソールにも Basic 認証を効かせたい場合はコンソールのルートにあたるフローに対しても同じ設定を行います。）
![スクリーンショット 2022-11-19 15.37.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/0b38e736-f1d4-8369-ef2c-f36dd33113a8.png)

API Manager から API Instance ID を取得します。

![スクリーンショット 2022-11-19 15.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/b135783e-c8b8-9f58-c1e8-85cc5f765e17.png)


取得した値を設定ファイルに記入します。
![スクリーンショット 2022-11-19 15.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/c43b1683-8e58-0cb9-5d45-47d032585c62.png)




さらにプラットフォームへ接続するための認証の設定をする必要があります。
まず「[環境のログイン情報の取得 (推奨)](https://docs.mulesoft.com/jp/api-manager/2.x/org-credentials-config-mule4#%E7%92%B0%E5%A2%83%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%83%85%E5%A0%B1%E3%81%AE%E5%8F%96%E5%BE%97-%E6%8E%A8%E5%A5%A8)」に従ってクライアントIDとシークレットを取得してください。
その後「[Anypoint Studio 7 でのログイン情報の設定](https://docs.mulesoft.com/jp/api-manager/2.x/org-credentials-config-mule4#anypoint-studio-7-%E3%81%A7%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%83%85%E5%A0%B1%E3%81%AE%E8%A8%AD%E5%AE%9A)」に従ってAnypoint Studioにログイン情報を入力します。

![スクリーンショット 2022-11-19 16.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/2298cd58-e4c7-909d-ab76-389291d97e51.png)






また CloudHub にデプロイする際にも下記のように変数としてログイン情報を入力します。

![スクリーンショット 2022-11-19 14.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/c6628c39-e2c5-7ec1-f4f9-ba6fc537b585.png)




これで実際にサイトにアクセスして Basic 認証がかかっていたら成功です。
![スクリーンショット 2022-11-19 16.08.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/1834a4a7-e385-5a41-1373-f866f4a32ebd.png)





## HTTPS の設定

最後に HTTPS で接続できるようにする設定を行いたいと思います。
今回は「[HTTPS サービスの構築](https://docs.mulesoft.com/jp/mule-runtime/4.4/build-an-https-service)」を参照しながらプロキシを利用せずにアプリケーションに証明書を設定する方法を紹介します。（プロキシを利用して方法は「[HTTPS API プロキシの構築](https://docs.mulesoft.com/jp/api-manager/2.x/building-https-proxy)」を参照してください。）

まず（自己証明書入り） JKS ファイルを下記コマンドで作成します。（作成時に設定したパスワード、エイリアス、ファイル名は後にも利用します。）

```sh
keytool -genkey -keyalg RSA -alias <key-alias> -keystore <keystore-name>.jks
keytool -export -alias <key-alias> -keystore <keystore-name>.jks -file <certificate-name>.cer
```


作成したJKSファイルを `src/main/resources` 配下に設置します。 今回は `keystore` と言うフォルダを新しく作成して、その中に設置しました。
![スクリーンショット 2022-11-19 16.18.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/e96c3daf-a3c5-e5b3-c9e6-c6a394918670.png)




API とコンソールともに利用している HTTP に関する設定ファイルを下記画像のように修正します。
![スクリーンショット 2022-11-19 16.21.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/09a68c82-3068-c96d-05b2-5ee75069b44a.png)

![スクリーンショット 2022-11-19 16.21.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/a4f3dfde-1027-3b78-6046-0aa01c80522d.png)



最後に下記画像のように設定ファイルに値に JKS ファイル作成時に指定したパスワード、エイリアス、ファイル名を追加し、 CloudHub へのデプロイを行います。（ローカル環境の設定ファイルには HTTPS のポート番号も設定する必要があります）

![スクリーンショット 2022-11-19 16.28.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/13c11916-67a9-718b-9e77-1a6e4c3cbf7b.png)




実際にローカルまたはCloudHubにデプロイしたURLにHTTPSでアクセスして表示されていることを確認できれば成功です。
![スクリーンショット 2022-11-19 16.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/86704422-0380-6242-4aec-35732cc14a83.png)




## 自主学習に利用できそうなリソース

* [CodeLab（日本語）](https://codelab-jpn-site.herokuapp.com/index.html)、[CodeLab（英語）](https://mulesoft-labs.dev/)
    * CodeLabは「Salckへメッセージを送る」のようなシチュエーションに合わせた設定・実装方法を画面イメージと共に学べるサイトになっています。
* [Getting Started with Anypoint Platform (Anypoint Platform 入門)](https://training.mulesoft.com/course/getting-started-mule4-japanese)
    * 日本語で講師が教えてくれるトレーニングのコースのようです。
* [公式 MuleSoft ドキュメント](https://docs.mulesoft.com/jp/general/)
* [MuleSoft 資格一覧](https://training.mulesoft.com/certification&utm_source=salesforce&utm_medium=referral&utm_campaign=sfacademy?_ga=2.102458114.2041700472.1668832715-2130152246.1668564812)
* [Trailhead](https://trailhead.salesforce.com/ja/today)