IICS(CAI)のチュートリアルを試してみる(Order Management 後編)

2020.11.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

データアナリティクス事業本部のkobayashiです。

Informatica Intelligent Cloud Services(以降、IICS)はオンプレミスおよびクラウド環境に置かれているデータサービスとアプリケーションサービスを統合するiPaaS(integration Platform as a Service)製品です。

IICSの機能の一つであるInformatica Cloud Application Integration(以降、CAI)ではAPIをGUIの操作で簡単に構築することができます。

前回は顧客が商品を注文しその注文を処理するAPIを途中まで作成しましたので今回はその続きを実施し、APIを完成させます。

作成しているAPIのチュートリアル

前回のおさらい

Informatica Cloud Application Integration - Tutorial:Order Management に記載されている内容を実践しました。

作成しているAPIの特徴は以下の通りです。

  • リクエストの値を取得して後続の処理で扱う
  • 外部APIと連携して値を外部APIに送りそのレスポンスを後続の処理で扱う
  • エラーハンドリングを行う
  • 複数のプロセスを作成し、一方から他方のプロセスをサブロセスとして呼び出す
  • IICSのAPI Managerを使って本番環境でのAPIのデプロイ

エラーハンドルに関しては前々回まででも扱いましたので、新しく行うこととしては「サブプロセス」と「APIのデプロイ」になります。

  • サブプロセス
    • その名の通りプロセス中で他のプロセスを呼び出す仕組みになります。プロセスを再利用できる細かい単位で作成してそれを組み合わせてメインプロセスを作ると言った使い方になります。
  • API Manager
    • CAIで作成したプロセスをAPI化し、公開する機能になります。またAPIのゲートウェイを提供したりAPIの監視や分析を行えます。

また今回作成する最終的なフローになります。

  1. 顧客が注文する
  2. 注文管理プロセス内でインベントリを取得する
  3. 注文プロセス内でマージンと販売コミッションを計算する
  4. 顧客とベンダーに確認メール

の順番でAPIを作成していきます。 前回までで1−3を作成したので続きの「顧客とベンダーに確認メール」を作成するところから始めます。 また、最終的にAPI Managerを使って本番環境でAPIのデプロイを行います。

注文管理プロセスの作成

電子メールを送信する外部APIをサービスコネクタとして登録

Informaticaで用意してくれている電子メールを送信する外部APIをサービスとして登録します。

使うサービスはEmail_Service service を使います。

手順1) サイドメニューから新規を選択するとモーダルが表示されるのでその中からサービスコネクタ>Swaggerからの作成を選択し、作成を押下する。

手順2) サービスコネクタの設定値を入力し次へを押下する。

  • Swagger URL : https://na1.ai.dm-us.informaticacloud.com/active-bpel/rt/Email_Service?swagger を入力
  • 認証の使用 : チェックする
    • ユーザー名: testuser2を入力
    • パスワード: password2#を入力

手順3) サービスコネクタで使用できる操作が表示されるが、特に設定を変更する必要はないので次へを押下してサービスコネクタを作成する。サービスコネクタが作成したあとにパブリッシュを行う。

手順4) 次にプロセスで使うためにサービスコネクタのアプリケーション接続を作成する。これは先の手順で作成したサービスコネクタをどのランタイム環境で実行するのかを設定する。

サイドメニューから新規を選択するとモーダルが表示されるのでその中からアプリケーション接続を選択し、作成を押下します。

手順5) アプリケーション接続の設定値を入力し保存を押下して設定を保存する。アプリケーション接続を作成したあとにこちらもパブリッシュを行う。

  • タイプ : 手順3で作成したサービスコネクタを選択
  • 実行 : 実行したいランタイム環境を選択
  • hostNmae: na1.ai.dm-us.informaticacloud.com:443を入力
  • username: testuser2を入力
  • password: password2#を入力

電子メール送信のプロセスの新規作成

手順1) サイドメニューから新規を選択するとモーダルが表示されるのでその中からプロセスを選択し、作成を押下する。

手順2) プロセスの作成画面デザイナーが表示され開始終了のステップが用意されているのでこれを編集する。

手順3) APIへのアクセス制御を行うために開始を左下から押下する。

*今回は特にアクセス制御をしないため匿名アクセスを許可を選択します。本番で運用する場合は十分な制御を行ってください。この解説は別途エントリで行う予定です。

手順4) リクエストで送られた値を使うので入力フィールドを左下から押下する。リクエストとして受け取りたいフィールドを以下の様に設定する。

名前 タイプ 必須
EmailAddress テキスト チェック
Message テキスト チェック

手順5) 次にプロセス内で使用する変数を指定するために一時フィールドを左下から押下する。

名前 タイプ
EmailDetail  タイプをさらに表示を選択 -> カテゴリ定義された接続タイプを選択 -> 作成したアプリケーション接続を選択 -> Email-Service -> Email_ServiceRequest

手順6) デバッグ用にプロセス処理中のログを全て記録するために詳細を左下から押下し、トレースレベルで詳細を選択する。

手順7)割り当てステップをドラッグ&ドロップする。割り当てのタブを選択してアクションの設定を行う。

フィールド タイプ 開始
EmailDetail > SendTo フィールド EmailAddress
EmailDetail > Message フィールド Message

手順8)サービスステップをドラッグ&ドロップし、電子メール送信を行うアクションを設定する。サービスのタブを選択してアクションの設定を行う。

  • サービスタイプ:接続を選択
  • 接続: 先に設定したEmail-Serviceを選択
  • アクション: Email_ServiceOperationを選択

手順9)入力タブを選択し、bodyフィールド > EmailDetailを選択する。

ここまでで、電子メールを送信するプロセスができました。図の赤枠部分になります。

ではここで作成した電子メールプロセスをメインの注文管理プロセスに追加します。

電子メール送信プロセスをサブプロセスとして注文管理プロセスに追加する

手順1)注文管理プロセスを開き、並列パスステップをドラッグ&ドロップする。

まずは顧客に送る確認メールを送信する設定を行います。

手順2)サブプロセスステップを並列パスから出ている上のパスにドラッグ&ドロップし、サブプロセスタブを選択し、プロセスで電子メール送信プロセスを選択する。

手順3) 送信するメールの内容を設定するために入力フィールドを左下から押下する。

名前
EmailAddress コンテンツ 顧客メールを送りたいメールアドレス
Message 計算式 fn:concat ("Dear ", $input.CustomerName , ". Thanks for ordering.", "Your order ID is: ", $output.OrderID , ". We will deliver your order in 7 days.")

次にベンダーに送る確認メールを送信する設定を行います。

手順4)サブプロセスステップを並列パスから出ている下のパスにドラッグ&ドロップし、サブプロセスタブを選択し、プロセスで電子メール送信プロセスを選択する。

手順5) 送信するメールの内容を設定するために入力フィールドを左下から押下する。

名前
EmailAddress コンテンツ ベンダーメールを送りたいメールアドレス
Message 計算式 fn:concat ("Order has been accepted. The order ID is: ",$output.OrderID , ". Please note below details for your records.", " Overall Profit: ", $output.Calculate_Margin_ServiceResponse[1]/MarginBeforeCommission ,". SalesCommission: ",$output.Calculate_Margin_ServiceResponse[1]/SalesCommission,". Profit after Commission: ", $output.Calculate_Margin_ServiceResponse[1]/MarginAfterCommission )

これで注文管理プロセスに電子メール送信プロセスの追加が終わり全プロセスの完成です。

それでは一度リクエストを送ってレスポンスを受け取ってみます。

curl "https://apne1-cai.dm1-ap.informaticacloud.com:443/active-bpel/public/rt/xxxxxxxxxxxxxxxxxxxxxxxxx/p_order_management?CustomerName=TestConsumer&CustomerEmail=testconsumer@mailinator.com&ItemName=item1&ItemCount=2"

レスポンス

{
  "status": "オーダーを受け付けました。",
  "OrderID": "501576050621657088",
  "ItemPrice": 50.0,
  "OrderPrice": 100.0
}

確認メールも届きます。

この様にレスポンスが返ってくることが確認できます。

別のリクエストとして商品が無い注文のリクエストを送ってみます。

curl "https://apne1-cai.dm1-ap.informaticacloud.com:443/active-bpel/public/rt/xxxxxxxxxxxxxxxxxxxxxxxxx/p_order_management?CustomerName=TestConsumer&CustomerEmail=testconsumer@mailinator.com&ItemName=Newitem1&ItemCount=2"

レスポンス

{
  "error": {
    "code": 500,
    "detail": {
      "reason": "{}",
      "code": "HTTP_400"
    },
    "message": "{}"
  }
}

商品が無いと上のようなレスポンスの内容もエラーの内容となっています。またこの場合は確認メールも届きません。 これに対応するため、注文管理プロセス内でエラーハンドリングをします。

注文管理プロセス内のエラーハンドリングを行う

手順1)注文管理プロセスを開いてgetInventoryDetailを選択し、フォルト処理タブを選択してフォルトの取得をチェックする。

手順2)getInventoryDetailから出ている上のパスに今まで作成したステップをドラッグ&ドロップする。

手順3)下のパスに割り当てステップをドラッグ&ドロップし、割り当てのタブを選択してアクションの設定を行う。

フィールド タイプ 開始
status コンテンツ 在庫がないため注文が行えません。

これでエラーハンドリングができたので先程エラーとなったリクエストを送ってみます。

curl "https://apne1-cai.dm1-ap.informaticacloud.com:443/active-bpel/public/rt/xxxxxxxxxxxxxxxxxxxxxxxxx/p_order_management?CustomerName=TestConsumer&CustomerEmail=testconsumer@mailinator.com&ItemName=Newitem1&ItemCount=2"

レスポンス

{
  "status": "在庫がないため注文が行えません。"
}

先程設定したメッセージがリクエストで返ってくることが確認できます。

本番環境へ注文管理プロセスのAPIをデプロイする

手順1)IICSのメニューからAPI Managerを選択する。

手順2)APIレジストリから注文管理プロセスを選択し、右のメニューから管理対象APIの作成を選択する。

手順3)モーダルが開くのでそのまま作成を押下する。

手順4)管理対象APIの作成が終わると図のようにアクティブとなる事を確認する。

これで本番環境のAPIとしてリクエストを遅れるようになります。APIのエンドポイントは右のメニューを再び選択しURLのコピーを選ぶとAPIのエンドポイントがコピーされるのでこれを使ってリクエストを送ってみます。

curl "https://apne1-apigw.dm1-ap.informaticacloud.com/t/xxxxxxxxxxxxxxxxxxxxxxxxx.com/p_order_management?CustomerName=TestConsumer&CustomerEmail=testconsumer@mailinator.com&ItemName=item1&ItemCount=2"

レスポンス

{
  "status": "オーダーを受け付けました。",
  "OrderID": "501581849683144704",
  "ItemPrice": 50.0,
  "OrderPrice": 100.0
}

確認メールもきちんと届いています。

まとめ

注文管理のAPIを作成することで

  • リクエストの値を取得して後続の処理で扱う
  • 外部APIと連携して値を外部APIに送りそのレスポンスを後続の処理で扱う
  • エラーハンドリングを行う
  • 複数のプロセスを作成し、一方から他方のプロセスをサブロセスとして呼び出す
  • IICSのAPI Managerを使って本番環境でのAPIのデプロイ

を行いました。サブプロセスを使ってプロセスを再利用できる細かい単位で作成してそれを組み合わせてメインプロセスを作ることがCAIを使ってAPIを作るコツになると感じました。

最後まで読んで頂いてありがとうございました。